1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        石墨文檔 Websocket 百萬長(zhǎng)連接技術(shù)實(shí)踐

        共 10571字,需瀏覽 22分鐘

         ·

        2021-11-26 22:42

        1 引言

        在石墨文檔的部分業(yè)務(wù)中,例如文檔分享、評(píng)論、幻燈片演示和文檔表格跟隨等場(chǎng)景,涉及到多客戶端數(shù)據(jù)同步和服務(wù)端批量數(shù)據(jù)推送的需求,一般的 HTTP 協(xié)議無法滿足服務(wù)端主動(dòng) Push 數(shù)據(jù)的場(chǎng)景,因此選擇采用 WebSocket 方案進(jìn)行業(yè)務(wù)開發(fā)。

        隨著石墨文檔業(yè)務(wù)發(fā)展,目前日連接峰值已達(dá)百萬量級(jí),日益增長(zhǎng)的用戶連接數(shù)和不符合目前量級(jí)的架構(gòu)設(shè)計(jì)導(dǎo)致了內(nèi)存和 CPU 使用量急劇增長(zhǎng),因此我們考慮對(duì)網(wǎng)關(guān)進(jìn)行重構(gòu)。

        2 網(wǎng)關(guān) 1.0

        網(wǎng)關(guān) 1.0 是使用 Node.js 基于 Socket.IO 進(jìn)行修改開發(fā)的版本,很好的滿足了當(dāng)時(shí)用戶量級(jí)下的業(yè)務(wù)場(chǎng)景需求。

        2.1 架構(gòu)

        網(wǎng)關(guān) 1.0 版本架構(gòu)設(shè)計(jì)圖:

        網(wǎng)關(guān) 1.0 客戶端連接流程:

        1. 用戶通過 NGINX 連接網(wǎng)關(guān),該操作被業(yè)務(wù)服務(wù)感知;
        2. 業(yè)務(wù)服務(wù)感知到用戶連接后,會(huì)進(jìn)行相關(guān)用戶數(shù)據(jù)查詢,再將消息 Pub 到 Redis;
        3. 網(wǎng)關(guān)服務(wù)通過 Redis Sub 收到消息;
        4. 查詢網(wǎng)關(guān)集群中的用戶會(huì)話數(shù)據(jù),向客戶端進(jìn)行消息推送。

        2.2 痛點(diǎn)

        雖然 1.0 版本的網(wǎng)關(guān)在線上運(yùn)行良好,但是不能很好的支持后續(xù)業(yè)務(wù)的擴(kuò)展,并且有以下幾個(gè)問題需要解決:

        • 資源消耗:Nginx 僅使用 TLS 解密,請(qǐng)求透?jìng)?,產(chǎn)生了大量的資源浪費(fèi),同時(shí)之前的 Node 網(wǎng)關(guān)性能不好,消耗大量的 CPU、內(nèi)存。
        • 維護(hù)與觀測(cè):未接入石墨的監(jiān)控體系,無法和現(xiàn)有監(jiān)控告警聯(lián)通,維護(hù)上存在一定的困難;
        • 業(yè)務(wù)耦合問題:業(yè)務(wù)服務(wù)與網(wǎng)關(guān)功能被集成到了同一個(gè)服務(wù)中,無法針對(duì)業(yè)務(wù)部分性能損耗進(jìn)行針對(duì)性水平擴(kuò)容,為了解決性能問題,以及后續(xù)的模塊擴(kuò)展能力,都需要進(jìn)行服務(wù)解耦。

        3 網(wǎng)關(guān) 2.0

        網(wǎng)關(guān) 2.0 需要解決很多問題:石墨文檔內(nèi)部有很多組件:文檔、表格、幻燈片和表單等等。在 1.0 版本中組件對(duì)網(wǎng)關(guān)的業(yè)務(wù)調(diào)用可以通過:Redis、Kafka 和 HTTP 接口,來源不可查,管控困難。此外,從性能優(yōu)化的角度考慮也需要對(duì)原有服務(wù)進(jìn)行解耦合,將 1.0 版本網(wǎng)關(guān)拆分為網(wǎng)關(guān)功能部分和業(yè)務(wù)處理部分,網(wǎng)關(guān)功能部分為 WS-Gateway:集成用戶鑒權(quán)、TLS 證書驗(yàn)證和 WebSocket 連接管理等;業(yè)務(wù)處理部分為 WS-API:組件服務(wù)直接與該服務(wù)進(jìn)行 gRPC 通信??舍槍?duì)具體的模塊進(jìn)行針對(duì)性擴(kuò)容;服務(wù)重構(gòu)加上 Nginx 移除,整體硬件消耗顯著降低;服務(wù)整合到石墨監(jiān)控體系。

        3.1 整體架構(gòu)

        網(wǎng)關(guān) 2.0 版本架構(gòu)設(shè)計(jì)圖:

        網(wǎng)關(guān) 2.0 客戶端連接流程:

        1. 客戶端與 WS-Gateway 服務(wù)通過握手流程建立 WebSocket 連接;
        2. 連接建立成功后,WS-Gateway 服務(wù)將會(huì)話進(jìn)行節(jié)點(diǎn)存儲(chǔ),將連接信息映射關(guān)系緩存到 Redis 中,并通過 Kafka 向 WS-API 推送客戶端上線消息;
        3. WS-API 通過 Kafka 接收客戶端上線消息及客戶端上行消息;
        4. WS-API 服務(wù)預(yù)處理及組裝消息,包括從 Redis 獲取消息推送的必要數(shù)據(jù),并進(jìn)行完成消息推送的過濾邏輯,然后 Pub 消息到 Kafka;
        5. WS-Gateway 通過 Sub Kafka 來獲取服務(wù)端需要返回的消息,逐個(gè)推送消息至客戶端。

        3.2 握手流程

        網(wǎng)絡(luò)狀態(tài)良好的情況下,完成如下圖所示步驟 1 到步驟 6 之后,直接進(jìn)入 WebSocket 流程;網(wǎng)絡(luò)環(huán)境較差的情況下,WebSocket 的通信模式會(huì)退化成 HTTP 方式,客戶端通過 POST 方式推送消息到服務(wù)端,再通過 GET 長(zhǎng)輪詢的方式從讀取服務(wù)端返回?cái)?shù)據(jù)??蛻舳顺醮握?qǐng)求服務(wù)端連接建立的握手流程:

        1. Client 發(fā)送 GET 請(qǐng)求嘗試建立連接;
        2. Server 返回相關(guān)連接數(shù)據(jù),sid 為本次連接產(chǎn)生的唯一 Socket ID,后續(xù)交互作為憑證;

        {"sid":"xxx","upgrades":["websocket"],"pingInterval":xxx,"pingTimeout":xxx}

        1. Client 攜帶步驟 2 中的 sid 參數(shù)再次請(qǐng)求;
        2. Server 返回 40,表示請(qǐng)求接收成功;
        3. Client 發(fā)送 POST 請(qǐng)求確認(rèn)后期降級(jí)通路情況;
        4. Server 返回 ok,此時(shí)第一階段握手流程完成;
        5. 嘗試發(fā)起 WebSocket 連接,首先進(jìn)行 2probe 和 3probe 的請(qǐng)求響應(yīng),確認(rèn)通信通道暢通后,即可進(jìn)行正常的 WebSocket 通信。

        3.3 TLS 內(nèi)存消耗優(yōu)化

        客戶端與服務(wù)端連接建立采用的 wss 協(xié)議,在 1.0 版本中 TLS 證書掛載在 Nginx 上,HTTPS 握手過程由 Nginx 完成,為了降低 Nginx 的機(jī)器成本,在 2.0 版本中我們將證書掛載到服務(wù)上,通過分析服務(wù)內(nèi)存,如下圖所示,TLS 握手過程中消耗的內(nèi)存占了總內(nèi)存消耗的大概 30% 左右。

        這個(gè)部分的內(nèi)存消耗無法避免,我們有兩個(gè)選擇:

        • 采用七層負(fù)載均衡,在七層負(fù)載上進(jìn)行 TLS 證書掛載,將 TLS 握手過程移交給性能更好的工具完成;
        • 優(yōu)化 Go 對(duì) TLS 握手過程性能,在與業(yè)內(nèi)大佬曹春暉(曹大)的交流中了解到,他最近在 Go 官方庫(kù)提交的 PR https://github.com/golang/go/issues/43563 ,以及相關(guān)的性能測(cè)試數(shù)據(jù) https://github.com/golang/go/pull/48229 。

        3.4 Socket ID 設(shè)計(jì)

        對(duì)每次連接必須產(chǎn)生一個(gè)唯一碼,如果出現(xiàn)重復(fù)會(huì)導(dǎo)致串號(hào),消息混亂推送的問題。選擇 SnowFlake 算法作為唯一碼生成算法。

        物理機(jī)場(chǎng)景中,對(duì)副本所在物理機(jī)進(jìn)行固定編號(hào),即可保證每個(gè)副本上的服務(wù)產(chǎn)生的 Socket ID 是唯一值。

        K8S 場(chǎng)景中,這種方案不可行,于是采用注冊(cè)下發(fā)的方式返回編號(hào),WS-Gateway 所有副本啟動(dòng)后向數(shù)據(jù)庫(kù)寫入服務(wù)的啟動(dòng)信息,獲取副本編號(hào),以此作為參數(shù)作為 SnowFlake 算法的副本編號(hào)進(jìn)行 Socket ID 生產(chǎn),服務(wù)重啟會(huì)繼承之前已有的副本編號(hào),有新版本下發(fā)時(shí)會(huì)根據(jù)自增 ID 下發(fā)新的副本編號(hào)。于此同時(shí),Ws-Gateway 副本會(huì)向數(shù)據(jù)庫(kù)寫入心跳信息,以此作為網(wǎng)關(guān)服務(wù)本身的健康檢查依據(jù)。

        3.5 集群會(huì)話管理方案:事件廣播

        客戶端完成握手流程后,會(huì)話數(shù)據(jù)在當(dāng)前網(wǎng)關(guān)節(jié)點(diǎn)內(nèi)存存儲(chǔ),部分可序列化數(shù)據(jù)存儲(chǔ)到 Redis,存儲(chǔ)結(jié)構(gòu)說明如下:

        說明
        ws:user:clients:${uid}存儲(chǔ)用戶和 WebSocket 連接的關(guān)系,采用有序集合方式存儲(chǔ)
        ws:guid:clients:${guid}存儲(chǔ)文件和 WebSocket 連接的關(guān)系,采用有序結(jié)合方式存儲(chǔ)
        ws:client:${socket.id}存儲(chǔ)當(dāng)前 WebSocket 連接下的全部用戶和文件關(guān)系數(shù)據(jù),采用 Redis Hash 方式進(jìn)行存儲(chǔ),對(duì)應(yīng) key 為 user 和 guid

        由客戶端觸發(fā)或組件服務(wù)觸發(fā)的消息推送,通過 Redis 存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),在 WS-API 服務(wù)查詢到返回消息體的目標(biāo)客戶端的 Socket ID,再有 WS-Gateway 服務(wù)進(jìn)行集群消費(fèi),如果 Socket ID 不在當(dāng)前節(jié)點(diǎn),則需要進(jìn)行節(jié)點(diǎn)與會(huì)話關(guān)系的查詢,找到客端戶 Socket ID 實(shí)際對(duì)應(yīng)的 WS-Gateway 節(jié)點(diǎn),通常有以下兩種方案:


        優(yōu)點(diǎn)缺點(diǎn)
        事件廣播實(shí)現(xiàn)簡(jiǎn)單消息廣播數(shù)量會(huì)隨著節(jié)點(diǎn)數(shù)量上升
        注冊(cè)中心會(huì)話與節(jié)點(diǎn)映射關(guān)系清晰注冊(cè)中心強(qiáng)依賴,額外運(yùn)維成本

        在確定使用事件廣播方式進(jìn)行網(wǎng)關(guān)節(jié)點(diǎn)間的消息傳遞后,進(jìn)一步選擇使用哪種具體的消息中間件,列舉了三種待選的方案:

        特性RedisKafkaRocketMQ
        開發(fā)語(yǔ)言CScalaJava
        單機(jī)吞吐量10w+10w+10w+
        可用性主從架構(gòu)分布式架構(gòu)分布式架構(gòu)
        特點(diǎn)功能簡(jiǎn)單吞吐量、可用性極高功能豐富、定制化強(qiáng),吞吐量、可用性高
        功能特性數(shù)據(jù) 10K 以內(nèi)性能優(yōu)異,功能簡(jiǎn)單,適用于簡(jiǎn)單業(yè)務(wù)場(chǎng)景支持核心的 MQ 功能,不支持消息查詢或消息回溯等功能支持核心的 MQ 功能,擴(kuò)展性強(qiáng)

        于是對(duì) Redis 和其他 MQ 中間件進(jìn)行 100w 次的入隊(duì)和出隊(duì)操作,在測(cè)試過程中發(fā)現(xiàn)在數(shù)據(jù)小于 10K 時(shí) Redis 性能表現(xiàn)十分優(yōu)秀,進(jìn)一步結(jié)合實(shí)際情況:廣播內(nèi)容的數(shù)據(jù)量大小在 1K 左右,業(yè)務(wù)場(chǎng)景簡(jiǎn)單固定,并且要兼容歷史業(yè)務(wù)邏輯,最后選擇了 Redis 進(jìn)行消息廣播。

        后續(xù)還可以將 WS-API 與 WS-Gateway 兩兩互聯(lián),使用 gRPC stream 雙向流通信節(jié)省內(nèi)網(wǎng)流量。

        3.6 心跳機(jī)制

        會(huì)話在節(jié)點(diǎn)內(nèi)存與 Redis 中存儲(chǔ)后,客戶端需要通過心跳上報(bào)持續(xù)更新會(huì)話時(shí)間戳,客戶端按照服務(wù)端下發(fā)的周期進(jìn)行心跳上報(bào),上報(bào)時(shí)間戳首先在內(nèi)存進(jìn)行更新,然后再通過另外的周期進(jìn)行 Redis 同步,避免大量客戶端同時(shí)進(jìn)行心跳上報(bào)對(duì) Redis 產(chǎn)生壓力。

        1. 客戶端建立 WebSocket 連接成功后,服務(wù)端下發(fā)心跳上報(bào)參數(shù);
        2. 客戶端依據(jù)以上參數(shù)進(jìn)行心跳包傳輸,服務(wù)端收到心跳后會(huì)更新會(huì)話時(shí)間戳;
        3. 客戶端其他上行數(shù)據(jù)都會(huì)觸發(fā)對(duì)應(yīng)會(huì)話時(shí)間戳更新;
        4. 服務(wù)端定時(shí)清理超時(shí)會(huì)話,執(zhí)行主動(dòng)關(guān)閉流程;
        5. 通過 Redis 更新的時(shí)間戳數(shù)據(jù)進(jìn)行 WebSocket 連接、用戶和文件之間的關(guān)系進(jìn)行清理。會(huì)話數(shù)據(jù)內(nèi)存以及 Redis 緩存清理邏輯:
        for?{
        ???select?{
        ???case?<-t.C:
        ??????var?now?=?time.Now().Unix()
        ??????var?clients?=?make([]*Connection,?0)
        ??????dispatcher.clients.Range(func(_,?v?interface{})?bool?{
        ?????????client?:=?v.(*Connection)
        ?????????lastTs?:=?atomic.LoadInt64(&client.LastMessageTS)
        ?????????if?now-lastTs?>?int64(expireTime)?{
        ????????????clients?=?append(clients,?client)
        ?????????}?else?{
        ????????????dispatcher.clearRedisMapping(client.Id,?client.Uid,?lastTs,?clearTimeout)
        ?????????}
        ?????????return?true
        ??????})
        ??????for?_,?cli?:=?range?clients?{
        ?????????cli.WsClose()
        ??????}
        ???}
        }

        在已有的兩級(jí)緩存刷新機(jī)制上,進(jìn)一步通過動(dòng)態(tài)心跳上報(bào)頻率的方式降低心跳上報(bào)產(chǎn)生的服務(wù)端性能壓力,默認(rèn)場(chǎng)景中客戶端對(duì)服務(wù)端進(jìn)行間隔 1s 的心跳上報(bào),假設(shè)目前單機(jī)承載了 50w 的連接數(shù),當(dāng)前的 QPS 為:QPS1 = 500000/1

        從服務(wù)端性能優(yōu)化的角度考慮,實(shí)現(xiàn)心跳正常情況下的動(dòng)態(tài)間隔,每 x 次正常心跳上報(bào),心跳間隔增加 a,增加上限為 y,動(dòng)態(tài) QPS 最小值為:QPS2=500000/y

        極限情況下,心跳產(chǎn)生的 QPS 降低 y 倍。在單次心跳超時(shí)后服務(wù)端立刻將 a 值變?yōu)?1s 進(jìn)行重試。采用以上策略,在保證連接質(zhì)量的同時(shí),降低心跳對(duì)服務(wù)端產(chǎn)生的性能損耗。

        3.7 自定義 Headers

        使用 Kafka 自定義 Headers 的目的是避免網(wǎng)關(guān)層出現(xiàn)對(duì)消息體解碼而帶來的性能損耗,客戶端 WebSocket 連接建立成功后,會(huì)進(jìn)行一系列的業(yè)務(wù)操作,我們選擇將 WS-Gateway 和 WS-API 之間的操作指令和必要的參數(shù)放到 Kafka 的 Headers 中,例如通過 X-XX-Operator 為廣播,再讀取 X-XX-Guid 文件編號(hào),對(duì)該文件內(nèi)的所有用戶進(jìn)行消息推送。

        字段說明描述
        X-IDWebSocket ID連接 ID
        X-Uid用戶 ID用戶 ID
        X-Guid文件 ID文件 ID
        X-Inner網(wǎng)關(guān)內(nèi)部操作指令用戶加入、用戶退出
        X-Event網(wǎng)關(guān)事件Connect/Message/Disconnect
        X-Locale語(yǔ)言類型設(shè)置語(yǔ)言類型設(shè)置
        X-Operatorapi 層操作指令單播、廣播、網(wǎng)關(guān)內(nèi)部操作
        X-Auth-Type用戶鑒權(quán)類型SDKV2、主站、微信、移動(dòng)端、桌面
        X-Client-Version客戶端版本客戶端版本
        X-Server-Version網(wǎng)關(guān)版本服務(wù)端版本
        X-Push-Client-ID客戶端 ID客戶端 ID
        X-Trace-ID鏈路 ID鏈路 ID

        在 Kafka Headers 中寫入了 trace id 和 時(shí)間戳,可以追中某條消息的完整消費(fèi)鏈路以及各階段的時(shí)間消耗。

        3.8 消息接收與發(fā)送

        type?Packet?struct?{
        ??...
        }

        type?Connect?struct?{
        ??*websocket.Con
        ??send?chan?Packet
        }

        func?NewConnect(conn?net.Conn)?*Connect?{
        ??c?:=?&Connect{
        ????send:?make(chan?Packet,?N),
        ??}
        ??go?c.reader()
        ??go?c.writer()
        ??return?c
        }

        客戶端與服務(wù)端的消息交互第一版的寫法類似以上寫法,對(duì) Demo 進(jìn)行壓測(cè),發(fā)現(xiàn)每個(gè) WebSocket 連接都會(huì)占用 3 個(gè) goroutine,每個(gè) goroutine 都需要內(nèi)存棧,單機(jī)承載連十分有限,主要受制于大量的內(nèi)存占用,而且大部分時(shí)間 c.writer() 是閑置狀態(tài),于是考慮,是否只啟用 2 個(gè) goroutine 來完成交互。

        type?Packet?struct?{
        ??...
        }

        type?Connect?struct?{
        ??*websocket.Conn
        ??mux?sync.RWMutex
        }

        func?NewConnect(conn?net.Conn)?*Connect?{
        ??c?:=?&Connect{
        ????send:?make(chan?Packet,?N),
        ??}
        ??go?c.reader()
        ??return?c
        }

        func?(c?*Connect)?Write(data?[]byte)?(err?error)?{
        ???c.mux.Lock()
        ???defer?c.mux.Unlock()
        ???...
        ???return?nil
        }

        保留 c.reader() 的 goroutine,如果使用輪詢方式從緩沖區(qū)讀取數(shù)據(jù),可能會(huì)產(chǎn)生讀取延遲或者鎖的問題,c.writer() 操作調(diào)整為主動(dòng)調(diào)用,不采用啟動(dòng) goroutine 持續(xù)監(jiān)聽,降低內(nèi)存消耗。

        調(diào)研了 gev 和 gnet 等基于事件驅(qū)動(dòng)的輕量級(jí)高性能網(wǎng)絡(luò)庫(kù),實(shí)測(cè)發(fā)現(xiàn)在大量連接場(chǎng)景下可能產(chǎn)生的消息延遲的問題,所以沒有在生產(chǎn)環(huán)境下使用。

        3.9 核心對(duì)象緩存

        確定數(shù)據(jù)接收與發(fā)送邏輯后,網(wǎng)關(guān)部分的核心對(duì)象為 Connection 對(duì)象,圍繞 Connection 進(jìn)行了 run、read、write、close 等函數(shù)的開發(fā)。使用 sync.pool 來緩存該對(duì)象,減輕 GC 壓力,創(chuàng)建連接時(shí),通過對(duì)象資源池獲取 Connection 對(duì)象,生命周期結(jié)束之后,重置 Connection 對(duì)象后 Put 回資源池。在實(shí)際編碼中,建議封裝 GetConn()、PutConn() 函數(shù),收斂數(shù)據(jù)初始化、對(duì)象重置等操作。

        var?ConnectionPool?=?sync.Pool{
        ???New:?func()?interface{}?{
        ??????return?&Connection{}
        ???},
        }

        func?GetConn()?*Connection?{
        ???cli?:=?ConnectionPool.Get().(*Connection)
        ???return?cli
        }

        func?PutConn(cli?*Connection)?{
        ???cli.Reset()
        ???ConnectionPool.Put(cli)?//?放回連接池
        }

        3.10 數(shù)據(jù)傳輸過程優(yōu)化

        消息流轉(zhuǎn)過程中,需要考慮消息體的傳輸效率優(yōu)化,采用 MessagePack 對(duì)消息體進(jìn)行序列化,壓縮消息體大小。調(diào)整 MTU 值避免出現(xiàn)分包情況,定義 a 為探測(cè)包大小,通過如下指令,對(duì)目標(biāo)服務(wù) ip 進(jìn)行 MTU 極限值探測(cè)。

        ?ping -s {a} {ip}

        a = 1400 時(shí),實(shí)際傳輸包大小為:1428。其中 28 由 8(ICMP 回顯請(qǐng)求和回顯應(yīng)答報(bào)文格式)和 20(IP 首部)構(gòu)成。如果 a 設(shè)置過大會(huì)導(dǎo)致應(yīng)答超時(shí),在實(shí)際環(huán)境包大小超過該值時(shí)會(huì)出現(xiàn)分包的情況。在調(diào)試合適的 MTU 值的同時(shí)通過 MessagePack 對(duì)消息體進(jìn)行序列號(hào),進(jìn)一步壓縮數(shù)據(jù)包的大小,并減小 CPU 的消耗。

        3.11 基礎(chǔ)設(shè)施支持

        使用 EGO 框架( https://github.com/gotomicro/ego )進(jìn)行服務(wù)開發(fā):業(yè)務(wù)日志打印,異步日志輸出,動(dòng)態(tài)日志級(jí)別調(diào)整等功能,方便線上問題排查提升日志打印效率;微服務(wù)監(jiān)控體系,CPU、P99、內(nèi)存、goroutine 等監(jiān)控。客戶端 Redis 監(jiān)控:

        客戶端 Kafka 監(jiān)控:

        自定義監(jiān)控大盤:

        4 性能壓測(cè)

        4.1 壓測(cè)準(zhǔn)備

        • 選擇一臺(tái)配置為 4 核 8G 的虛擬機(jī),作為服務(wù)機(jī),目標(biāo)承載 48w 連接;
        • 選擇八臺(tái)配置為 4 核 8G 的虛擬機(jī),作為客戶機(jī),每臺(tái)客戶機(jī)開放 6w 個(gè)端口。

        4.2 場(chǎng)景一

        用戶上線,50w 在線用戶。

        服務(wù)CPUMemory數(shù)量CPU%Mem%
        WS-Gateway16 核32G1 臺(tái)22.38%70.59%

        單個(gè) WS-Gateway 每秒建立連接數(shù)峰值為:1.6w 個(gè)/s,每個(gè)用戶占用內(nèi)存:47K。

        4.3 場(chǎng)景二

        測(cè)試時(shí)間 15 分鐘,在線用戶 50w,每 5s 推送一條所有用戶,用戶有回執(zhí)。推送內(nèi)容為:

        42["message",{"type":"xx","data":{"type":"xx","clients":[{"id":xx,"name":"xx","email":"[email protected]","avatar":"ZgG5kEjCkT6mZla6.png","created_at":1623811084000,"name_pinyin":"","team_id":13,"team_role":"member","merged_into":0,"team_time":1623811084000,"mobile":"+xxxx","mobile_account":"","status":1,"has_password":true,"team":null,"membership":null,"is_seat":true,"team_role_enum":3,"register_time":1623811084000,"alias":"","type":"anoymous"}],"userCount":1,"from":"ws"}}]

        測(cè)試經(jīng)過 5 分鐘后,服務(wù)異常重啟,重啟原因是內(nèi)存使用量到超過限制。

        分析內(nèi)存超過限制的原因:

        新增的廣播代碼用掉了 9.32% 的內(nèi)存。

        接收用戶回執(zhí)消息的部分消耗了 10.38% 的內(nèi)存。

        進(jìn)行測(cè)試規(guī)則調(diào)整,測(cè)試時(shí)間 15 分鐘,在線用戶 48w,每 5s 推送一條所有用戶,用戶有回執(zhí)。推送內(nèi)容為:

        42["message",{"type":"xx","data":{"type":"xx","clients":[{"id":xx,"name":"xx","email":"[email protected]","avatar":"ZgG5kEjCkT6mZla6.png","created_at":1623811084000,"name_pinyin":"","team_id":13,"team_role":"member","merged_into":0,"team_time":1623811084000,"mobile":"+xxxx","mobile_account":"","status":1,"has_password":true,"team":null,"membership":null,"is_seat":true,"team_role_enum":3,"register_time":1623811084000,"alias":"","type":"anoymous"}],"userCount":1,"from":"ws"}}]

        服務(wù)CPUMemory數(shù)量CPU%Mem%
        WS-Gateway16 核32G1 臺(tái)44%91.75%

        連接數(shù)建立峰值:1w 個(gè)/s,接收數(shù)據(jù)峰值:9.6w 條/s,發(fā)送數(shù)據(jù)峰值 9.6w 條/s。

        4.4 場(chǎng)景三

        測(cè)試時(shí)間 15 分鐘,在線用戶 50w,每 5s 推送一條所有用戶,用戶無需回執(zhí)。推送內(nèi)容為:

        42["message",{"type":"xx","data":{"type":"xx","clients":[{"id":xx,"name":"xx","email":"[email protected]","avatar":"ZgG5kEjCkT6mZla6.png","created_at":1623811084000,"name_pinyin":"","team_id":13,"team_role":"member","merged_into":0,"team_time":1623811084000,"mobile":"+xxxx","mobile_account":"","status":1,"has_password":true,"team":null,"membership":null,"is_seat":true,"team_role_enum":3,"register_time":1623811084000,"alias":"","type":"anoymous"}],"userCount":1,"from":"ws"}}]

        服務(wù)CPUMemory數(shù)量CPU%Mem%
        WS-Gateway16 核32G1 臺(tái)30%93%

        連接數(shù)建立峰值:1.1w 個(gè)/s,發(fā)送數(shù)據(jù)峰值 10w 條/s,出內(nèi)存占用過高之外,其他沒有異常情況。內(nèi)存消耗極高,分析火焰圖,大部分消耗在定時(shí) 5s 進(jìn)行廣播的操作上。

        4.5 場(chǎng)景四

        測(cè)試時(shí)間 15 分鐘,在線用戶 50w,每 5s 推送一條所有用戶,用戶有回執(zhí)。每秒 4w 用戶上下線。推送內(nèi)容為:

        42["message",{"type":"xx","data":{"type":"xx","clients":[{"id":xx,"name":"xx","email":"[email protected]","avatar":"ZgG5kEjCkT6mZla6.png","created_at":1623811084000,"name_pinyin":"","team_id":13,"team_role":"member","merged_into":0,"team_time":1623811084000,"mobile":"+xxxx","mobile_account":"","status":1,"has_password":true,"team":null,"membership":null,"is_seat":true,"team_role_enum":3,"register_time":1623811084000,"alias":"","type":"anoymous"}],"userCount":1,"from":"ws"}}]

        服務(wù)CPUMemory數(shù)量CPU%Mem%
        WS-Gateway16 核32G1 臺(tái)46.96%65.6%

        連接數(shù)建立峰值:18570 個(gè)/s,接收數(shù)據(jù)峰值:329949 條/s,發(fā)送數(shù)據(jù)峰值 393542 條/s,未出現(xiàn)異常情況。

        4.6 壓測(cè)總結(jié)

        在 16C 32G 內(nèi)存的硬件條件下,單機(jī) 50w 連接數(shù),進(jìn)行以上包括用戶上下線、消息回執(zhí)等四個(gè)場(chǎng)景的壓測(cè),內(nèi)存和 CPU 消耗都符合預(yù)期,并且在較長(zhǎng)時(shí)間的壓測(cè)下,服務(wù)也很穩(wěn)定。滿足目前量級(jí)下的資源節(jié)約要求,可在此基礎(chǔ)上繼續(xù)完善功能開發(fā)。

        5 總結(jié)

        面臨日益增加的用戶量,網(wǎng)關(guān)服務(wù)的重構(gòu)是勢(shì)在必行,本次重構(gòu)主要是:

        • 對(duì)網(wǎng)關(guān)服務(wù)與業(yè)務(wù)服務(wù)的解耦,移除對(duì) Nginx 的依賴,讓整體架構(gòu)更加清晰。
        • 從用戶建立連接到底層業(yè)務(wù)推送消息的整體流程分析,對(duì)其中這些流程進(jìn)行了具體的優(yōu)化。以下各個(gè)方面讓 2.0 版本的網(wǎng)關(guān)有了更少的資源消耗,更低的單位用戶內(nèi)存損耗、更加完善的監(jiān)控報(bào)警體系,讓網(wǎng)關(guān)服務(wù)本身更加可靠:
          • 可降級(jí)的握手流程;
          • Socket ID 生產(chǎn);
          • 客戶端心跳處理過程的優(yōu)化;
          • 自定義 Headers 避免了消息解碼,強(qiáng)化了鏈路追蹤與監(jiān)控;
          • 消息的接收與發(fā)送代碼結(jié)構(gòu)設(shè)計(jì)上的優(yōu)化;
          • 對(duì)象資源池的使用,使用緩存降低 GC 頻率;
          • 消息體的序列化壓縮;
          • 接入服務(wù)觀測(cè)基礎(chǔ)設(shè)施,保證服務(wù)穩(wěn)定性。
        • 在保證網(wǎng)關(guān)服務(wù)性能過關(guān)的同時(shí),更進(jìn)一步的是收斂底層組件服務(wù)對(duì)網(wǎng)關(guān)業(yè)務(wù)調(diào)用的方式,從以前的 HTTP、Redis、Kafka 等方式,統(tǒng)一為 gRPC 調(diào)用,保證了來源可查可控,為后續(xù)業(yè)務(wù)接入打下了更好的基礎(chǔ)。

        6 技術(shù)鏈接


        石墨專注于重塑辦公文檔領(lǐng)域,打造出國(guó)產(chǎn)企業(yè)級(jí)云端 Office 辦公軟件。助力企業(yè)效能充分釋放,打通數(shù)字化轉(zhuǎn)型最后一公里。北京時(shí)間 12 月 1 日 14:00,????石墨文檔全新 ToB 子品牌「石墨辦公」將重磅發(fā)布 ??,預(yù)約參會(huì)有機(jī)會(huì)獲得神秘大禮,敬請(qǐng)參與!


        瀏覽 60
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            嘿嘿午夜影院| 囯产精品久久久久久久久久辛辛| 人妻japanesewoman| 亚洲综合伊人| 成人性爱自拍| 久久中文字幕人妻| 无码久| 91高清在线| 成人av网站在线播放| 影音先锋AV成人| 欧美一级免费视频| 亚洲av网站在线观看| 日韩AV中文字幕在线播放| 亚洲综合中文字幕在线| 最新国产在线| 18禁日韩| 欧美午夜精品一区二区蜜桃| 亚洲免费视频在线看| 91三级片网站| 人妻无码不卡| 丰满少妇在线观看网站| 一区二区AV| 亚洲va综合va国产va中文| 美女插插| 一本久久综合亚洲鲁鲁五月天| 国产性猛交╳XXX乱大交| 国产精品三级视频| 免费一级做a爱片毛片A片小说| 99久久久| 久久av一区| 久久永久免费| 欧美日韩大香蕉| 无码一区二区三区在线| 国产曰韩欧美综合另类在线| 91香蕉视频在线看| 国产免费www| 天天色AV| 美女天天操| 欧美日韩在线观看一区| 日韩中文字幕专区| 亚洲毛片在线| 操逼网站免费| 香蕉av在线| 88在线无码精品秘入口九色 | 2024无码| AV婷婷五月天| 中文在线永久免费观看| 国产三级毛片| 免费观看成人毛片A片直播千姿| 天天干天天日| 中文字幕乱码亚州无线码日韩理论电 | 中文字幕日韩视频| 国产激情无码| 国产美女被爽到高潮免费A片软件| 天天草天天撸| 在线观看黄网| 人人人操| 天堂视频在线观看亚洲美女| 牛牛精品视频| 91成人片| 欧美污视频在线观看| 国产一级婬片A片AAA樱花| 欧美在线视频99| 1024大香蕉| 蜜臀久久99精品久久久兰草影视| 影音先锋麻豆| 国产伦精品一区二区三区色大师| 蜜臀AV在线播放| 成人三级电影在线观看| 亚洲第一黄色| 亚洲AV无码成人片在线| 青青操网| 在线观看日韩三级片av| 少妇高潮日韩| 大香蕉看片| 特级丰满少妇免费观看| 成人免费黄色网| 一区高清无码| 伊人久久大香色综合久久| 亚洲无码激情视频| 在线免费看AV| 国产香蕉视频免费| 熟女AV888| 插进去综合网| 无码一区二区黑人猛烈视频网站| 91福利导航| 91国产福利| 精品一区二区三区视频| 亚洲天堂中文字幕| 成人色色| 亚洲色图综合| 91视频福利| 北条麻妃网站| 无码av亚洲一区二区毛片公司| 欧美亚洲视频在线观看| 综合五月| 欧美日韩综合| 国产亚洲日韩在线| 成人视频123| 自拍视频一区| 人妻无码中文字幕免费视频蜜桃| 成人精品一区二区三区电影| 日日爱爱| 天堂中文8资源在线8| 久久久穴| 色骚爽大香蕉91| 中文字幕北条麻妃在线| 亚洲成人免费| 亚洲黄色视频免费观看| 99青草| 日韩视频在线观看一区| 麻豆国产精品一区| 亚洲激情综合视频| 一本一道AV| 中国极品少妇XXX| 男女国产网站| 欧美操B在线| 男女拍拍免费视频| 中文字幕你懂的在线三级| 日韩专区在线观看| 在线看A片| 少妇高潮在线| 视频一区在线观看| 亚洲成人性爱视频| 久久精品99久久久久久久久| 国产三级网址| 亚洲欧洲有码在线| 男人的天堂色婷婷| 中文字幕高清无码免费视频| 国产精品成人免费久久黄AV片| 天堂无码视频| 一级特黄色片| 无码人妻日韩精品一区二区三| 国产理论片在线观看| 成人做爱免费网站| 日韩啪| 无码网站内射| 日本a级视频| 九色丨蝌蚪丨老版熟女| www.婷婷五月天| 荫蒂添的高潮免费视频| 黄色片在线播放| 波多野结衣无码在线视频| 女人的天堂AV在线观看| 人成免费在线视频| 88海外华人免费一区| 国产美女全裸网站| 大香蕉在线播| 亚洲日本在线观看| 日韩免费AV电影| 底流量AV电影在线| 亚洲欧洲免费| 中文字幕无码免费| 黄色大片在线免费观看| 中文字幕有码在线看| 美女视频一区二区三区| 日韩欧美成人视频| www.日本黄色| 日本三级无码| 91丨九色丨蝌蚪丨丝袜| 成人做爱免费看| 91九色在线观看| 人人看,人人摸| 91在线观看18| 欧美一级特黄A片免费看| 青青操天天干| 中文字幕精品在线| 最新无码在线| 日韩一级网| 成人精品在线视频| 国产午夜激情视频| 日韩不卡精品| 毛片A片| 在线观看视频国产| 奇米影视av| 天堂中文网| 免费观看高清无码| 成人国产AV网站| 久久久噜噜噜久久中文字幕色伊伊| 国产精品无码免费| 欧美性之站| 五月丁香激情视频| HEYZO少婦AV無碼精品| 操你啦无码日韩| 色婷婷激情| 一区二区经典| 大香蕉伊人成人| 国产精品福利小视频| 日B视频网站| 欧美日韩一区二区三区| 美女91视频| 欧美黄色免费在线观看| 欧美一级夜夜爽| 国产91精品看黄网站在线观看| 免费在线观看一区| 天天干天天操综合| 97国产在线视频| www.99国产| 国产一级性爱| 欧美一在线一综合| 高清无码视频在线播放| 在线小黄片| 五月天成人导航| www.青青草视频| 欧美性猛交XXXX乱大交蜜桃| 不卡的一区二区| 精品国产精品国产精品国产网站| 亚洲无码动漫| 免费操逼视频在线观看| 日韩五码在线| 中文无码毛片| 国产P片内射天涯海角| 在线观看国产黄色| 在线观看污网站| 国产av播放| 欧美日韩高清一区| 国产视频久久| 男人的天堂2019| 狠狠干天天干| 亚洲中文无码电影| 国产亚洲综合无码| 亚洲一区无码| 国内自拍第一页| 91在线免费视频观看| 91最新地址| a片网站在线观看| 亚洲精品一区中文字幕乱码| 欧美综合网| 欧美三P囗交做爰XXXⅩ| 天天日夜夜添| 91人妻人人澡人人爽人妻| 天天色操| 天堂中文8资源在线8| 国产三级国产三级国产普通话| 婷婷久久综合久色综| 一级内射视频| 激情综合网五月| 青青草在线观看视频| 色哟哟一区二区三区四区| 九九精品12| 日韩一区二区三区四区| 九九色影院| 国产乱子伦视频国产印度| 在线免费观看视频黄| 天天看天天爽| 在线观看中文字幕一区| 无码专区av| 国产精品无码永久免费A片| 99成人| 成人av无码| 精品国产黄色| 大香蕉国产精品视频| 免费中文字幕av| 欧美一级内射| 中文字幕+乱码+中文乱码电影| 中文字幕av第一页| 日韩美女免费视频| 欧美特黄一级视频| 天天天日天天天天天天天日歌词| 欧美一级A片在免费看| igao在线观看| 大香蕉福利在线| 日韩中文久久| 精品无码一区二区三区四区久久久软件| 国产天堂| 亚洲AV成人无码精在线| 人人操碰| 午夜无码av| 日逼网站免费观看| 亚洲精品成人视频| 四虎av在线| 91乱子伦国产乱| 亚洲www在线观看| 91丝袜一区二区三区| 日本人妻在线视频| 青在线视频| 国产激情视频在线观看| 免费无码视频在线观看| 91大片| 69视频网站| 日本少妇高潮| 久草福利在线视频| www.超碰在线| 91人妻人人操人人爽| 成人免费网站| 国产精品1| 久久伊| 农村A片婬片AAA毛片| 玖玖成人| 久草在线| 波多野吉衣视频| 国产91在线中日| 先锋影音资源站av每日资源在线| 国产日皮| 色色色91| 亚洲无码人妻一区| 正在播放无码| 欧美精品网| 久久久永久免费视频| 在线观看18s| 国产区在线| 亲子伦视频一区二区三区| 亚洲成人Av| 无卡无码| 国产福利在线观看| 一级爱爱免费视频| 在线观看高清无码| 蜜臀AV一区二区三区免费看| 激情久久五月天| 52妺嘿嘿午夜福利在线| 久久无码人妻精品一区二区三区| 国产69AV| 人人操人人模| 日韩在线视频一区二区三区 | 操b视频免费| 三级片无码在线| 在线男人天堂| 黄色视频在线观| 欧美成人精品欧美一级私黄| jiujiuav| 久久久天堂国产精品女人| 国产一级操逼| 蜜乳av红桃嫩久久| 欧美一级成人| 男女啊啊啊| 国产色无码网站www色视频| 91视频一区二区三区| 国产精品9999| 国产伦子伦一级A片免费看老牛| 亚洲五月天色| 日韩一级片免费看| 亚洲小视频在线| 青青av| 99久久精品一区二区成人| 国产精品人人人人| 亚洲激情欧美| 色色a| 日韩在线一区二区| 亚洲1234区| 男人V天堂| 97色色超碰| 三级片中文字幕| 欧美,日韩,日| 免费观看成人片| 国产又爽又黄A片| 日韩免费看| 日韩无码一级| 日本亚洲欧洲免费| 男人的天堂网页| 国产视频一区二区三区四区五区 | 波多野结衣久久中文字幕| 黄色成人视频| www.在线播放| 丁香婷婷综合网| 911精品国产一区二区在线| 久久久福利| 体内射精免费视频| H网站在线观看| 欧美搡BBBB搡BBB| 热热av| 久久伊人春色| 人人人人人人操| av手机版| 18禁网址| 国产69视频在线观看| 免费肏逼视频| 91蜜臀| 一级片国产| 九九香蕉视频| 亚洲AV无码乱码精品| av电影在线免费观看| 可以免费观看的av| 中文字幕在线免费观看视频| 欧美性爱免费在线视频| 中文资源在线a中文| 黄色福利在线观看| 日本精品乱伦| 五月天丁香花| 亚洲精品日韩无码| 中文字幕五月久久婷婷| 福利无码| 国产第一页在线观看| 干干影院| 国产小视频在线播放| 北条麻妃无码在线观看| 亚洲天堂一区在线观看| 亚洲无码AV在线播放| www.青青草视频| 看免费黄色视频| 天天av天天av天天爽| 蜜臀av一区| 老熟妇一区二区三区啪啪| 神马午夜福利视频| 激情五月天色色| 拍真实国产伦偷精品| 思思久久高颜值| 少妇A片| 日韩激情| 欧美一区二区三区系列电影| 日韩伊人| 操www| 亚洲欧洲免费| 欧美www| 77久久| 亚洲天堂中文字幕| 亚洲手机在线播放| 欧美一级黄色电影| 嫩BBB槡BBBB槡BBBB二一| 狠狠天天| 亚洲1234区| 开心老牛熟| 日韩在线一区二区| 秋霞福利影院| 乱子伦国产精品| 免费av播放| 欧美日韩三区| 久久思热国产| 一卡二卡无码| 天天干在线观看视频| 免费黄片视频在线观看| 国产成人精品a视频| JlZZJLZZ亚洲美女18| 亚洲免费清高| 91青青草在线| 香蕉婷婷亚洲丁香| 天天日狠狠操| 美国一级A片草草视频| 国产一級A片免费看| 国产乱妇无码毛片A片在线看下载 日韩电影免费在线观看中文字幕 欧美性爱中文字幕 | 免费A级毛片在线播放不收费| 国产精品嫩草久久久久yw193| 中文字幕一区二区6页| 国产AV无码影院| 成人无码动漫A片| 午夜理论在线| 亚洲精品午夜精品| 国产区在线视频| 91乱子伦国产乱子伦| 欧美乱伦内射| 日韩操逼片| 亚洲激情无码视频| 精品国产va久久久久久| 91高清在线| 综合插插| 成人久久视频| 五月丁香亚洲综合| 高清无码一区二区三区四区| 欧美+日韩+国产+成人+在线| 爱爱一区| 成人黄色无码视频| 国产精品国产自产拍高清AV| 欧美一卡| 国产剧情自拍| 欧美熟妇精品黑人巨大一二三区| 黄色片一级片| 日日av| 青娱乐网站| 亚洲成人精品| 国产福利免费| 欧美精品在线免费观看| 欧美日韩一二三区| 青青草大香蕉伊人| 爆乳一区二区三区AV| 日韩无码不卡视频| 3级片网站| 亚洲电影av| 午夜传媒一区二区三区| 伊人网在线播放| 国产一级AV片| 中国老熟女2老女人| 一级片日韩| 亚洲男人天堂视频| 福利黄色片:片| 久久国产劲爆∧v内射| 夜夜骚av.一区二区三区四区| 天天影视综合网免费观看电视剧国产 | 91一区二区| 口爆吞精在线| 伊人大香焦网| 自拍偷拍第一页| 黄A网站| 日皮视频网站| 亚洲高清视频在线| 自拍偷拍15p| igao在线观看| 五月婷婷在线观看| 在线中文字幕AV| 五月天激情av| 色情欧美一级A片| 国产成人视频免费观看| 国产在线观看你懂的| 搞AV网| 九色在线观看| 免费三级毛片| 亚洲日韩网站| 人人妻人人爱| 亚洲人妻在线观看| 亚洲无码av在线观看| 久久久精品久久| 国产又爽又黄免费视频免费| 亚洲精品国产精品国自产网站| 人妻公日日澡久久久| 国产激情综合| 免费黄色三级片| 91美女在线视频| 欧美h网站| 亚洲色视频| 91禁樱桃在线| av一级| 激情五月天激情网| 精品一区二区三区蜜桃臀www| 内射无码专区久久亚洲| 亚洲激情欧美| 日韩美在线| 亚洲国产成人va| 亚洲色情电影| 国产熟妇婬乱A片免费看牛牛| 开心五月激情网| 超碰在线观看免费版| 日韩中文字| 国产无码高潮在线| 再深点好爽灬轻点久久国产| 亚洲第一成年人网站| 亚洲国产成人在线| 少妇高潮视频| 91精品视频在线播放| 成年人视频在线免费观看| 丰满熟妇人妻无码视频| 成人黄色视频网| 色青草影院久久综合| 在线一区二区三区四区| 国产精品成人影视| 青青草原黄色视频| 中文字幕精品一级A片| 久久av一区| 神马Aⅴ| 尤物视频网址| 国产激情| 99久久99久久| 婷婷五月开心五月| 九九亚洲精品| 日本特黄一级片| 欧美日韩国产不卡视频| 欧美精产国品一二三区| 久久久久久精| 青青草在线播放| 人人看人人爱| 久久成人网豆花视频| 欧美不卡在线观看| 婷婷日逼| 国产乱婬AV片免费| 国产精品秘入口18禁网站| 啪啪啪啪网站| 影音先锋麻豆| 九九热精品视频在线观看| 成人免费视频国产免费麻豆,| 福利网址| 老女人网站| av无码精品一区| 亚洲色涩| 全国男人的天堂网站| 97精品人妻一区二区三区香蕉农| 精品无套| 久草视频免费在线观看| 亚洲AV成人无码久久精品麻豆| 成人伊人大香蕉| 熟练中出-波多野结衣| 九九碰九九爱97超碰| 青青草手机在线观看| 性生活无码| 六月激情网| 中国特级毛片| 欧美日韩中文字幕视频| 91久久久久久久久久久久18| 亚洲一区二区视频在线观看 | 国产精品果冻传媒| 999日本不卡影院| 色情欧美一级A片| 国产777| 在线观看国产| 九九色综合| 国产成人亚洲日韩| 波多野结衣无码高清| 日韩欧美在线播放| 久久精品国产视频| 人善交精品一区二区三区| a网站在线观看| 北条麻妃无码视频在线观看| 亚洲成人视屏| 成人黄色一级片| 91人妻人人操人人爽| 亚洲无码福利视频| 大香蕉中文| 在线黄网| 日韩aaa| 超级碰碰碰碰碰碰碰碰碰| 综合色国产精品欧美在线观看| 大吊妞| 婷婷激情五月综合| 无码不卡一区| 91麻豆国产在线| 欧亚一区二区| 欧美成人三级片| 日韩精品丰满无码一级A片∴| 天堂网亚洲| a片视频网站| A片免费在线播放| 一区二区三区四区在线播放| 成全在线观看高清的| 亚洲精品一区二区三| 青青青视频在线| 精品二区| 日韩经典视频在线播放| 夜夜爽日日爽| 国产极品无码| 中文人妻无码| 国产五月天婷婷| 亚洲欧美成人在线观看| 亚洲第五页| 国产AV中文字幕| 最好看的2019中文在线大全电影| 欧美性国产| 国产女人18毛片水真多18| 99视频在线免费播放| 日本黄色免费在线观看| 亚洲AV成人无码AV小说| 亚洲欧美激情小说| 91麻豆精品传媒国产| www.狠狠操| 一本一道vs波多野结衣| 婷婷激情中文字幕| 大香蕉啪啪啪啪| 福利导航视频| wwwa片| av东方在线| 国产亚洲日韩在线| 亚洲精品高清无码| 亚洲高清在线观看| 亚洲日韩网站在线观看| 色片免费| 91蜜桃在线观看| 中文字幕精品在线观看| 国内操逼视频| 国产精品久久久久国产A级| 热re99久久精品国产99热| 亚洲天堂在线看| 中文有码在线| 69av在线播放| 亚洲精品97| 高潮喷水无码| 人妻丝袜无码视频专区| 亚洲,制服,综合,中文| 日韩群交| 日本一区二区视频在线观看| 人人天天爽| 三上悠亚无码破解69XXX| 久久艹视频| 毛片一区| 黄色网址在线观看视频| 激情无码一区二区三区| 日本中文在线观看| 中国字幕在线观看韩国电影| 91青青草| 91丨熟女丨露脸| 国产精品porn| 免费操逼视频网站| 国产精品怡红院有限公司| 国产精品成人免费| 日韩一级黄色毛片| 无码一区在线观看| 国产精品视频一区二区三区在线观看 | 免费在线观看无码| 熟女18p| 逼特逼| AV老鸭窝| 日日夜夜AV| 婷婷亚洲综合| 亚欧黄色| 欧洲成人在线观看| 东方AV在线观看| 成人国产片女人爽到高潮| 伊人伊人网| 青青草在线播放| 91大铭哥| 欧美做受高潮白| 爱搞搞视频| 韩国中文字幕HD久久| 国产91麻豆视频| 男人的天堂手机在线| 三级国产| 日日爱网| 久久久久无码精品国产91福利| 午夜无码视频| 野花Av| 日韩激情片| 亚洲草逼视频| 狠狠躁日日躁夜夜躁A片男男视频 精品无码一区二区三区蜜桃李宗瑞 | 懂色av一区蜜桃| 亚洲福利免费观看| 欧美sese| 国产一级在线免费观看| 婷婷五月天色色| 狠狠狠狠狠| 荫蒂添的高潮免费视频| 国产aⅴ激情无码久久久无码| 超碰青娱乐| 免费在线观看AV片| 成人网| 超碰在线免费播放| 123好逼网| 丰臀肥逼高清视频电影播放| 国产精品日韩高清北条麻衣| 亚洲精品国产精品国自产在线| 国产午夜福利免费视频在线观看| 麻豆三级片在线观看| 肏亚洲美女| 骚骚肥肥一区二区三区| 色九| 国产高清黑人| jizz在线观看| 日产久久久| 天天肏天天肏| 撸一撸成人在线做爱视频。| 国产男人天堂| 精品无码人妻| www黄色在线观看| 99热这里只有精品99| 在线免费观看成人网站| 亚洲无码在线播放| 国产3p露脸普通话对白| 国产精品av在线| 国产精品久久久久久最猛| 人人草人人摸人人看| 欧美精品在线观看| 免费无码国产在线55| 日韩视频一区| 男女啪啪国产| 无码高清在线观看| 亚欧洲精品在线视频| 日逼网址| 欧美囗交大荫蒂免费| 操逼一区| 真人无码| 懂色在线精品分类视频| 思思在线视频| 欧美性爱一级视频| 国产无套免费网站69| 日韩无码黄色片| 一二三区视频| 亚洲AVwww| 99久久婷婷国产综合精品漫| 成人国产精品免费观看| 国产日韩欧美一区| 特级毛片av| 日韩人妻在线视频| 四川少妇bbb| 亚洲成人无码电影| 久天堂| 蜜桃视频在线观看18| 老婆被黑人杂交呻吟视频| 国产精品久久久久久亚洲毛片| 欧美网站在线观看| 大香蕉啪啪啪啪| 亚洲免费一区二区| 亚洲无码久久网| 成人啪啪视频| 一级黄色录像视频| 中文字幕1| 国产成人高清无码| 欧美精品久| 国产精品内射婷婷一级二| 精品国产va久久久久久久| 人人狠狠综合婷婷| 亚洲无码高清视频在线| 超碰免费视| 无码一区二区三区免费| 91丨九色丨国产在线| 国产一区二区三区成人| 日韩va中文字幕无码免费| 91视频在线观看免费大全| 少妇做爱视频| 超碰人人在线观看| 爽爽午国产浪潮AV性色www| 成人在线视频免费| 国产理论在线| 另类老妇奶性BBWBBw| 色色大香蕉| 国产精品人人| 丁香六月婷婷| 国产三级午夜理伦三级| 黄色片AA| 蜜桃黄片AV在线观看| 婷婷五月天网址| 懂色av懂色av粉嫩av| 国产午夜男女性爱| 亚洲国产色情| 最近中文字幕在线观看| 波多野结衣久久| 日韩欧美午夜成人无码| 大地av| 丁香婷婷久久久综合精品国产| 日韩一级无码视频| 欧美黑人大吊| 在线不卡中文字幕| 天天日天天干天天射| 午夜性爱网站| 日本黄色A片免费看| 99久久爱re热6在播放| 日韩国产高清无码| 亚洲免费观看高清完整版在va线观看 | 欧美+日韩+国产+成人+在线| 麻豆av人人乐| 亚洲五月婷| 国产精品99视频| 久久久无码AV| 三级无码| 久久久久久亚洲AV无码专区| 国产黄色视频在线看| 开心五月色婷婷综合开心网| 亚洲色婷婷| 波多野在线视频| 亚洲日韩在线看| 亚洲AV无码乱码AV| 亚洲狠狠操| 亚洲黄色小视频| 高清中文字幕在线A片| 久久三级片电影| 免费在线观看AV| 日韩AV免费看| 三级黄色视频在线观看| 97性爱视频| 影音先锋av在线资源站| 91狠狠综合久久久| 久久无码高清| 2025中文字幕在线| 人人操天天干| 国产精品国内自产拍| 一级免费视频| 91蝌蚪网| 久久99久久99| 青青草原在线视频免费观看| 在线观看免费高清无码| 免费看欧美日黄片| 爱爱视频日本| 北京熟妇槡BBBB槡BBBB| 99热国产在线观看| 日韩在线成人中文字幕亚洲| 精品AV国产| 欧美淫秽视频| 97超碰免费| 怡红院男人的天堂| 日本五十路熟女视频| 一级黄色视频免费观看| 天天射天天日天天干| 青青草大香蕉在线| 91搞一搞| 精品视频在线播放| 成人在线中文字幕| 国产精彩视频| 久久精品99久久久久久| 国产精品无码中文在线| 九色91PORNY国产| 99r6热只有精品免费观看| 久久机热| 中文字幕久久无码| 日本黄色小视频| 91人人在线| 青娱乐av在线| 黄色视频在线免费观看网站| 日韩中文无码电影| 一级A片久久久免费直播间| 精品欧美激情精品一区| 小日本91在线观看| 内射网站| 成人一级A片| 无码人妻一区二区三区| 欧美国产激情| 一本色道久久综合无码欧美| 授乳奶水x88MAV| 亚洲在线高清| 自拍偷拍网址| 强开小嫩苞一区二区三区网站| 亚洲AV无码成人精品区久| 91在线视频免费播放| 久操久操久操| 国产福利合集| 欧美色图亚洲另类| 人妻人人干| 97操逼网| 福利老湿69| 99亚洲欲妇| 日韩五月婷婷| 日韩精品成人AV| 丰满少妇一级片| 久草资源视频| 欧美九九九九| 少妇搡BBBB搡BBB搡毛片| 国产午夜影视| 亚洲日韩欧美国产| 人妻在线无码|