每秒高達千萬分發,如何應對直播互動平臺中海量消息挑戰?

由於直播平臺的特點,對系統功能設計的可靠性要求更高,同時,如何在直播火熱的當下快速實現直播平臺的構建,成爲很多企業的現實需求。本文主要分享融雲直播互動系統的設計與實踐,詳細介紹禮物、紅包等以消息爲基礎的互動方案設計思路和實踐方案並闡述如何結合融雲自身技術優勢,助力直播企業快速佈局市場。

直播互動平臺的特點

融雲於 2014 年成立時,國內直播平臺還未大批興起,當時我們只提供聊天室服務。2015   年,源於大量客戶對直播互動的需求,融雲預見直播平臺未來會有很好的前景,於是開始與客戶積極交流來挖掘需求,最終我們將聊天室轉變爲直播互動平臺。經歷了 2016 年一個完整的直播元年,直播互動系統也正式步入了成熟期。


目前,融雲主要做實時通信雲平臺,就是所謂的 IM 雲,提供包含單聊、羣聊、客服、推送、公衆賬號、直播平臺等雲服務。得益於 2016 年直播市場的異常火熱,平臺每天可達到對外產生 2200 億條消息,峯值每小時 450 億,每秒高達千萬的分發。


直播互動平臺的特點是什麼呢?我們做視頻直播的時候,可能有用戶需要跟主播以及其他用戶發一些文字消息、點贊消息等等進行互動,由於這些消息的存在,把以前單純的只是受衆於視頻的應用這種視頻直播,變成了可以進行互動的平臺。


用戶在平臺發消息進行互動,這個互動場景和聊天室類似,就是用戶加入聊天室,可收到別人的消息,同時也可發送消息,用戶下線時消息不再進行推送,這個場景實際上可以滿足簡單的直播互動。


相較其他 IM 來講,沒有離線消息存儲,也沒有離線消息 Push,在業務形態來講,聊天室比較簡單一些。


如下是直播互動平臺的主要特性:

  • 直播互動平臺的用戶量實際是無上限的,因爲不可能去限制一個主播加入觀衆的成員數量。

  • 通過把消息進行分級控制的方式來保證禮物、紅包等消息傳輸的可靠性。

  • 瞬時消息吞吐量大,融雲某個聊天室曾經一秒鐘產生過近千萬的消息。

  • 針對伸縮及穩定性方面的高要求。


消息平臺的邏輯設計及設計原理

消息是直播互動系統最重要的元素,消息處理做的好不好會直接影響用戶的體驗。融雲的消息平臺邏輯設計是怎樣的呢?



如上圖,我用一張時序圖針對這個問題進行了解答。A 客戶端是發消息方,服務端是融雲整個後端平臺,B 客戶端是接收消息方。


首先,客戶端向服務端發送消息,服務端接收消息先進行消息驗證,消息驗證裏面包含了高危詞、敏感詞的過濾,反垃圾系統對消息進行反垃圾的過濾及權限驗證。


當消息通過之後,對消息優先進行存儲,之後會給 A 客戶端返回應答,告知消息已經發送成功,這時服務端會遍歷成員分發通知。


值得注意的是,現在還沒有向客戶端發送消息實體,當接收客戶端接收消息通知時,會從自己本地存儲裏面拿到當前直播間裏面最新的消息版本號。


同時向服務器發起同步請求,服務器獲取客戶提交的版本號之後,會以這個版本號爲起點,到最新版本號把所有消息全部拿回來返回給客戶端,客戶端收到這個消息進行消息展示以及存儲這個最新版本號。


整個通信流程,版本號獲取方式,跟常用版本控制軟件比較類似。之所以把流程變得這麼複雜,在發送完通知之後再同步消息,主要原因如下:

  • 通知的推送重試可以依賴 TCP 的重試,無須邏輯保障。

  • 服務器端存儲的消息順序與到達的客戶端順序一致。

  • 當消息密集時可以將多條消息進行合併。

  • 可以控制下發的消息條數。

  • 以存儲分級實現消息分級。

  • 不以消息數量衡量服務器規模,以在線用戶數量做爲考量。


