国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

石墨文檔是如何通過 WebSocket 實現(xiàn)百萬長連接的?

共 17791字,需瀏覽 36分鐘

 ·

2022-02-19 01:04

點擊上方 前端Q,關注公眾號

回復加群,加入前端Q技術交流群

「作者:杜旻翔」infoq.cn/article/GymHAbqVRO214qo44jHD

Web 服務端推送技術經(jīng)過了長輪詢、短輪詢的發(fā)展,最終到 HTML5 標準帶來的 WebSocket 規(guī)范逐步成為了目前業(yè)內(nèi)主流技術方案。它使得消息推送、消息通知等功能的實現(xiàn)變得異常簡單,那么百萬級別連接下的 Websocket 網(wǎng)關該如何實踐呢?本文整理自石墨文檔資深工程師杜旻翔根據(jù)石墨 Websocket 重構的實踐經(jīng)驗。

1 引言

在石墨文檔的業(yè)務中,如文檔分享、評論、幻燈片演示和文檔表格跟隨等場景,涉及多客戶端數(shù)據(jù)同步和服務端批量數(shù)據(jù)推送的需求,采用短輪詢或長輪詢的方式無法很好的滿足服務端消息推送、消息通知的業(yè)務場景,因此選擇業(yè)內(nèi)的主流方案:基于 HTML5 標準定義的 WebSocket 規(guī)范。

隨著石墨文檔的發(fā)展,現(xiàn)在日連接峰值達到了百萬量級,日益增長的用戶連接數(shù)和停止更新的架構設計導致了內(nèi)存和 CPU 使用量急劇增長,因此我們考慮對網(wǎng)關進行重構,以適應發(fā)展需求。

2 網(wǎng)關 1.0

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

2.1 架構

網(wǎng)關 1.0 版本架構設計圖:

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

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

2.2 痛點

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

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

3 網(wǎng)關 2.0

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

3.1 整體架構

網(wǎng)關 2.0 版本架構設計圖:

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

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

3.2 握手流程

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

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

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

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

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

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

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

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

3.4 Socket ID 設計

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

物理機場景中,對副本所在物理機進行固定編號,即可保證每個副本上的服務產(chǎn)生的 Socket ID 是唯一值。

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

3.5 集群會話管理方案:事件廣播

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

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

由客戶端觸發(fā)或組件服務觸發(fā)的消息推送,通過 Redis 存儲的數(shù)據(jù)結構,在 WS-API 服務查詢到返回消息體的目標客戶端的 Socket ID,再有 WS-Gateway 服務進行集群消費,如果 Socket ID 不在當前節(jié)點,則需要進行節(jié)點與會話關系的查詢,找到客端戶 Socket ID 實際對應的 WS-Gateway 節(jié)點,通常有以下兩種方案:


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

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

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

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

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

3.6 心跳機制

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

  1. 客戶端建立 WebSocket 連接成功后,服務端下發(fā)心跳上報參數(shù);
  2. 客戶端依據(jù)以上參數(shù)進行心跳包傳輸,服務端收到心跳后會更新會話時間戳;
  3. 客戶端其他上行數(shù)據(jù)都會觸發(fā)對應會話時間戳更新;
  4. 服務端定時清理超時會話,執(zhí)行主動關閉流程;
  5. 通過 Redis 更新的時間戳數(shù)據(jù)進行 WebSocket 連接、用戶和文件之間的關系進行清理。會話數(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()
      }
   }
}

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

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

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

3.7 自定義 Headers

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

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

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

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
}

客戶端與服務端的消息交互第一版的寫法類似以上寫法,對 Demo 進行壓測,發(fā)現(xiàn)每個 WebSocket 連接都會占用 3 個 goroutine,每個 goroutine 都需要內(nèi)存棧,單機承載連十分有限,主要受制于大量的內(nèi)存占用,而且大部分時間 c.writer() 是閑置狀態(tài),于是考慮,是否只啟用 2 個 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ù),可能會產(chǎn)生讀取延遲或者鎖的問題,c.writer() 操作調整為主動調用,不采用啟動 goroutine 持續(xù)監(jiān)聽,降低內(nèi)存消耗。

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

3.9 核心對象緩存

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

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)化

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

 ping -s {a} {ip}

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

3.11 基礎設施支持

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

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

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

4 性能壓測

4.1 壓測準備

  • 選擇一臺配置為 4 核 8G 的虛擬機,作為服務機,目標承載 48w 連接;
  • 選擇八臺配置為 4 核 8G 的虛擬機,作為客戶機,每臺客戶機開放 6w 個端口。

