原文連接,歡迎討論: 【Q023】websocket 服務多節點部署時會有什麼問題,怎麼解決 git
你來講說 websocket 有什麼用github
雙向通訊,服務器端能夠主動 push,給客戶端發送通知web
那websocket多個節點有什麼問題?面試
頭條面試官的提問讓個人回憶飄到了一個下午,想起了我兩個同事之間的對話redis
咱有部分用戶收不到通知了服務器
通知是由ws服務控制的,它最近是有啥改動麼websocket
也沒改啥,之前單個節點也沒有問題負載均衡
想起來了,接上面通知,把服務都從單節點改爲了多節點socket
對,說是爲了什麼 HA,兩位數用戶的服務須要折騰嗎分佈式
沒事,這樣出去了也有搭建高可用服務與 websocket 負載均衡的經驗了
說的倒也是!不過這樣確實會有 ws 分佈式的問題
簡單,加個 reids 就行了
在開始思考分佈式會有什麼問題時,先來回答一個問題: 服務端如何與客戶端交流?
在 ws 服務端,當與客戶端鏈接成功後,會生成一個對象 connection
,ws 會維護一個與客戶端全部鏈接的 connections
。若是想要主動推送消息到客戶端,只須要調用API connection.sendText(message)
。
那如何給全部人廣播消息呢?
服務器只須要與它自身的全部鏈接 server.connections
挨個發消息就是廣播,因此它只是一個僞廣播:我要給羣裏全部人發消息,但我不能在羣裏發,只能挨個私發。
當單節點時全部用戶都能正常受到通知,流程以下
這時全部用戶都能收到消息通知
當多節點時,就會有部分用戶沒法正常受到通知,從如下流程圖中能夠很清楚地看到問題所在
負載到節點2的全部用戶都沒有收到消息通知
多節點服務器就會有分佈式問題,解決分佈式問題就找一個你們都能找到的地,好比說 Redis
,好比說 Kafka
等消息件
改進後流程圖以下
其中有一個細節是 pub/sub 那裏,redis 的 pubsub
較 Kafka
等消息中間件更爲輕便,最主要的是與ws集成的社區方案比較成熟,這點很重要,如 Node 中的如下兩個
pubsub
在 redis 中的命令以下
publish channel message
subscribe
若是咱們要訂閱 eat
這個 channel
的話,圖示以下
借用解決方案的圖做爲小結