-
GO千萬級消息推送服務技術難點的解決方案
內核瓶頸
?原理:減少網絡小包(一般幾百個字節)的發送
將同一秒內的N條消息,合并成1條消息
合并后,每秒推送次數只等于在線連接數
鎖瓶頸
原理:大拆小
連接打散到多個集合中,每個集合有自己的鎖
多線程并發推送多個集合,避免鎖競爭
讀寫鎖取代互斥鎖,多個推送任務可以并發遍歷相同集合
CPU瓶頸
原理:減少重復計算
json編碼前置,1次消息編碼+100萬次推送
消息合并前置,N條消息合并后只編碼1次
查看全部 -
GO千萬級消息推送服務性能瓶頸
內核瓶頸
推送量大:100萬在線*10條/秒=1000萬條/秒
內核瓶頸:linux內核發送TCP的極限包頻≈100萬/秒
鎖瓶頸
需要維護在線用戶集合(100萬在線),通常是一個字典結構
推送消息即遍歷整個集合,順序發送消息,耗時極長
推送期間,客戶端仍舊正常上/下線,所以集合需要上鎖
CPU瓶頸
瀏覽器與客戶端通常采用json格式通訊
json編碼非常耗費CPU資源
向100萬在線推送1次,則需100萬次json?encode
查看全部 -
go原生的WebSocket的ReadMessage和WriteMessage方法不是線程安全的,但是Close方法是否線程安全的
查看全部 -
封裝WebSocket內部原理
啟動讀協程,循環讀取WebSocket,將信息投遞到in channel
啟動寫協程,循環讀取out channel,將信息寫給WebSocket
查看全部 -
WebSocket的消息類型分為兩種:文本類型和二進制類型
查看全部 -
WebSocke是HTTP協議Upgrade而來
查看全部 -
WebSocket傳輸原理
協議升級后,繼續復用HTTP的底層socket完成后續通訊
message底層被切分成多個frame幀傳輸
編程時只需要操作message,無需關心frame
框架底層完成TCP網絡I/O,WebSocket協議解析,開發者無需關心
查看全部 -
WebSocket通訊流程
查看全部 -
推模式
僅在數據更新時才需要推送
需要維護大量的在線長連接
數據更新后可以立即推送
查看全部 -
拉模式
數據更新頻率低,則大多數請求是無效的
在線用戶數量多,則服務端的查詢負載很高
定時輪詢拉取,無法滿足時效性要求
查看全部 -
很有用啦啦
查看全部 -
試試查看全部
-
分布式架構——整體架構
查看全部 -
分布式架構——邏輯集群
查看全部 -
分布式架構——單機瓶頸
查看全部
舉報