實現方式三種:
方式描述
優點缺點
短輪詢客戶端通過ajax每隔一段時間向服務端發起一次請求,服務
端不管有無訊息都返回給客戶端。
實現簡單
對客戶端和服務端無要求
大部分請求為無效請求
浪費頻寬和伺服器
實時性不高
長輪詢與短輪詢類似,不同的是,服務端收到請求後,若沒有新訊息則
等待(不立即返回),直到有新訊息或超時才返回。
實現簡單
對客戶端無要求
服務端壓力增大
浪費服務端連線
長連線客戶端和服務端開啟一條連線通道,實現雙工通訊。有新訊息時,
服務端主動推送給客戶端。
效率最高
瀏覽器版本要求
nginx、tomcat版本要求
筆者採用長連線的方式,用websocket來做長連線。
系統架構圖
訊息推送時序圖
一共兩個服務,連線服務和推送服務。
連線服務用於和客戶端保持長連線,接收到mq的訊息時,將訊息推送給客戶端。因為要保持長連線,基於前置機的特點,可能需要採取一些策略來保持,這裡是nginx,預設60s超時,需要客戶端每乙個時間間隔(30s)傳送乙個心跳包。
推送服務用於接收各業務系統的訊息推送請求,過濾並放到mq中。
連線服務和推送服務的特質不同,用mq來做解耦。接連服務:公網,有狀態,壓力來至客戶端數量;推送服務:內網,無狀態,訊息推送頻次。
伸縮性:
健壯性:
許可權方面問題:
存在問題:
mq選型
這裡考慮了kafka和redis兩種方案
redis方案。每個使用者乙個list,每個連線服務只監聽和自己保持連線的的使用者的list,每次pop到新訊息就通過連線傳送。
綜合考慮,用kafka。原因:問題明確,且出現機率小,後期可通過其他的策略來避免。redis做mq因為不夠成熟,不確定性大故棄用。
日誌查詢
已傳送的訊息,未成功傳送的訊息。本期只做已傳送訊息的查詢,未傳送的不做。具體實現為,在連線服務中落地,訊息傳送後,將訊息存到db,供後續查詢用。
訊息推送系統方案
臨時整理的乙份方案,內容還需細化和推敲。訊息推送建立 傳送 訊息推送後台管理 推送訊息表字段 訊息推送傳送過程 步驟 socket長連線demo已實現 client 定時向server傳送心跳包,告知 server 繼續保持長連線 server根據接收到的心跳包時段間隔判斷client是否連線正常。...
django python搭建訊息推送系統
因公司專案需求,需要建立乙個展示 接入兩台攝像機,當攝像機的 流傳過來的時候,實時展示到網頁中,所以需要做乙個實時推送系統的小demo,因接觸django時間不長 兩周左右 也算邊做邊學習了,網上用channels做實時聊天系統的較多,實時推送系統的比較少。channel layers from d...
PHP workerman訊息推送系統學習
一 github官網 二 使用 2 後端服務啟動 linux系統 啟動服務 php start.php start d 停止服務 php start.php stop 服務狀態 php start.php status windows系統 雙擊start for win.bat 引入前端檔案 to ...