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