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