4.2 場景一

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

服務 CPU Memory 數(shù)量 CPU% Mem%
WS-Gateway 16 核 32G 1 臺 22.38% 70.59%

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

4.3 場景二

測試時間 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"}}]

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

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

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

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

進行測試規(guī)則調整,測試時間 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"}}]

服務 CPU Memory 數(shù)量 CPU% Mem%
WS-Gateway 16 核 32G 1 臺 44% 91.75%

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

4.4 場景三

測試時間 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"}}]

服務 CPU Memory 數(shù)量 CPU% Mem%
WS-Gateway 16 核 32G 1 臺 30% 93%

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

4.5 場景四

測試時間 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"}}]

服務 CPU Memory 數(shù)量 CPU% Mem%
WS-Gateway 16 核 32G 1 臺 46.96% 65.6%

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

4.6 壓測總結

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

5 總結

面臨日益增加的用戶量,網(wǎng)關服務的重構是勢在必行,本次重構主要是:

  • 對網(wǎng)關服務與業(yè)務服務的解耦,移除對 Nginx 的依賴,讓整體架構更加清晰。

  • 從用戶建立連接到底層業(yè)務推送消息的整體流程分析,對其中這些流程進行了具體的優(yōu)化。以下各個方面讓 2.0 版本的網(wǎng)關有了更少的資源消耗,更低的單位用戶內(nèi)存損耗、更加完善的監(jiān)控報警體系,讓網(wǎng)關服務本身更加可靠:


    • 可降級的握手流程;
    • Socket ID 生產(chǎn);
    • 客戶端心跳處理過程的優(yōu)化;
    • 自定義 Headers 避免了消息解碼,強化了鏈路追蹤與監(jiān)控;
    • 消息的接收與發(fā)送代碼結構設計上的優(yōu)化;
    • 對象資源池的使用,使用緩存降低 GC 頻率;
    • 消息體的序列化壓縮;
    • 接入服務觀測基礎設施,保證服務穩(wěn)定性。
  • 在保證網(wǎng)關服務性能過關的同時,更進一步的是收斂底層組件服務對網(wǎng)關業(yè)務調用的方式,從以前的 HTTP、Redis、Kafka 等方式,統(tǒng)一為 gRPC 調用,保證了來源可查可控,為后續(xù)業(yè)務接入打下了更好的基礎。

6 Q&A

收錄了部分文章相關內(nèi)容的討論問題:

6.1 SocketID 存在的價值

問題:按照我的理解 socketID 存在的價值是 Kafka 的消費者需要根據(jù) socketID 找到對應的tcp 鏈接,既然你們已經(jīng)有了自定義網(wǎng)關,那么引入 kafka 的意義是什么?消息的持久化?為什么不在網(wǎng)關層做負載均衡,讓節(jié)點直接跟客戶端通信。另外我猜測消費發(fā)送者需要根據(jù) socketId 做 hash 然后發(fā)送到對應的 partition,一旦初始 partition 過小,進行擴容時,客戶端和服務端都得進行重啟或則升級,不知道引入 kafka 的意義在哪里,相反還極大的增加了架構的復雜度和維護成本,擴展性也沒那么好,如果是 http 短鏈接還能理解。

回答:圖中沒畫出 SLB,是有負載均衡的。我們沒有采用 socket id hash 到對應 partition,kafka 的作用是在處理網(wǎng)關內(nèi)部的不需要關心順序和推送消息的流轉,如果沒有kafka,那么組件或者網(wǎng)關滾動更新,用戶重連的過程中,就可能丟消息;對于需要順序的消息,例如 ping pong 模式的是可以通過網(wǎng)關識別到 header 頭里的 cmd 信息,找到對應后端,分發(fā)消息。

6.2 Redis 進行消息廣播的作用

問題:廣播內(nèi)容的數(shù)據(jù)量大小在 1K 左右,業(yè)務場景簡單固定,并且要兼容歷史業(yè)務邏輯,最后選擇了 Redis 進行消息廣播。api 與網(wǎng)關交互不是通過 kafka 嗎,這里是什么意思呢?

回答:網(wǎng)關節(jié)點對 kafka 的消費是集群模式。如果 kafka,在 k8s 條件下,使用廣播模式比較麻煩。所以老的網(wǎng)關是用 redis 做 pub/sub 的廣播,為了兼容老的邏輯仍然采用 redis 做廣播。同時后續(xù)我們打算直接將 api 和 ws 做兩兩互聯(lián),通過 grpc stream 做廣播,有更好的擴展性。

