「位元組跳動直播研發團隊」是如何每天護航百萬直播間的?
2019年,位元組跳動整合了旗下抖音、火山小視訊、西瓜視訊的直播技術、業務團隊,成立服務於公司全線產品直播的直播研發團隊。
他們每天接受上百萬直播間實時開播的考驗,扛住了數百萬人同時線上的抖音奇妙夜直播,護航了抖音奇妙好物節直播帶貨屢創新紀錄……
實時互動、不能延遲、沒有補考機會,面對眾多技術難題,這支屢屢交上高分答卷的技術團隊,都做對了什麼?
01
不打沒準備的仗
2020年的愚人節,羅永浩直播在抖音首秀。高峰吸引近300萬人同時線上,累計觀看人數超4800萬,1.1億GMV,創下抖音電商直播的新紀錄。
開播前大家難免緊張,如此量級的電商場景直播,此前在抖音還從來沒有被大規模驗證過。
幾百萬人同時湧入,能不能穩住?
直播期間使用者給主播發送大量評論,導致佔用CPU、硬體發熱,如何使用降級策略解決?
採用功能降級時,如何儘可能不影響使用者體驗?
大量的C端流水,打賞、主播提現,如何避免資金風險?
……
開播後,緊張很快就變為了淡定,整整3小時,技術問題都在預料的可控範圍之內。
先想一步乃至幾步,一直是位元組跳動直播團隊的做事習慣。久經考驗的直播研發團隊,已經摸索出了舉一反三的核心解題思路:
提前預判,做好資源準備和降級策略方案
多次彩排追求極致
重保小組+大後方配合護航
面對類似老羅直播這樣的複雜專案,大家會提前1-2個月做準備,拆解劃分關鍵節點目標:
首先,是做好瞬時流量的量級預估判斷,從而做好相應資源的準備和擴充。
研發團隊通常會先和市場、運營同學溝通,然後通過一套此前經各種活動驗證的轉化比計算方法,算出瞬時流量的併發量級。
“投放的包括push、開屏,投放時間點,以及整個產生作用的曲線,其實我們是心裡有數的,綜合考慮這些因素後,我們就大約清楚在某一個時間點會有多大的量進來。” 位元組跳動直播研發負責人周鷹說,根據預測量級,團隊將設計好相應的預備方案,把資源補充到位,同時留一定的餘量出來。
反覆調整的壓測、彩排,讓團隊對避免翻車更有信心。
老羅首秀開播前一個月,演練就開始了。由客戶端、服務端、平臺、流媒體等方向的oncall同學組成了一支重點保障小組,護航整場直播的所有環節。直播當天下午三點的終演彩排,不僅是位元速率清晰度、網路狀況被反覆除錯至滿意,連麥克風放哪個位置更好的細節,重保小組的同學都在現場幫助操作。
彩排再多,總歸還是會碰上沒遇到過的問題。
羅永浩直播在電商這塊的高併發症問題就比較明顯,早期也暴露了諸多購買路徑、售後等方面的問題,對整個電商直播服務的優化成長幫助很大。
比如首場直播時,對於一些優惠力度大的秒殺活動,老羅喊了開搶後,使用者在商品列表卻一直刷不到貨。技術團隊找原因才發現,由於貨是先上架到電商後臺,再同步到直播的商品列表,結果當初就被某些黑產利用這個漏洞直接在電商後臺把單搶完,導致使用者感覺有內幕。
監控系統和預備的突發解決方案也在不斷完善。
為了縮短定位問題的路徑,團隊針對高熱直播間做了涉及各個節點的端監控。比如進入直播間的首幀畫面卡頓率,或者送禮成功率,一旦指標變化較大,就會觸發監控系統自動報警。而一旦有使用者問題在群裡丟擲,可以直接分到對應的方向去查,定位到具體問題,比如是CDN的問題、還是服務端問題。
諸如卡頓、清晰度這類問題,十幾分鍾內就能被解決掉。
“一般最緊張的就是開播後幾分鐘,以及搶紅包的那一秒,這種重點時刻的預判對了,事情就大體穩了。”參與支援了多場大型活動的直播服務端研發沈傑說。
02
自動給自己劃重點
並不是所有的考試都會提前劃重點。
高峰時近300萬人同時線上的羅永浩直播,只是抖音每天實時開播的上百萬個直播間其中之一。許多時候,團隊可能無法提前預知會有哪些高熱直播間在何時出現,更難以有較充分時間做資源準備和壓測演練。
以直播訊息服務為例,在實時直播間裡,可能短時間就湧入幾百上千萬人,而且任何觀眾都可以發言互動,對於直播訊息系統的要求非常高,資源配置一旦不到位,訊息延遲幾秒就會帶來不少差評。
“比如有些明星大V不會告訴你什麼時候開播,他們粉絲群龐大,一旦開播併發瞬間劇增,但我們沒有辦法提前準備,最初只能設定預值和監控報警,甚至需要在開播後手改程式碼。”2019年公司合併成立直播研發團隊後,負責直播訊息系統的武揚發現,隨著大型活動、高熱直播間越來越多,自動化的重保需求迫在眉睫。
直播研發團隊開始利用演算法,在海量的直播中為自己劃重點:
高熱直播間預測+房間開播實時人數計算的機制
· 根據之前所有的開播歷史和一系列相關資料,利用機器學習的手段預測一個直播間是否會在開播後高熱,從而予以重點關注
· 秒級計算所有直播間人數,根據直播間人數的變化,自動地做一些相應的重保和降級手段
1、訊息寫入控制
在直播場景下,每個直播間能夠傳送成功(被客戶端接收並展示)的訊息數目是控制在一定範圍內的,因為如果一個直播間能夠傳送的訊息特別多,刷屏速度太快,會導致使用者體驗差,反之如果訊息很少會顯得直播間很冷清。
“每個直播間都有訊息傳送頻控,並且閾值是由服務端動態調整的。對於高熱直播間的寫入頻控閾值就需要降低,這大幅降低了推送端網絡卡的消耗,保證服務端執行平穩。”
2、訊息觸達控制
目前直播訊息系統採用的推拉結合的模型,給使用者提供更優越的直播互動體驗。具體採用哪種策略對於客戶端來說是透明的,無需關心。
對於近千萬人同時線上的直播間來說,服務端全鏈路的QPS也能夠達到千萬量級,這對業務服務端來說壓力是巨大的,需要有完備的容災預案——快取、非同步化、壓縮演算法優化、全鏈路監控,以及非關鍵鏈路的資料動態取樣策略,關鍵鏈路資料實時雙通道保障等多種容災降級手段。
“對於如抖音美好奇妙夜這種量級線上觀眾的直播活動來說,適當提高部分訊息觸達延遲,並且結合客戶端的平滑展示的方式,來降低服務端壓力,換取服務端的平穩執行。而對於使用者體驗來說是幾乎無感知的。”
當然,由於直播存在突然開播、隨時關播、流量隨時動態變化的特點,要想在保證最優的使用者體驗和資源利用率之間尋找平衡點,需要業務系統支援更平滑的彈性伸縮機制。
在自動化重保系統嘗試之前,2019年4月,武揚帶領團隊同學花了近兩個雙月的時間自研了一套更適合直播場景的分散式儲存系統。
它有更完善靈敏的彈性伸縮和流量排程機制,可以根據直播間人數、網絡卡流量變化等靈活動態擴縮容及流量排程。
這一切對於使用者來說都是透明的,保證服務高可用的同時充分提高了資源利用率,頂住了多次流量洪峰。
上述種種機制預案,也讓團隊在去年10月,數百萬線上人數的「抖音美好奇妙夜」直播中應對自如。
疫情爆發後,短短一兩月時間,位元組跳動平臺同時線上直播間數量從12萬指數型暴增至30萬。
負責直播架構的原明卻早已做好了準備。他帶隊著手升級重構的「線上房間查詢」前不久剛上線,初衷就是為了讓線上直播間資料查詢這項基礎服務能夠支撐50萬乃至百萬線上直播間。
線上房間查詢幫助我們抗住了流量快速翻3倍的挑戰,哪怕線上直播間漲到30萬,併發請求600w QPS,效能卻更好了。
不僅節省了大概幾千萬機器的資源,延時還降到了1/10甚至是1/100。
從使用者體驗來說,過去主播從開播到房間被推薦可能要5秒,現在低於1秒就行。
在重構過程中,原明還意外發現公司用的Thrift協議,在重IO的場景下存在效能問題。於是跨出邊界,主動負責做了兩三版升級改造,使得Thrift編解碼效能提升4倍,上線後線上房間查詢資源節省3/4。
“我們也在直播server、火山等上下游團隊把thrift做了進一步推廣,併合併到位元組跳動基礎庫,這對全公司都有收益的。”
03
高效背後的挑戰
這個有一百來號工程師的龐大技術團隊,同樣經歷過不那麼從容的陣痛期。
服務於公司全線產品直播的直播研發團隊成立後,需要把直播中通用的基礎能力“平臺化”,為位元組跳動旗下各個App直播業務的快速迭代提供強有力支援。
一個架構支援多款產品,就得考慮怎麼實現App間的快速遷移。對於技術而言,挑戰大大增加。“通用”的目標更是導致研發成本的上升,週期變長,如何平衡這個一度成了一大痛點。
此前來自火山直播的沈傑回憶,公司剛合併直播研發團隊的一兩個雙月,整體節奏比較著急,事故頻發。
各個團隊以前的實踐和做事方式不太一樣,對於每個工程師來講,面臨的都是之前沒有遇到過的問題。
比如我以前考慮火山App就好,但現在每一個改動,都要面向所有產品線,可能本來只是想改產品a的邏輯,結果影響了產品b。
如何抽象中臺能力,去更好滿足業務方不一樣的需求?團隊裡一直都在討論,希望採用「中臺+前臺」的合作模式,中臺把儘可能中臺化的東西做厚、做紮實,為前臺業務快速迭代提供強有力的支撐。
直播場景豐富多元,有泛娛樂直播、遊戲直播,語音直播,主播端開播,當然還有媒體官方直播間,電商直播等。
抖音直播安卓端研發黎新很快發現了一個問題,因為一個功能會在多個型別的直播間存在,基於這個背景,前期如果沒有一個很好的框架去支援,就需要通過人工方式去維護。
而安卓之前是用原生的XML模式去描述佈局檔案,不夠靈活,大量不同種的直播間的模式堆積冗雜在一起。
“當時有三四個XML檔案,存在大量重複性的程式碼和樣式描述。大家如果要做個新功能,需要在這三四個地方同時新增修改。隨著業務迭代開發,大量程式碼重複存在,對後面的迭代維護也不好,改起來費勁。”
黎新開始和團隊同事討論,能不能嘗試用程式碼寫佈局?把砌牆方式變成組裝式,儘管這種新方式存在不夠直觀、沒有全域性感的兩個短板,但能通過兩個外掛來彌補。
這是個比較激進的嘗試,但leader就鼓勵我、給我時間。
先做出來再說,不要擔心其它事情。
歷經一個雙月,黎新開發了一個視覺化的XML逆向生成工具,使直播間layout inspector速度比官方提升了100倍;此外,他還改變了在直播間下的開發方式,開發期間想看程式碼是否像預期一樣執行,點個按鈕就會渲染到手機端,不需要重新編譯安裝。
在這支成立一年多的直播研發團隊裡,還有許多如黎新、武揚、原明等一樣享受創新的年輕技術人。他們站在一個巨大流量平臺上,大膽展開著一次又一次新嘗試。
有同學說,做直播的魅力是,大家可以很快聚焦,拆解複雜專案。不少上線前,大家都認為是不可能的事,但是就是做到了。
“從問題中,我發現我們的邊界也越來越廣,有意思的東西越來越多。”
加入直播研發團隊
【社招崗位】
後臺核心研發工程師
服務端測試開發工程師
客戶端Android/iOS開發工程師
前端開發工程師
圖形/影象開發工程師
↓掃碼投遞
【實習生崗位】
客戶端研發實習生
測試實習生
前端開發實習生
後端研發實習生
圖形/影象研發實習生
↓掃碼投遞
↓更多「直播」校招崗位持續熱招中