導讀:直播彈幕是直播系統(tǒng)的核心功能之一。如何迅速作出一個有很好擴展性的彈幕系統(tǒng)?如何應(yīng)對業(yè)務(wù)迅速發(fā)展?相信很多工程師/架構(gòu)師都有自己的想法。本文作者是美拍的架構(gòu)師,經(jīng)歷了直播彈幕從無到有,從小到大的過程。本文是作者對構(gòu)建彈幕系統(tǒng)的經(jīng)驗總結(jié)。
直播彈幕指直播間的用戶,禮物,評論,點贊等消息,是直播間交互的重要手段。美拍直播彈幕系統(tǒng)從 2015 年 11 月到現(xiàn)在,經(jīng)過了三個階段的演進,目前能支撐百萬用戶同時在線。比較好地詮釋了根據(jù)項目的發(fā)展階段,進行平衡演進的過程。這三個階段分別是快速上線,高可用保障體系建設(shè),長連接演進。 一、快速上線 消息模型 美拍直播彈幕系統(tǒng)在設(shè)計初期的核心要求是:快速上線,并能支撐百萬用戶同時在線。基于這兩點,我們策略是前中期 HTTP 輪詢方案,中后期替換為長連接方案。因此在業(yè)務(wù)團隊進行 HTTP 方案研發(fā)的同時,基礎(chǔ)研發(fā)團隊也緊鑼密鼓地開發(fā)長連接系統(tǒng)。 直播間消息,相對于 IM 的場景,有其幾個特點
對于用戶來說,在直播間有三個典型的操作:
我們把禮物,評論,用戶的數(shù)據(jù)都當做消息來看待。經(jīng)過考慮選擇了 Redis 的 sortedset 存儲消息,消息模型如下:
因此總的流程是
不過這里有一個隱藏的并發(fā)問題:用戶可能丟消息。 如上圖所示,某個用戶從第6號評論開始拉取,同時有兩個用戶在發(fā)表評論,分別是10,11號評論。如果11號評論先寫入,用戶剛好把6,7,8,9,11號拉走,用戶下次再拉取消息,就從12號開始拉取,結(jié)果是:用戶沒有看到10號消息。 為了解決這個問題,我們加上了兩個機制:
消息模型及并發(fā)問題解決后,開發(fā)就比較順暢,系統(tǒng)很快就上線,達到預先預定目標。 上線后暴露問題的解決 上線后,隨著量的逐漸增加,系統(tǒng)陸續(xù)暴露出三個比較嚴重的問題,我們一一進行解決 問題一:消息串行寫入 Redis,如果某個直播間消息量很大,那么消息會堆積在 Kafka 中,消息延遲較大。 解決辦法:
問題二:用戶輪詢最新消息,需要進行 Redis 的 ZrangByScore 操作,redis slave 的性能瓶頸較大 解決辦法:
解釋:這里本地緩存與平常使用的本地緩存問題,有一個最大區(qū)別:成本問題。 如果所有直播間的消息都進行緩存,假設(shè)同時有1000個直播間,每個直播間5種消息類型,本地緩存每隔1秒拉取一次數(shù)據(jù),40臺前端機,那么對 Redis 的訪問QPS是 1000 * 5 * 40 = 20萬。成本太高,因此我們只有大直播間才自動開啟本地緩存,小直播間不開啟。 問題三:彈幕數(shù)據(jù)也支持回放,直播結(jié)束后,這些數(shù)據(jù)存放于 Redis 中,在回放時,會與直播的數(shù)據(jù)競爭 Redis 的 cpu 資源。 解決辦法:
解釋:回放時,讀取數(shù)據(jù)順序是: local cache -> Redis -> mysql。localcache 與回放 Redis 都可以只存某個直播某種消息類型的部分數(shù)據(jù),有效控制容量;local cache與回放 Redis 使用SortedSet數(shù)據(jù)結(jié)構(gòu),這樣整個系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)都保持一致。 二、高可用保障 同城雙機房部署 分為主機房和從機房,寫入都在主機房,讀取則由兩個機房分擔。從而有效保證單機房故障時,能快速恢復。
全鏈路的業(yè)務(wù)監(jiān)控 高可用保障建設(shè)完成后,迎來了 TFBOYS 在美拍的四場直播,這四場直播峰值同時在線人數(shù)達到近百萬,共 2860萬人次觀看,2980萬評論,26.23億次點贊,直播期間,系統(tǒng)穩(wěn)定運行,成功抗住壓力。 使用長連接替換短連接輪詢方案 長連接整體架構(gòu)圖如下 詳細說明:
長連接消息模型 我們采用了訂閱推送模型,下圖為基本的介紹 舉例說明:用戶1訂閱了A直播,A直播有新的消息
如果是大直播間(訂閱用戶多),那么推送層與連接層的告知/拉取模型,就會自動降級為廣播模型。如下圖所示 我們經(jīng)歷客戶端三個版本的迭代,實現(xiàn)了兩端(Android 與 iOS)長連接對短連接的替換,因為有灰度和黑白名單的支持,替換非常平穩(wěn),用戶無感知。 總結(jié)與展望 回顧了系統(tǒng)的發(fā)展過程,達到了原定的前中期使用輪詢,中后期使用長連接的預定目標,實踐了原定的平衡演進的原則。從發(fā)展來看,未來計劃要做的事情有
號外: 美圖架構(gòu),專注于虛擬化平臺建設(shè)、流媒體、云存儲、千萬同時在線的通訊服務(wù)、音視頻編解碼等基礎(chǔ)設(shè)施建設(shè),現(xiàn)急需相關(guān)領(lǐng)域愛好者加入,工作地點可自由選擇北京、廈門、深圳,待遇從優(yōu),美女多多?,F(xiàn)緊缺崗位如下:
|
|