消息通知系統詳解1—通訊方式
消息通知系統詳解2—後端設計
消息通知系統詳解3—Netty
消息通知系統詳解4—整合Netty和WebSocket
什麼是消息通知系統
消息通知系統,顧名思義即通知消息的傳達處理系統。目的是爲了讓用戶獲得需要得到的消息及提醒並進行處理。
消息通知微服務的定位是“平臺內”的“消息”功能,分爲全員消息,訂閱類消息,點對點消息。例如系統通知,私信,@類消息
- 全員消息
系統通知,活動通知,管理員公告等全部用戶都會收到的消息
- 訂閱類消息
關注某一類數據的用戶,該類數據有更新時向用戶發送的消息。例如關注某位大v的微博,公衆號,訂閱某位知名作家的專欄
- 點對點消息
某位用戶對另外一位用戶進行操作後,系統向被操作的用戶發送的消息。例如點贊,發紅包。
系統特性
消息通知 | |
---|---|
傳輸的內容 | 以文字,超鏈接爲主,輔以圖片,不能再多了。 |
核心需求點 | 要求消息的高送達率,也就是說“這件事兒一定要想盡辦法通知到對方”。對延時要求不高。 |
系統建設成本 | 一般只保存文本消息,存儲成本低。可根據用戶量自由調整服務器集羣配置。 |
交互方式 | 消息一般被設計爲“僅通知,不需要回復” |
通訊方式
這裏先不考慮後端整體實現,前端與後端之間通訊方式如何選型,如何實現實時/準實時數據交互:
需要介紹下三種通訊方式:
短連接
客戶端和服務器每進行一次通訊,就建立一次連接,通訊結束就中斷連接。
HTTP是一個簡單的請求-響應協議,它通常運行在TCP之上。HTTP/1.0使用的TCP默認是短連接。
長連接
是指在建立連接後可以連續多次發送數據,直到雙方斷開連接。
HTTP從1.1版本起,底層的TCP使用的長連接。
使用長連接的HTTP協議,會在響應頭加入代碼:Connection:keep-alive
短連接和長連接的區別
通訊流程
短連接:創建連接 -> 傳輸數據 -> 關閉連接 長連接:創建連接 -> 傳輸數據 -> 保持連接 -> 傳輸數據 -> …… -> 關閉連接
適用場景
短連接:併發量大,數據交互不頻繁情況
長連接:數據交互頻繁,點對點的通訊
websocket協議
什麼是websocket協議
- WebSocket 是 HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的協議。
- 何謂全雙工:全雙工(Full
Duplex)是通訊傳輸的一個術語。雙方在通信時允許數據在兩個方向上同時傳輸,它在能力上相當於兩個單工通信方式的結合。全雙工指可以同時進行信號的雙向傳輸。指A→B的同時B→A,就像是雙向車道。 - 單工就就像是汽車的單行道,是在只允許甲方向乙方傳送信息,而乙方不能向甲方傳送 。
- 參考資料:https://baike.baidu.com/item/%E5%85%A8%E5%8F%8C%E5%B7%A5/310007?fr=aladdin
- 服務器向客戶端發送數據的功能是websocket協議的典型使用場景
三種通信方式的優缺點
優缺點如下:
短輪詢 | 長輪詢 | WebSocket | |
---|---|---|---|
瀏覽器支持 | 幾乎所有現代瀏覽器 | 幾乎所有現代瀏覽器 | IE 10+ Edge Firefox 4+ Chrome 4+ Safari 5+ Opera 11.5+ |
服務器負載 | 較少的CPU資源,較多的內存資源和帶寬資源 | 與傳統輪詢相似,但是佔用帶寬較少 | 無需循環等待(長輪詢),CPU和內存資源不以客戶端數量衡量,而是以客戶端事件數衡量。三種方式裏性能最佳。 |
客戶端負載 | 佔用較多的內存資源與請求數 | 與傳統輪詢相似 | 同Server-Sent Event |
延遲 | 非實時,延遲取決於請求間隔 | 同傳統輪詢 | 實時 |
實現複雜度 | 非常簡單 | 需要服務器配合,客戶端實現非常簡單 | 需要Socket程序實現和額外端口,客戶端實現簡單 |
在 WebSocket中,瀏覽器和服務器只需要完成一次握手,就可以創建持久性的連接,並進行雙向數據傳輸。
在推送功能的實現技術上,相比使用Ajax 定時輪詢的方式(setInterval),WebSocket 更節省服務器資源和帶寬。
出於服務器性能和實時性考慮,前後端通訊方式採用WebSocket協議實現。