GO實(shí)現(xiàn)千萬(wàn)級(jí)WebSocket消息推送服務(wù)技術(shù)分析

拉模式和推模式區(qū)別

拉模式(定時(shí)輪詢?cè)L問(wèn)接口獲取數(shù)據(jù))

1. 數(shù)據(jù)更新頻率低粤剧,則大多數(shù)的數(shù)據(jù)請(qǐng)求時(shí)無(wú)效的

2. 在線用戶數(shù)量多歇竟,則服務(wù)端的查詢負(fù)載很高

3. 定時(shí)輪詢拉取俊扳,無(wú)法滿足時(shí)效性要求

推模式(向客戶端進(jìn)行數(shù)據(jù)的推送)

1. 僅在數(shù)據(jù)更新時(shí)途蒋,才有推送

2. 需要維護(hù)大量的在線長(zhǎng)連接

3. 數(shù)據(jù)更新后猛遍,可以立即推送

基于WebSocket協(xié)議做推送

1. 瀏覽器支持的socket編程馋记,輕松維持服務(wù)端的長(zhǎng)連接

2. 基于TCP協(xié)議之上的高層協(xié)議,無(wú)需開(kāi)發(fā)者關(guān)心通訊細(xì)節(jié)

3. 提供了高度抽象的編程接口懊烤,業(yè)務(wù)開(kāi)發(fā)成本較低

WebSocket協(xié)議的交互流程

客戶端首先發(fā)起一個(gè)Http請(qǐng)求到服務(wù)端梯醒,請(qǐng)求的特殊之處,在于在請(qǐng)求里面帶了一個(gè)upgrade的字段腌紧,告訴服務(wù)端茸习,我想生成一個(gè)websocket的協(xié)議,服務(wù)端收到請(qǐng)求后壁肋,會(huì)給客戶端一個(gè)握手的確認(rèn)号胚,返回一個(gè)switching, 意思允許客戶端向websocket協(xié)議轉(zhuǎn)換浸遗,完成這個(gè)協(xié)商之后猫胁,客戶端與服務(wù)端之間的底層TCP協(xié)議是沒(méi)有中斷的,接下來(lái)跛锌,客戶端可以向服務(wù)端發(fā)起一個(gè)基于websocket協(xié)議的消息弃秆,服務(wù)端也可以主動(dòng)向客戶端發(fā)起websocket協(xié)議的消息,websocket協(xié)議里面通訊的單位就叫message。

傳輸協(xié)議原理

協(xié)議升級(jí)后菠赚,繼續(xù)復(fù)用Http協(xié)議的底層socket完成后續(xù)通訊

message底層會(huì)被切分成多個(gè)frame幀進(jìn)行傳輸脑豹,從協(xié)議層面不能傳輸一個(gè)大包,只能切成一個(gè)個(gè)小包傳輸

編程時(shí)衡查,只需操作message瘩欺,無(wú)需關(guān)心frame(屬于協(xié)議和類庫(kù)自身去操作的)

框架底層完成TCP網(wǎng)絡(luò)I/O,WebSocket協(xié)議的解析拌牲,開(kāi)發(fā)者無(wú)需關(guān)心

服務(wù)端技術(shù)選型與考慮

NodeJs:? 單線程模型(盡管可以多進(jìn)程)击碗,推送性能有限

C/C++:TCP通訊、WebSocket協(xié)議實(shí)現(xiàn)成本高

Go:? ?多線程们拙,基于協(xié)程模型并發(fā)

? ? ? ?Go語(yǔ)言屬于編譯型語(yǔ)言稍途,運(yùn)行速度并不慢

? ? ? ?成熟的WebSocket標(biāo)準(zhǔn)庫(kù),無(wú)需造輪子

基于Go實(shí)現(xiàn)WebSocket服務(wù)端