消息平臺在服務端實現細節及最佳應用實踐

直播消息系統在服務端的實現細節,主要從數據預處理、消息分級、消息存儲和消息分發隊列四方面進行介紹,但在實際服務開發過程中,還有很多優化。


數據預處理

當服務端接收消息之後,優先對數據進行序列化以及存儲,序列化消息和要下發的客戶端數據要保持一致,通過這種預處理的方式,CPU 的使用率在當前基礎上降低了  30%。


消息分級存儲

根據消息類型按照中、高、低序列進行分級存儲。


Skiplist 轉化爲環形隊列存儲

每條消息有唯一且遞增版本號,消息按照版本號順序存儲。這樣的數據在內存存儲情況下,跳錶是一種非常合適的數據結構。


但是,跳錶時間複雜度和空間複雜度比較大,同時往跳錶中插入數據時使用的鎖範圍非常大,會對服務器產生一些額外的開銷。之後,由跳錶演進成一種類似環形隊列的數據結構,會對服務器性能開銷提升很多。


Map 與隊列構建複合數據結構,降低無意義消費

服務端下發通知,對於通知來講在這一時刻無論有多少條消息,每個用戶只有一條通知,通過 Map 與隊列構建這樣的複合結構進行存儲。


隊列裏面存儲是數據的指針,Map 存儲用於下發的通知實體,Map 使用的 key 爲用戶標識,這樣可以降低無意義的消費。


融雲線上直播互動平臺的整體架構

直播互動平臺的 2.1 架構



如上圖,是融雲線上 2.1 架構圖,可分爲連接層、業務層和存儲層等,連接層和業務層構建成整個大的集羣,然後進行服務。


連接層主要是負責客戶端與服務器保持長連接,同時將客戶端的協議與內部服務的協議進行相互轉化。

業務層負責 IM 相關業務處理,採用的是微服務架構,線上服務有 40 多個類型,但對於直播互動平臺包含如下三項服務


  • 上行控制服務。主要目的是用於處理接收的上行客戶端的消息,進行敏感詞和高危詞的過濾。這個服務的負載方式採用的是隨機分配。

  • 直播服務。負責維護直播間的成員關係和負責接收上行控制服務給它的消息,上行控制服務會先期進行消息拋棄,拋棄到直播服務可以接收的範圍之內,然後將消息下發到直播服務,直播服務再廣播到直播消息服務。

  • 直播消息服務。負責給用戶進行分發通知,是以用戶 ID 進行一致的哈希方式進行負載。每個服務節點包含部分用戶關係。


整個直播消息服務構建了一個整體成員關係,等同於直播消息服務上的一個節點。這層除分發通知外,還負責客戶端同步拉取獲取的消息。


存儲層主要職責是用來存儲各種消息,數據等,含多個數據庫。


線上 2.1 架構和之前的架構相比,降低了直播服務壓力和上行總量的控制,但面臨的問題是需要更高的網絡質量要求。


直播互動平臺的網絡優化


如下圖,是鏈路架構 1.0:



鏈路架構 1.0,線上進行網絡加速主要是加速海外業務。融雲選購了第三方海外專線鏈路,涉及全球五個國家,覆蓋歐洲、美洲以及中東、日本等等。


實現國際鏈路優化,就近區域接入的同時,又出現專線的流量過大,成本過高,跨國消息延時等問題。


如下圖,是鏈路架構 2.0:



鏈路架構 2.0 採用模擬 CDN 模式進行數據分發,專線內只跑上行消息和廣播消息的方式。


融雲提供的是直播互動平臺,是一個基礎的 PAAS 服務,本身並不會去做直接面對用戶的直播  APP。未來,它也會不停地向前探索,如降低專線的依賴,數據中心進行鏈路選擇等。


以上內容根據李淼老師在 WOTA2017 “高性能直播系統架構”專場的演講內容整理。


負責融雲後端服務平臺的設計和架構工作,2007-2013 年就職於移動飛信團隊,歷任高級技術經理,架構師,一直關注大規模高併發系統設計和研究。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章