网易实践|千万级在线直播弹幕方案
導(dǎo)讀:8月22日,TFBOYS「日光旅行」七周年演唱會落下帷幕,頂級流量的在線直播,海量彈幕、禮物刷爆屏幕,網(wǎng)易云信為這場直播活動提供直播彈幕技術(shù)方案。本文將圍繞千萬級在線場景闡述直播彈幕的設(shè)計(jì)方案。
?
文|?云信IM技術(shù)團(tuán)隊(duì)
?
8月22日,TFBOYS「日光旅行」七周年演唱會落下帷幕,36氪評價(jià)網(wǎng)易云音樂舉辦的這場線上演唱會“很可能會成為線上音樂演出正式走上歷史舞臺的一個標(biāo)志性事件”。在這樣一個打破吉尼斯世界紀(jì)錄的“標(biāo)志性事件”背后,是網(wǎng)易云信千萬級在線直播間彈幕方案的技術(shù)支持。
?
一、彈幕技術(shù)方案
?
?
彈幕方案以云信聊天室服務(wù)為基礎(chǔ),提供登錄直播間、發(fā)送彈幕、禮物消息等能力;以千萬級在線廣播為目標(biāo),設(shè)計(jì)了基于CDN的彈幕廣播服務(wù)。
直播間收發(fā)消息(彈幕、禮物)的基本業(yè)務(wù)流程如下:
?
下文將圍繞以上三個階段分別闡述如何實(shí)現(xiàn)千萬級在線直播彈幕能力。
?
為了提供穩(wěn)定高可用的彈幕服務(wù),需要通過GSLB服務(wù)給用戶分配最佳的接入地址。GSLB服務(wù)需要從用戶網(wǎng)絡(luò)類型、機(jī)房網(wǎng)絡(luò)容量、服務(wù)器負(fù)載、成本等維度綜合考慮。
?
用戶網(wǎng)絡(luò)類型和機(jī)房網(wǎng)絡(luò)容量:為了用戶能夠快速、穩(wěn)定的登錄直播間收發(fā)消息,一般要根據(jù)用戶所在地理位置以及網(wǎng)絡(luò)運(yùn)營商類型綜合考慮給用戶分類接入服務(wù)器。機(jī)房一般提供BGP網(wǎng)絡(luò)、三線網(wǎng)絡(luò)兩種接入方案,分配服務(wù)根據(jù)用戶IP地址分析用戶的地域、運(yùn)營商類型并分配最佳接入地址。一般優(yōu)先按運(yùn)營商類型分配三線地址(例如電信用戶分配電信接入地址),如果是小運(yùn)營商或無法識別的IP地址則分配BGP地址,兩種接入方式用戶都可以獲得穩(wěn)定的網(wǎng)絡(luò)環(huán)境。
?
服務(wù)器負(fù)載:單臺服務(wù)器能夠承載的TCP長鏈接有限,尤其是在高并發(fā)進(jìn)入直播間的情況下,握手協(xié)議需要完成鏈路加密工作,對系統(tǒng)的CPU資源消耗比較大,因此需要實(shí)現(xiàn)一套良好的均衡分配策略。
?
?
云信實(shí)現(xiàn)了一套基于服務(wù)器負(fù)載均衡的分配策略。長鏈接接入服務(wù)器周期性上報(bào)當(dāng)前服務(wù)器負(fù)載到負(fù)載均衡服務(wù)集群,負(fù)載信息存儲在共享緩存中,接入分配服務(wù)根據(jù)負(fù)載信息動態(tài)分配接入地址。
一般情況下用戶請求直播間地址,地址分配服務(wù)會查詢負(fù)載均衡服務(wù)(或者直接查詢負(fù)載緩存),然后根據(jù)獲取到的信息分配當(dāng)前負(fù)載最低的服務(wù)器。在千萬級別的在線直播活動場景下,開播時大量用戶并發(fā)進(jìn)入直播間,分配服務(wù)可達(dá)50萬到100萬TPS,這么高的TPS下如果還用“一般分配”方案,負(fù)載均衡(緩存)服務(wù)的TPS和集群之間的機(jī)房網(wǎng)絡(luò)帶寬非常高,單臺服務(wù)器亦可能因?yàn)樨?fù)載信息滯后導(dǎo)致超負(fù)荷分配。為解決機(jī)房內(nèi)帶寬和超負(fù)載分配的問題,我們對分配方案實(shí)現(xiàn)了以下優(yōu)化:
?
?
在實(shí)際方案落地中,需要結(jié)合負(fù)載、用戶網(wǎng)絡(luò)類型、機(jī)房線路容量等因素綜合分配
?
?
?
登錄直播間主要有兩項(xiàng)任務(wù):握手和身份認(rèn)證。
?
握手:SDK建立TCP長鏈接后,首先向服務(wù)器發(fā)送握手協(xié)議,主要提供SDK版本、協(xié)議版本、支持的加密算法等信息,服務(wù)器根據(jù)SDK提供的信息選擇合適的協(xié)議版本以及加密算法,建立安全的通信鏈路。
?
云信支持的非對稱算法包括:RSA,SM2等算法,支持的對稱加密算法包括:AES,SM4等(注:SM2、SM4為國密算法,即我國自主研發(fā)創(chuàng)新的一套數(shù)據(jù)加密處理系列算法。
?
云信作為業(yè)內(nèi)領(lǐng)先的即時通訊PAAS平臺,十分重視信息安全,因此也率先支持了國密算法。)。非對稱加密算法對CPU資源消耗非常高,為了提高性能一般可以考慮選擇合適的密鑰長度,另外針對Java平臺建議考慮使用JNI技術(shù)提高非對稱加密計(jì)算性能。
?
身份認(rèn)證:TFBOYS活動是在線付費(fèi)直播,因此身份認(rèn)證包含了賬號認(rèn)證和業(yè)務(wù)認(rèn)證兩部分,即用戶必須使用正確的賬號密碼登錄App,且必須付費(fèi)購買直播門票才有權(quán)限觀看直播。為優(yōu)化系統(tǒng)性能,彈幕服務(wù)將“地址分配和鑒權(quán)”服務(wù)進(jìn)行了特殊優(yōu)化:
?
鑒權(quán)中心提供用戶進(jìn)入直播間彈幕服務(wù)的身份鑒權(quán)策略配置。在TFBOYS活動中采用了動態(tài)Token的鑒權(quán)機(jī)制,即根據(jù)用戶賬號、登錄時間、分配的接入地址以及鑒權(quán)中心按時間區(qū)間生成的“隨機(jī)數(shù)以及對應(yīng)的Token算法”動態(tài)計(jì)算鑒權(quán)Token。
用戶打開直播App,首先完成賬號鑒權(quán)。在進(jìn)入TFBOYS直播間時通過業(yè)務(wù)中心完成直播付費(fèi)身份認(rèn)證和彈幕服務(wù)地址分配(同步獲取到彈幕服務(wù)的動態(tài)鑒權(quán)token),最后根據(jù)接入地址登錄彈幕服務(wù),彈幕服務(wù)依據(jù)鑒權(quán)中心的策略校驗(yàn)Token正確性。
?
動態(tài)Token鑒權(quán)采用進(jìn)程本地計(jì)算的方式,可以在不訪問用戶服務(wù)的情況下完成身份鑒權(quán),在提高登錄認(rèn)證的性能同時有效的降低了業(yè)務(wù)成本。
?
?
?
收發(fā)消息是直播間的核心業(yè)務(wù),直播間消息主要分為彈幕和禮物兩類。禮物因涉及付費(fèi)等因素一般通過客戶方業(yè)務(wù)服務(wù)器發(fā)送,彈幕消息則可以通過聊天室長鏈接發(fā)送。在千萬級直播間場景下,因消息量太高,因此需要從消息量、消息體大小、消息比例等多個方面優(yōu)化,因此設(shè)計(jì)了一套基于優(yōu)先級隊(duì)列的彈幕服務(wù)。
?
首先,為了節(jié)約消息產(chǎn)生的帶寬,在大型直播項(xiàng)目開始階段,就需要對消息格式進(jìn)行優(yōu)化,充分精簡消息體大小。例如將禮物消息展示相關(guān)的資源文件提前預(yù)加載到直播App中,禮物消息轉(zhuǎn)化為業(yè)務(wù)編號,可極大的減少消息大小;
?
其次,針對上行消息設(shè)計(jì)流控機(jī)制。為了能全局控制上行消息體量,設(shè)計(jì)了逐級流控方案。上層級根據(jù)下層級能夠支撐處理能力設(shè)計(jì)相對較粗粒度的本地流控機(jī)制;在彈幕反垃圾業(yè)務(wù)階段,因需要全局控制消息量,因此采用分布式全局流控方案;彈幕廣播階段則根據(jù)業(yè)務(wù)廣播需求再一次進(jìn)行消息流控。
上行消息通過反垃圾監(jiān)測后被投遞到彈幕服務(wù)處理。基于優(yōu)先級隊(duì)列的彈幕服務(wù)首先按業(yè)務(wù)劃分不同的消息隊(duì)列,例如:系統(tǒng)廣播、高優(yōu)先級禮物、低優(yōu)先級、彈幕,然后按隊(duì)列分配消息比例,最后根據(jù)單位時間(1秒)內(nèi)用戶需要接收到的消息量計(jì)算各個隊(duì)列應(yīng)該投遞的消息數(shù)量。在實(shí)際投遞消息的過程中,若前一個隊(duì)列消息量不足,可將剩余的消息數(shù)量疊加到下一個隊(duì)列,以確保每一個周期都發(fā)送足夠的消息給用戶。
彈幕可通過長連接或CDN廣播給其他用戶。為了給用戶提供極致的彈幕體驗(yàn),充分發(fā)揮邊緣加速的優(yōu)勢,在千萬級在線直播場景下優(yōu)先選擇CDN方案,如下圖:
基于CDN廣播彈幕有兩種方案:
?
?
相對來說,靜態(tài)文件加速方案實(shí)現(xiàn)更簡單但實(shí)時性不高(取決于彈幕同步的周期時長);推流的方案消息實(shí)時性更高,但實(shí)現(xiàn)相對復(fù)雜,且需要考慮到不同終端的兼容性。實(shí)際項(xiàng)目中可根據(jù)場景和終端類型靈活選擇不同的方案。
為了保障服務(wù)的可靠性,可考慮融合CDN的方案,即同時將消息推送到多家CDN廠商,并結(jié)合CDN廠商的容量比例以及網(wǎng)絡(luò)延遲情況綜合調(diào)度(例如基于權(quán)重的輪巡調(diào)度策略)。
二、彈幕穩(wěn)定性設(shè)計(jì)
ChatLink和ChatServer采用單元化部署的方案,有以下優(yōu)點(diǎn):
?
?
單個直播間的“接入服務(wù)”和“彈幕服務(wù)”因需要全局控制未采用單元化部署方案,但是在實(shí)施階段采用了跨機(jī)房部署的方案(包括依賴的存儲資源、服務(wù)),可以避免單個機(jī)房故障導(dǎo)致服務(wù)不可用的問題。
?
?
針對“接入服務(wù)”和“彈幕服務(wù)”,除了采用跨機(jī)房部署外,在服務(wù)設(shè)計(jì)上核心依賴的存儲資源、服務(wù),采用主備模式。例如心跳負(fù)載依賴的緩存服務(wù),單個緩存實(shí)例本身高可用,但考慮到極端情況(例如緩存集群內(nèi)超過一半的服務(wù)器宕機(jī)導(dǎo)致服務(wù)不可用),因此采用主備緩存集群方案,當(dāng)主集群不可用后,業(yè)務(wù)主動切換到備用集群,可保障業(yè)務(wù)在5秒內(nèi)恢復(fù)正常。
?
為了實(shí)時了解系統(tǒng)運(yùn)行狀態(tài),在彈幕方案中實(shí)現(xiàn)了秒級數(shù)據(jù)大盤方案。監(jiān)控大盤圍繞用戶和消息,展示用戶地域分布變化、上行消息量、廣播消息量、機(jī)房出口帶寬、CDN帶寬、消息流控比例,端側(cè)CDN彈幕同步指標(biāo)(成功比例、延遲狀況)等信息。
為了達(dá)成秒級監(jiān)控的目標(biāo),數(shù)據(jù)收集采用了“業(yè)務(wù)預(yù)聚合+數(shù)據(jù)中心合并”的實(shí)時計(jì)算方案。即業(yè)務(wù)服務(wù)直接在本地進(jìn)程內(nèi)聚合計(jì)算指標(biāo)上報(bào)到數(shù)據(jù)中心,數(shù)據(jù)中心僅需要按時間窗口合并監(jiān)控指標(biāo)數(shù)據(jù)即可輸出到監(jiān)控大盤。
?為確保活動順利完成,彈幕方案進(jìn)行了多次故障與應(yīng)急預(yù)案演練措施。具體包含兩個方面:
?
?
?
三、結(jié)束語
憑借超過20年的技術(shù)累積和5年企業(yè)融合通信經(jīng)驗(yàn),網(wǎng)易云信在線直播彈幕方案在TFBOYS「日光旅行」七周年演唱會上以0故障的佳績交上了一份滿意的答卷,攜手網(wǎng)易云音樂共同成就了這場口碑票房雙豐收的線上演唱會。
?
點(diǎn)擊這里,即可立即咨詢網(wǎng)易云信千萬級在線直播彈幕方案,了解更多技術(shù)細(xì)節(jié)。
總結(jié)
以上是生活随笔為你收集整理的网易实践|千万级在线直播弹幕方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何保障一场千万级大型直播?
- 下一篇: 技术系列课|从0到1 构建实时音视频引擎