即使通訊技術要點

服務器端

啓動將自己的節點註冊到zookeeper上
開啓心跳
用戶登錄將用戶ID和channel,用戶ID和msg存入redis中

客戶端

登錄login,根據用戶名和ID獲取路由服務中的IMserver,並且將IMserver保存內存中
將發送的消息分批保存到文件中

網關設計

1)設計一個spring cloud gateway,一個是自己netty實現的一個網關

漫遊消息

“消息漫遊”是指一個用戶在任何端,都可以拉取到歷史消息,關鍵點是:
(1) 所有消息存儲在雲端;
(2) 每個端本地存儲last_msg_id,在登錄時可以到雲端同步歷史消息;
(3) 雲端存儲所有消息成本較高,一般會對歷史消息時間(或者條數)進行限制;

多點登錄

“多點登錄”是指多個端同時登錄一個帳號,同時收發消息,關鍵點是:
(1) 需要在服務端存儲同一個用戶多個端的狀態與登陸點;
(2) 發出消息時,要對發送方的多端與接收端的多端,都進行消息投遞;

離線消息

可參考https://mp.weixin.qq.com/s/iKRTqY46CD0RGoSkrrYefg
(1) 對於同一個用戶B,一次性拉取所有用戶發給ta的離線消息,再在客戶端本地進行發送方分析,相比按照發送方一個個進行消息拉取,能大大減少服務器交互次數;
(2) 按需拉取,是無線端的常見優化;
(3) 分頁拉取,是一個請求次數與包大小的折衷;
(4) 應用層的ACK,應用層的去重,才能保證離線消息的不丟不重;
(5) 下一頁的拉取,同時作爲上一頁的ACK,能夠極大減少與服務器的交互次數;

羣消息

(1)不管是羣在線消息,還是羣離線消息,應用層的ACK是可達性的保障;
(2)羣消息只存一份,不用爲每個用戶存儲離線羣msg_id,只需存儲一個最近ack的羣消息id/time;
(3)爲了減少消息風暴,可以批量ACK;
(4)如果收到重複消息,需要msg_id去重,讓用戶無感知;
(5)離線消息過多,可以分頁拉取(按需拉取)優化;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章