(1)業(yè)務(wù)復(fù)雜度介紹
開(kāi)門(mén)見(jiàn)山,假設(shè)一個(gè)直播間同時(shí)500W人在線,那么1秒鐘1000條彈幕,那么彈幕系統(tǒng)的推送頻率就是: 500W * 1000條/秒=50億條/秒
,想想B站2019跨年晚會(huì)那次彈幕系統(tǒng)得是多么的NB,況且一個(gè)大型網(wǎng)站不可能只有一個(gè)直播間!
使用Go做WebSocket開(kāi)發(fā)無(wú)非就是三種情況:
- 使用Go原生自帶的庫(kù),也就是
golang.org/x/net
,但是這個(gè)官方庫(kù)真是出了奇Bug多 - 使用GitHub大佬
gorilla/websocket
庫(kù),可以結(jié)合到某些Web開(kāi)發(fā)框架,比如Gin、iris等,只要使用的框架式基于golang.org/net
的,那么這個(gè)庫(kù)就可以與這個(gè)框架結(jié)合 - 手?jǐn)]一個(gè)WebSocket框架
相關(guān)學(xué)習(xí)推薦:Go語(yǔ)言教程
根據(jù)估算結(jié)果,彈幕推送量很大的時(shí)候,Linux內(nèi)核將會(huì)出現(xiàn)瓶頸,因?yàn)長(zhǎng)inux內(nèi)核發(fā)送TCP包的時(shí)候極限包發(fā)送頻率是100W。因此可以將同一秒內(nèi)的彈幕消息合并為1條推送,減少網(wǎng)絡(luò)小數(shù)據(jù)包的發(fā)送,從而降低推送頻率。
彈幕系統(tǒng)需要維護(hù)在線的用戶(hù)長(zhǎng)連接來(lái)實(shí)現(xiàn)定向推送到在線的用戶(hù),通常是使用Hash字典結(jié)構(gòu),通常推送消息就是遍歷在線用的Hash字典。在彈幕推送期間用戶(hù)在不斷的上下線,為了維護(hù)上線用戶(hù),那么就得不斷的修改Hash字典,不斷地進(jìn)行鎖操作,用戶(hù)量過(guò)大導(dǎo)致鎖瓶頸。因此可以將整個(gè)Hash結(jié)構(gòu)拆分為多個(gè)Hash結(jié)構(gòu),分別對(duì)多個(gè)Hash結(jié)構(gòu)加不同的鎖,并且使用讀寫(xiě)鎖替代互斥鎖。
通常服務(wù)器與客戶(hù)端交互使用JSON結(jié)構(gòu),那么需要不斷的編碼解碼JSON數(shù)據(jù),這將會(huì)導(dǎo)致CPU瓶頸。將消息先進(jìn)行合并,然后進(jìn)行編碼,最后輪詢(xún)Hash結(jié)構(gòu)進(jìn)行推送。
以上是單體架構(gòu)存在的問(wèn)題,為了支持