用Go語(yǔ)言對(duì)WebSocket做一個(gè)簡(jiǎn)單的服務(wù)端實(shí)現(xiàn)砚婆,以及HTML頁(yè)面進(jìn)行調(diào)試械拍,并對(duì)WebSocket封裝,這里就直接給出代碼了装盯。

千萬(wàn)級(jí)彈幕系統(tǒng)的架構(gòu)設(shè)計(jì)

技術(shù)難點(diǎn):

1.內(nèi)核瓶頸

推送量大:100W在線 * 10條/每秒 = 1000W條/秒

內(nèi)核瓶頸:linux內(nèi)核發(fā)送TCP的極限包頻 ≈ 100W/秒

2.鎖瓶頸

需要維護(hù)在線用戶集合(100W用戶在線)坷虑,通常是一個(gè)字典結(jié)構(gòu)

推送消息即遍歷整個(gè)集合,順序發(fā)送消息埂奈,耗時(shí)極長(zhǎng)?

推送期間迄损,客戶端仍舊正常的上下線,集合面臨不停的修改账磺,修改需要遍歷芹敌,所以集合需要上鎖

3.CPU瓶頸

瀏覽器與服務(wù)端之間一般采用的是JSon格式去通訊

Json編碼非常耗費(fèi)CPU資源

向100W在線推送一次,則需100W次Json Encode

優(yōu)化方案

內(nèi)核瓶頸

減少網(wǎng)絡(luò)小包的發(fā)送垮抗,我們將網(wǎng)絡(luò)上幾百字節(jié)定義成網(wǎng)絡(luò)的小包了氏捞,小包的問(wèn)題是對(duì)內(nèi)核和網(wǎng)絡(luò)的中間設(shè)備造成處理的壓力。方案是將一秒內(nèi)N條消息合并成1條消息冒版,合并后液茎,每秒推送數(shù)等于在線連接數(shù)。

鎖瓶頸

大鎖拆小鎖辞嗡,將長(zhǎng)連接打散到多個(gè)集合中去捆等,每個(gè)集合都有自己的鎖,多線程并發(fā)推送集合续室,線程之間推送的集合不同栋烤,所以沒(méi)有鎖的競(jìng)爭(zhēng)關(guān)系,避免鎖競(jìng)爭(zhēng)猎贴。

讀寫(xiě)鎖取代互斥鎖班缎,多個(gè)推送任務(wù)可以并發(fā)遍歷相同集合

CPU瓶頸

減少重復(fù)計(jì)算蝴光,Json編碼前置,1次消息編碼+100W次推送达址,消息合并前置蔑祟,N條消息合并后,只需要編碼一次沉唠。

單機(jī)架構(gòu)


最外層是在線的長(zhǎng)連接疆虚,連接到服務(wù)端后,打散到多個(gè)集合里面存儲(chǔ)满葛,我們要發(fā)送的消息呢径簿,通過(guò)打包后,經(jīng)過(guò)json編碼嘀韧,被多個(gè)線程或協(xié)程分發(fā)到多個(gè)集合中去篇亭,最終推給了所有的在線連接。

單機(jī)瓶頸

維護(hù)海量長(zhǎng)連接锄贷,會(huì)花費(fèi)不少內(nèi)存

消息推送的瞬時(shí)译蒂,消耗大量的CPU

消息推送的瞬時(shí)帶寬高達(dá)400-600Mb(4-6Gbits),需要用到萬(wàn)兆網(wǎng)卡谊却,是主要瓶頸

集群

部署多個(gè)節(jié)點(diǎn)柔昼,通過(guò)負(fù)載均衡,把連接打散到多個(gè) 服務(wù)器上炎辨,但推送消息的時(shí)候捕透,不知道哪個(gè)直播間在哪個(gè)節(jié)點(diǎn)上,最常用的方式是將消息廣播給所有的網(wǎng)關(guān)節(jié)點(diǎn)碴萧,此時(shí)就需要做一個(gè)邏輯集群乙嘀。

邏輯集群