7 技術鏈接

  • 微服務框架:https://github.com/gotomicro/ego
  • Kafka、Redis、MySQL 客戶端監(jiān)控 SDK:https://github.com/gotomicro/ego-component
聲明:文章著作權歸作者所有,如有侵權,請聯(lián)系小編刪除。



往期推薦


大廠面試官:我理想中的前端
對話Svelte未來,Rust 編譯器?構建大型應用?
收藏!史上最全 Vue 前端代碼風格指南

最后


  • 歡迎加我微信,拉你進技術群,長期交流學習...

  • 歡迎關注「前端Q」,認真學前端,做個專業(yè)的技術人...

點個在看支持我吧
瀏覽 39
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 影音先锋成人网| 亚洲电影免费观看| 日本一区二区三区免费看| 久久精品中文字幕| 91亚洲精品在线| 黄色大片免费在线观看| 一区二区三区在线观看免费| 免费三级怡红院| 3DAV一区二区三区动漫| 欧美国产日韩综合在线观看170| 青青草在线视频免费观看| 在线观看99| 午夜福利成人网站| 精品无码视频在线| 一级黄色电影免费在线观看| 国产精品2025| 国产欧美欧洲| 综合色国产精品欧美在线| 啪啪免费网站| 热久久久久| 成人性爱在线| 国产成人无码精品久在线观看 | 在线免费黄片| 安徽扫搡BBBB揉BBBB| av无码中文字幕| 蜜桃视频在线入口www| 欧洲美一区二区三区亚洲| 超碰九色| 在线看v片| 国产熟妇搡BBBB搡BBBB搡| 欧美日韩一区二区三区在线电影| 色欲影视插综合一区二区三区| 亚洲天堂成人| 久久99精品视频| 亚洲欧美日韩一区二区| 最近中文字幕mv第三季歌词| 亚洲午夜精品视频| 谁有毛片网址| 国产成人精品无码区在线| 男人操女人免费网站| 狠狠做深爱婷婷久久综合一区 | 污污污污污www网站免费民国| AV大香蕉| 波多野结衣一区二区三区| 69AV在线观看| 成人a毛片| 黄网免费在线观看| 黄色AV天堂| 黄色视频网站在线观看免费| 亚洲高清无码在线播放| 亚洲AV无码乱码国产精品蜜芽| 欧美国产三级| 日皮在线观看| 成年人在线观看视频网站| 亚洲中文字幕视频在线| 二区不卡| 亚洲无码视频看看| 大地影视中文第三页最新在线观看| 欧美性爱XXXX黑人XYX性爽| 欧美国产精品一区二区三区| 亲孑伦XXXⅹ熟女| 欧美在线A片| 日韩三级视频在线观看| 91丨九色丨蝌蚪丨对白| 中文字幕精品久久久久人妻红杏Ⅰ | 9久9久9久9久女女女女| 欧美三p| 欧美插菊花综合网| 青娱乐成人电影| 婷婷五月丁香在线| 日韩色情网| 日韩欧美亚洲一区二区三区| 中文字幕AV网| 久久艹伊人| 荫蒂添到高潮免费视频| 久久久激情| 自拍偷拍激情视频| 国产亚洲精品久久久久久桃色| 91三级片网站| 精品777| 91丨国产丨白浆| 91九色蝌蚪91POR成人| 一级黄色A片视频| 九九九九九精品| 久久99精品国产.久久久久久| 伊人黄色视频| 黄页视频网站| 一级大片免费看| 精品动漫一区二区三区| 午夜综合在线| 大鷄巴成人A片视频| 大香蕉a片| 女生操逼网站| 欧美午夜黄片| 爱爱视频h| 欧美精品人妻| 国产免费一区二区| 97人妻无码一区二区| 五月天性爱| 91视频免费网站| 蜜臀久久99精品久久久老牛影视| a√天堂中文8| 国产激情在线| 亚洲av成人网| 日韩中文久久| 国产91麻豆视频| 日韩中文字幕一区二区| 无码人妻AV一区| 男人的天堂久久| 翔田千里无码AV在线观看| 怡春院院成人免费视频| 亚洲无吗在线观看| 婷婷无码在线| 天天肏夜夜肏| 一区二区高清视频| 成人久久电影| 91综合在线| 91麻豆大奶巨乳一区白虎| 人人爱人人妻人人操| 无码一区二区av| 444444在线观看免费高清电视剧木瓜一 | 吴梦梦一区二区三区| 女公务员人妻呻吟求饶| 思思热在线视频精品| 潮喷AV| 亚洲精品在线视频观看| 国产A片网站| 中文字幕av第一页| 国产成人高清无码| 亚洲操b| 久久av一区二区三区| 东京热综合| 青青草五月天色婷婷丁香| 水果派成人播放无码| 吴梦梦一区二区在线观看| 大学生18一19GAY169| 蜜臀精品色无码蜜臀AV| 欧美熟妇一区二区三区| 免费中文字幕av| 第四色激情网| 成人小说在线观看| 成人做爰A片一区二区| 欧美日韩中国操逼打炮| 可以免费观看的AV| 久久国产精彩视频| av牛牛| 特级欧美AAAAAA| 日韩有码电影| 国产乱子伦一区二区三精品| 爱搞搞就要搞| 黄色3A片在线观看| 免费看黄片视频| 久久青青操| 亚洲aⅤ| 大茄子熟女AV导航| 少婦揉BBBB揉BBBB揉| wwwxx国产| 色噜噜一区二区三区| 69AV视频在线观看| 在线中文无码| 激情六月天| 少妇人妻偷人精品无码视频新浪| 91美女操逼视频| 午夜美女福利视频| 中文字幕在线中文| 91成人导航| 三级网址在线观看| 亚洲无码在线观看视频| 欧美三级在线观看视频| 在桌下含她的花蒂和舌头H视频| 国产成人午夜精品无码区久久麻豆| 日韩毛片中文字幕| 热99| 丁香五月少妇| 亚洲一区无码在线观看| 操逼视频一级| 国产精品无码ThePorn| 久久久久亚洲AV成人网人人软件| 色婷婷欧美在线播放内射| 欧美怡红院视频| 99免费小视频| 亚洲区中文字幕| 欧美高清一级| 亚洲操色| 日韩国产中文字幕| 欧美一区二区三区在线| 一区二区精品视频| 色婷在线视频| 特级西西人体WWWWW| 怡红院男人天堂| 蜜桃视频一区二区三区| 午夜福利sw| 国产一级片内射| 国产AV久久| 国精品91无码一区二区三区在线| 免费AV成人| 伊人久久久久久久久久久| 国产乱伦毛片| 超碰九九| www.超碰| 精品视频久久久久久| 蜜芽成人精品久久久视频| 逼特逼视频在线| 久久中文视频| 怡红影院美乳| 毛片小电影| 天码人妻一区二区三区在线看| 国产一级片免费观看| 影音先锋成人电影| 中文字幕亚洲中文字幕| 91丨九色丨熟女泻火| 乱子伦国产精品视频| 在线观看黄色片| 色婷婷官网| 欧美成人手机在线看片| 97精品人人妻人人| 国内久久| 五月婷婷俺也去| 久久er99| 一级a一级a爱片免费视频| 国产成人片| 老熟女--91XX| 老熟妇搡BBBB搡BBBB| 午夜性福利| 日本精品电影| 波多野结衣与黑人| 日韩怡春院| 操人妻视频| 大地资源第三页在线观看免费播放最新 | 91麻豆福利在线观看| 色999亚洲人成色| 人人草大香蕉| 亭亭五月天| 欧美成人精品A片免费一区99 | 色综合999| 毛多水多丰满女人A片| 大乳奶一级婬片A片| 午夜福利av电影| www.豆花视频成人版| 91在线视频精品| 亚洲成人免费福利| 91精品视频网| 久久99精品久久久水蜜桃| 欧美在线观看视频| 无码在线专区| 最新中文字幕免费MV第一季歌词 | 黄视频免费在线观看| 777国产盗摄偷窥精品0000| 黄片大全在线免费观看| 操屄视频在线观看| 国产人妻人伦精品一区| 亚洲三级电影在线观看| 亚洲综合免费观看高清完整版 | 人妻综合第一页| caopeng97| 激情乱伦视频| 一区二区av在线| 91黄色在线观看| 啪啪啪啪网站| 欧洲a视频| 午夜福利免费| 黄色成人网站在线观看| 成人免费AV| 99免费在线观看视频| 欧美成人午夜无码A片秀色直播| jzzijzzij亚洲成熟少妇在线观看 九色蝌蚪9l视频蝌蚪9l视频成人熟妇 | 一级少女免费播放电视剧韩剧TV| 国产一级片免费观看| 99视频精品视频| 久草国产在线视频| 激情性爱五月天| 北条麻妃精品青青久久价格| 青草青草视频| 蜜臀色欲AV无码人妻| 国产1区在线观看| 久久亚洲综合| 日韩三级电影| 超碰免费人人| 特级西西44www无码| 日本少妇高清视频| www.五月天| 高清无码免费在线| 午夜成人精品一区二区三区| 在线观看污网站| 色婷婷av| 色欧美视频| 大香蕉在线网| 男女视频网站在线观看| 亚洲成人影片在线观看| 亚洲精品综合| 91久久婷婷亚洲精品成人| 一区二区三区高清| 91香蕉国产成人App| av资源在线看| 99在线精品视频| 国产精品在线看| 亚洲色欲色欲www在线成人网| 亚洲中文自拍| 2025AV在线| 久久三级| 日韩AV无码一区二区| av电影在线观看| 热久久视频| 日韩黄片免费看| 4虎亚洲人成人网www| 91麻豆福利| 成人网视频| 欧美二区视频| 粉粉嫩嫩的18虎白女| 天堂久久av| 亚洲精品一区二区三区新线路| 中文字幕av在线| 日韩无码视屏| 18XXX亚洲HD护士JD| 人人爽人人爽人人| 老鸭窝在线观看视频| 日本在线不卡一区| 黄色AV网| 日韩中文字| 国产嫩苞又嫩又紧AV在线| 免费黄色成人网站| 色婷婷国产精品视频| 日本乱伦视频| 免费国产精品视频| 色天堂网| 午夜无码久久| 免费高潮视频| 中文字幕高清视频| 九九热在线精品| 第四色网站| a免费观看| 麻豆MD传媒MD0071| 成人免费视频一区二区| 日本欧美操| 熟妇一区二区| 久久三级片| 老太色HD色老太HD-百度| 中文字幕在线第一页| 免费高清无码| 亚洲第一福利视频| 中文字幕免费无码| 国产乱国产乱老熟300部视频 | 天天色视频| 久久夜夜操| 精品蜜桃一区二区三区| 久久国产一区| 伊人网在线播放| 日本成人电影一区二区三区 | 欧美99在线| 日本操b| 久久日韩视频| 国产夫妻精品| 好逼123| 亚洲视频免费在线| 操逼资源| 亚洲五月婷| 亚洲日韩在线a成| 日韩福利电影| 国产高清无码免费在线观看| 俺也去在线视频| 成年人免费毛片| 爱搞搞就搞搞| 1000部毛片A片免费视频| 一级操逼| 色综合久久久| 日韩中文字幕在线观看| 成人中文字幕在线观看| 玖玖爱AV| 久草国产精品| 淫色综合| 久久精品9| 国产剧情一区二区| 在线中文字幕av| 亚洲三级在线免费观看| 内射少妇18| 波多野59部无码喷潮| 欧美色小说| 欧美性爱69| 成人视频欧美| 日本伊人大香蕉| 欧美51精品| BBW老熟女BBw| 五月天婷婷无码| 9999久久久久| 日本免费在线视频| 91在线无码精品国产三年| 欧美成人免费电影| 一级片AA| 欧美成人自拍| 国产淫荡视频| 51无码| 无码视频在线看| 求毛片网址| 天堂在线中文字幕| 先锋资源日韩| 欧美黄片在线| 亚洲成人精品一区二区| 中文AV第一页| 欧美丰满老熟妇XXXXX性| 亚洲精品日韩综合观看成人91| 国产亚洲欧美在线| 中文字幕超清在线观看| 色999网址| 69色综合| 97色情| 亚洲无码视频播放| 久久国产精品免费视频| 91人妻一区二区| 激情五月天色| 人妻人操| 视频一区在线观看| 亚洲精品久久久久avwww潮水| 黄网91| 亚洲精品免费观看| 操操操av| 成人毛片在线播放免费| 2025AV天堂网| 精品无码免费视频| 一级AA片| 极品久久| 无码AV天堂| 亚洲影音先锋| 尤物91| 日韩日日操| 麻豆人妻换人妻好紧| 蜜桃人妻无码| 日韩人妻无码专区一区二区 | 亚洲无码高清在线观看| 色综合欧美| 国产激情内射| 四川少妇BBB| 日韩在线一| 俺去了俺来也| 国产精品无码永久免费不卡| 影音先锋在线成人| 日韩做爱| 狼友视频在线播放| 久久综合久| 亚洲免费观看高清视频| 久久xx| 国产草莓视频| 精品看片| 操逼视频在线播放| 青草视频网| 国产成人AA| 久久伊人网站| 色欲网| 超碰自拍97| 99久久综合| 深爱激情网五月天| jizz免费观看| 91人妻人人澡人人精品| www.国产| 91久久人澡人妻人人澡人人爽 | 黄色视频在线观看免费网站| 超碰v| 俺也操| 午夜福利三级| 天天日天天操天天爽| 91自摸| 人人操人人草| 日韩四区| 免费一级黄色毛片| www.911国产| 影音先锋国产AV| 全部在线A片免费播放| 三级片视频网站| 天堂在线www| 黄色大片在线播放| 男人天堂中文字幕| 女人一级A片色黄情免费| 久久国产热视频| 国产99999| 大香蕉超碰| 91精品国产综合久久久蜜臀主演| 91精品视频在线免费观看| 国产精品视频一区二区三| 女生自慰网站在线观看| 成人毛片18女人毛片真水| 国产精品久久久久的角色| 国产成人秘免费观看一区二区三区 | 日韩国产综合| 日本人妻A片成人免费看片| 亚洲爱爱网| 蜜桃视频app| 国产男女av| 99re视频在线| 蜜桃av无码一区二区三区| 北条麻妃久久久| 日韩黄色电影在线免费观看| 青娱乐99| 爱爱视频天天干| 久久秘成人久久无码| 黄频免费观看| 人人人人人操| 久久久蜜桃| 波多野结衣在线无码视频| 靠比免费| 国模精品无码一区二区免费蜜桃| 一道本无码在线播放| 亚洲第一成网站| 国产精品久久久久久久免牛肉蒲 | 91人妻无码一区二区久久| 午夜在线视频| 国产夫妻在线视频| 青草久久网| 丁香色婷婷五月天| 日韩在线免费观看视频| 国产成人高潮毛片| 日本无码网站| WWW亚洲视频| 手机看片午夜福利网| 学生妹做爱视频| 欧美成人福利| 国产成人无码精品一区秘二区| 思思热99热| 国产综合久久久777777| 最近中文字幕| 玖玖av| 久久亚洲AV成人无码国产野外| 俩小伙3p老熟女露脸| 中文字幕在线一区| 91人妻人人人人爽| 青草青草视频| 成年人免费毛片| JlZZJLZZJlZZ亚洲女人17| 久草人妻| 久久99精品久久久水蜜桃| 少妇bbb搡bbbb搡bbbb| 特级特黄AAAA免费看| 色婷婷91| 无码视频播放| 伊人91| а√最新版在线中文8| 在线三级片视频| 欧美婷婷在线| 2025最新偷拍| 婷婷射| 中文字幕人妻一区| 欧美色图综合| H网站在线观看| 亚洲天堂2016| 狠狠躁日日躁夜夜躁A片视频| 一区二区无码视频| 国产Av一区二区三区| 9999国产精品| 夸克看成人片一级A片| 亚洲国产成人精品女人久久| 婷婷开心色四房播播免费| 91久久精品日日躁夜夜躁国产| 尤物免费视频| 做爰视频毛片下载蜜桃视频。| 亚欧一区二区| jzzijzzij亚洲成熟少妇在线观看| 18sav| 国产天天操| 豆花成人社区,视频| 亚洲成人黄色网| 一级片免费网站| 国产精品秘ThePorn| 日韩视频在线观看一区| 国产亚洲色情| 在线看黄色片| 中文字幕在线国产| 成人免费网站黄| 在线观看黄色网页| 精品少妇无码视频| 天天添夜夜添| 日皮视频在线观看| 女人天堂av| 蜜桃传媒一区二区亚洲| 亚洲免费成人视频| 日韩区一中文字幕a∨| 九九九视频在线观看| 闺蜜AV| 大地8免费高清视频观看大全| 安徽妇搡BBBB搡BBBB小说| 在线视频你懂得| 天天干干| 国产AV黄片| 亚洲女人视频| 免费网站观看www在线观| 成人性爱视频免费观看| 在线观看亚洲无码视频| 夜夜爽夜夜高潮夜夜爽| 天天视频色版免费观看视频| 超碰97免费| 特级西西WWW888| 麻豆视频一区二区| 内射视频免费观看| 亚洲成人视频免费在线观看| 最近最经典中文MV字幕| 亚洲视频在线观看网站| 日本少妇高潮喷水XXXXXXX| 日韩性爱视频在线播放| 久久久久久久香蕉视频| 欧美成人午夜无码A片秀色直播| 成人久久电影| 国产精品高潮呻吟| 人人舔人人爱| 成人毛片在线大全免费| 日本一区二区三区免费看| 久久青青| 足浴小少妇-88AX| 91久久国产综合| AV在线一区二区| 俺去俺来也WWW色老板| 欧美性一区| 中文字幕无码毛片| chinese高潮老女人| 先锋资源一区| 欧美夜夜爽| 四川少妇BBB| 青娱乐青青草| 婷婷二区| 秋霞一区二区| 人人干人人干人人| 日韩高清国产一区在线| 日韩一区二区三区四区久久久精品有吗 | 17c白丝喷水自慰| 高清无码激情| 亚洲天堂成人| 国产欧美精品一区二区三区| 88在线无码精品秘入口九色| 激情精品| 日本黄色一级视频| 三级视频网站| 精品看片| 亚洲无色| 波多野结衣在线观看一区二区| 精品国产三级片| 男女无码视频| 一本到在线观看午夜剧场| 黑种人配中国少妇HD| 久久99国产乱子伦...| 日韩色网站| 亚洲精品国产精品乱玛不99| 99插插插| 久草手机视频在线观看| 北条麻妃视频| 国产精品免费一区二区三区四区视频| 欧美亚洲成人网| 国产人体视频| 麻豆天美传媒AV果冻传媒| 久草福利在线观看| 成人性生活免费视频| 伊人东京热| 中文字幕第83页| 北条麻妃二区| 亚洲一级A片| 高h视频在线观看| 东方AV在线观看| 成人黄色电影在线观看| 亚洲欧洲免费视频| 久久人妻熟女中文字幕av蜜芽| 黄色A片网站| 一区二区三区毛片| 狠狠撸视频| 特级西西444WWW大精品视频| 天天干视频| 国产www| 国产成人久久| 无码人妻AⅤ一区二区三区A片一| 91探花足浴店按摩店| 翔田千里无码| 国产色五月视频| 99久久免费网| 亚洲无码久久飞鱼网站| 三级片在线观看网站| 青青草免费福利视频| 久久精品v| 国产美女做爱| 五月丁香色色网| 黄色视频在线观看| 最近中文字幕在线观看| 丁香综合网| 婷婷伊人中文字幕| 国产精品第一| 日韩一级黄色毛片| 无码一区二区在线观看| 成年人免费视频网站| 麻豆二区| 99re在线观看视频| 狠狠干2018| 色欲99| 免费在线a| 大香蕉久久| 在线亚洲福利| 亚洲人视频| 日韩特黄片| 自慰喷水在线观看| 国产高清第一页| 亚洲一区二区成人| 午夜福利视频网| 91视频国产精品| 国产精品一区二| 一本道中文字幕| 69av在线播放| 91白浆| 五月天色色婷婷| 亚洲国产视频在线观看| 五月色婷婷综合| 激情国产精品| 日韩高清成人无码| 亚洲人成人无码一区二区三区| 探花无码| 国产午夜免费| 东京热视频一区| 奇米狠狠干| 无码视频播放| 天天狠天天干| 人人操人人爱人人摸| 国产白嫩精品久久久久久| 九色91PORNY国产| 99久久精品国产一区二区三区| 日韩精品人妻中文字幕有| 99久在线精品99re8| 中文字幕精品亚洲熟女| 日韩一级网站| 欧美成人精品无码| 日韩在线观看网站| 婷婷好色五月天| 水蜜桃视频在线播放| 三级大香蕉| 欧美精品在线观看视频| av网站免费观看| 理论片熟女奶水哺乳| 99视频免费| 狼人社區91國產精品| 中文乱码在线观看| 色视频网| 成熟的国模冰莲[2]| av在线免费观看网址| 91亚洲国产AⅤ精品一区二区 | 色婷婷综合网| 西西掰穴| 激情无码av| www.97cao| 少妇搡BBBB搡BBB搡HD(| 翔田千里无码破解| 免费黄色视频大全| 黄色片在线看| 日本乱伦电影中文字幕| 国产女人18毛片水18精品软件 | 能看的av| 亚洲无码精品在线| 综合一区二区| 91在线无码精品秘网站| 国产精品免费一区二区三区四区视频 | 青草综合| 九哥操逼视频| 伊人成人网站| 91丨熟女露脸| 豆花视频在线免费观看| 北条麻妃波多波多野结衣| 伊人中文在线| 婷婷五月天激情小说| 人人操人人爽| 狼人综合影院| 中文字幕无码影院| 亚洲40p| 在线免费看AV| 亚洲一区av| 18禁网站网址| 手机看片欧美+日韩+国产| 婷婷五月色综合| 天天干人妻| 91人妻无码精品一区二区毛片| 国产Av婬乱麻豆| 无码人妻丰满熟妇啪啪| 成人在线一区二区三区| 杨门女将婬乱史1—6| 欧美黄片免费观看| 亚洲视频免费观看| 99热在线观看精品| 久久久久久久久久成人| 国产日韩欧美一区| 成人在线中文字幕| 欧美日韩午夜福利视频| XX熟女HD| 久久偷看各类wc女厕嘘嘘偷窃| 亚洲AV无码成人精品区大猫| 99视频内射三四| 久久中文字幕电影| 玩弄大荫蒂视频| 丁香五月天av| 18国产免费视频在线观看| 天a堂8在线www| 天堂网中文在线| 影音先锋成人在线视频| 白嫩外女BBwBBwBBw| 亚洲日本欧美| 亚洲AV无码一区二区三竹菊| www.射| 免费成人三级片| 国产在线观看AV| 伊人黄片| 性性性性性XXXXX| 操逼操逼逼| 内射无码专区久久亚洲| 亚洲免费网站| 无码在线视频播放| 日韩骚货| 伊人精品视频| 欧美成人18| 国产精品无码不卡| 中文字幕aV在线| 午夜福利毛片| 懂色av懂色av粉嫩av分享吧| 欧美成人综合一区| 中文字幕精品人妻| 黄色综合| 国产一级特黄aaa大片| 欧美自拍第一页| 国产AV资源网| 国产福利AV| 日韩综合不卡| 国产香蕉91| 国产黄色三级| 韩国精精品视频| 久草网在线观看| 欧美精品在线观看视频| 国产av天堂| 黄色片久久久| 亚洲一区二区久久| 亚洲中文字幕免费视频| 四房婷婷| 日本一区二区三区四区在线观看 | 超碰牛牛| 你懂的在线观看视频| 国产黄色电影在线观看| 99热网址| 日韩视频――中文字幕| 蜜桃av秘无码一区二区三区| 这里视频很精彩免费观看电视剧最新 | 成人在线视频免费观看| 国产在线色视频| 精品一区电影| 国产人成一区二区三区影院| 人人草人人搞| 精品视频日韩| 性爱福利社| 亚洲综合免费观看高清完整版在线| 亚洲爱爱网站| 欧美成人午夜福利| 欧美日韩中文字幕无码| 国产精品免费一区二区三区四区视频| 超碰97免费在线| 91av在线看| 人妻无码在线观看| 成人久久av| 蜜桃传媒一区二区亚洲AV| 天天综合字幕一区二区| 影音先锋久久久| 成人在线视频播放| 人妻少妇中文字幕久久牛牛| 成人无码国产| 九九这里有精品| 欧美精品xxx| 成人免费三级| 国产成人精品一区二三区熟女在线 | 婷婷五月影院| 午夜操逼| 国产一级a免一级a免费| 丁香五月激情五月| 国产欧美综合视频| 国产熟睡乱子伦午夜视频_第1集 | 狠狠草狠狠干| 日韩三级AV在线观看| av手机在线| 特级西西44www无码| 欧美在线网站| 亚洲午夜久久久之蝌蚪窝| 黄色日逼网站| 免费无码毛片| 久久久久久91| 青娱乐黄片| 色色五月丁香| 国产视频二区| 九九热毛片在线观看| 一边做一边说国语对白| 91久久婷婷国产| 色色网站免费| 欧美在线视频网| 欧美国产日韩在线| 91人妻无码视频| 国产裸体网站| 亚洲日韩精品中文字幕在线| 特级爱爱视频| 精品无码人妻一区二区| 无码激情| 亚洲午夜成人精品一区二区| 亚洲成人综合在线| 精品国产乱码一区二区| 在线观看视频国产| 一级A片60分钟免费看| 黄网91| 欧美在线大香蕉| 91麻豆精品| 大地影视官网第三页入口|