基于Http2協(xié)議向gateway集群分發(fā)消息(Http2支持連接復(fù)用,用作RPC性能更佳勿决,即在單個(gè)連接上可以做高吞吐的請(qǐng)求應(yīng)答處理)

基于Http1協(xié)議對(duì)外提供推送API(Http1更加普及乒躺,對(duì)業(yè)務(wù)方更加友好)

整體分布式架構(gòu)圖如下:


任何業(yè)務(wù)方通過(guò)Http接口調(diào)用到邏輯集群招盲,邏輯集群把消息廣播給所有網(wǎng)關(guān)低缩,各個(gè)網(wǎng)關(guān)各自將消息推送給在線的連接即可。

本文講解了開(kāi)發(fā)消息推送服務(wù)的難點(diǎn)與解決方案的大體思路曹货,按照整個(gè)理論流程下來(lái)咆繁,基本能實(shí)現(xiàn)一套彈幕消息推送的服務(wù)。

轉(zhuǎn)自:https://blog.csdn.net/Wing_93/article/details/81587809

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顶籽,一起剝皮案震驚了整個(gè)濱河市玩般,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌礼饱,老刑警劉巖坏为,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件究驴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡匀伏,警方通過(guò)查閱死者的電腦和手機(jī)洒忧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)够颠,“玉大人熙侍,你說(shuō)我怎么就攤上這事÷哪ィ” “怎么了蛉抓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)剃诅。 經(jīng)常有香客問(wèn)我巷送,道長(zhǎng),這世上最難降的妖魔是什么矛辕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任惩系,我火速辦了婚禮,結(jié)果婚禮上如筛,老公的妹妹穿的比我還像新娘堡牡。我一直安慰自己,他們只是感情好杨刨,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布晤柄。 她就那樣靜靜地躺著,像睡著了一般妖胀。 火紅的嫁衣襯著肌膚如雪芥颈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天赚抡,我揣著相機(jī)與錄音爬坑,去河邊找鬼。 笑死涂臣,一個(gè)胖子當(dāng)著我的面吹牛盾计,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赁遗,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼署辉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了岩四?” 一聲冷哼從身側(cè)響起哭尝,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎剖煌,沒(méi)想到半個(gè)月后材鹦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體逝淹,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年桶唐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了创橄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莽红,死狀恐怖妥畏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情安吁,我是刑警寧澤醉蚁,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站鬼店,受9級(jí)特大地震影響网棍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妇智,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一滥玷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧巍棱,春花似錦惑畴、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至到踏,卻和暖如春杠袱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背窝稿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工楣富, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伴榔。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓纹蝴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親潮梯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子骗灶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-WebSo...
    敢夢(mèng)敢當(dāng)閱讀 8,918評(píng)論 0 50
  • 什么是WebSocket呢? WebSocket是HTML5新增的一種通信協(xié)議秉馏,目標(biāo)主流的瀏覽器都支持這個(gè)協(xié)議,比...
    JunChow520閱讀 7,385評(píng)論 1 5
  • 與你戀愛(ài)是我們的共同選擇脱羡,我不會(huì)在乎你最終的決定萝究。我也不會(huì)幻想與你的長(zhǎng)相廝守免都,就算我拒絕了其他對(duì)我有意思的人,而你...
    若當(dāng)晴日啊閱讀 145評(píng)論 0 2
  • 《K12掘金,普通人的大機(jī)會(huì)》---碩博 通篇聽(tīng)完碩博老師的分享栽连,最大的觸點(diǎn)是何為機(jī)會(huì)险领? 我們每個(gè)人的機(jī)會(huì)建立在別...
    江子牙的魚(yú)塘閱讀 183評(píng)論 0 0
  • 記得很久很久以前在網(wǎng)上看到過(guò)一句備受推崇用來(lái)描寫(xiě)父親的話:訥于言而敏于行”。這句話用來(lái)描寫(xiě)我的父親秒紧,真的是再合適不...
    老原qwq閱讀 341評(píng)論 0 0