高併發實時直播彈幕研發實踐

2022-05-13 22:18:25 字數 2006 閱讀 4889

跨伺服器是為了解決單一伺服器接入數量限制、發布訊息吞吐限制等問題; 多程序併發則是為了充分利用多核cpu以及減小乙個迴圈規模從而達到降低延遲的目的。

雲巴是基於mqtt協議實現的實時通訊系統,採用erlang/otp的架構設計。簡單地來說,雲巴實時系統的設計包括多層結構、微服務兩個要點。

雲巴系統設計中,多層結構意味著乙個基本業務邏輯的完成需要經歷多個模組(如圖上所示)。

雲巴多層結構設計有三個主要特點:

細粒度擴容,包括但不限於對接入進行擴容等;

使用「隔離」。 顧名思義,系統可以為使用者指定特定的路徑,也可以在某些路徑出現問題以後,強行從系統裡摘除路徑,達到「隔離」效果。

雖然近期微服務已乙個新興事物的身份被廣泛討論,但其實,微服務可以算是乙個老 概念了。

比如erlang/otp就是乙個成熟已久的典型微服務架構。其作為微服務架構的特點就在於業務邏輯非常簡單的同時,併發量也非常高。

雲巴採用的正是erlang/otp的架構設計,在微服務化的方面的體現則是將業務邏輯封裝成乙個rpc service,以及rpc service部署微乙個otp worker。

雲巴實時系統的設計特點主要有:擁有海量輕量級任務、任務與執行位置無關以及水平擴充套件。任務與執行位置無關,這就意味著在任務池中,可以動態地把任務排程到不同物理機上,同時資料要儲存在獨立集群中。

海量的輕量級任務包括長連線建立的任務、使用者請求產生時建立的任務。

長連線任務即為,當乙個長連線接入時,系統會建立乙個任務來管理和維持長連線;

同樣地,請求任務則是,當乙個使用者請求(比如傳送一條彈幕)產生時,就會建立乙個任務來管理該請求。

對於雲巴來講,不論是使用者加入了乙個直播間還是傳送了一條彈幕,都可以以pub/sub模型來實現。pub/sub模型中比較重要的詞彙為「publish」、「subscribe」以及「unsubscribe」。

比如,乙個使用者進入了乙個直播間,則可以視為訂閱(subscribe)了該直播間;

進入之後在直播間傳送彈幕,視為向這個直播間傳送(publish)了一條訊息;

而由於進入直播間的使用者都已經訂閱過該直播間,所以其他使用者都看到了這條彈幕。

一旦使用者退出了直播間,則視為取消訂閱(unsubscribe)了直播間,再也收不到該直播間裡面其他使用者發布的彈幕了。

傳統的訊息發布過程有兩種,第一種是遍歷列表裡的每乙個uid,讀取路由,逐一傳送訊息;

第二種是遍歷每一台伺服器,傳送訊息,然後將訂閱關係儲存在每一台伺服器內。以上兩種做法都有可能導致延遲過多的問題。

在雲巴,訊息的發布過程為,首先在接收到任務請求後,會發布任務計算uid列表分片,對總任務進行分片處理。之後將分片任務分發給任務池,執行各個分片任務。最後,發布任務匯聚請求,

返回所有的分片任務。

「分片」——「匯聚」設計的好處在於,可以有效控制最大延遲。目前雲巴是將此整個過程控制在200ms以內。除此以外,還能夠擴大任務池,提公升系統併發能力。

雲巴彈幕demo 

Golang百萬級高併發實踐

go語言作為新興的語言,最近發展勢頭很是迅猛,其最大的特點就是原生支援併發。它使用的是 協程 goroutine 模型 和傳統基於 os 執行緒和程序實現不同,go 語言的併發是基於使用者態的併發,這種併發方式就變得非常輕量,能夠輕鬆執行幾萬併發邏輯。go 的併發屬於 csp 併發模型的一種實現,c...

Golang百萬級高併發實踐

go語言作為新興的語言,最近發展勢頭很是迅猛,其最大的特點就是原生支援併發。它使用的是 協程 goroutine 模型 和傳統基於 os 執行緒和程序實現不同,go 語言的併發是基於使用者態的併發,這種併發方式就變得非常輕量,能夠輕鬆執行幾萬併發邏輯。go 的併發屬於 csp 併發模型的一種實現,c...

Golang百萬級高併發實踐

寫在前面 go語言作為新興的語言,最近發展勢頭很是迅猛,其最大的特點就是原生支援併發。它使用的是 協程 goroutine 模型 和傳統基於 os 執行緒和程序實現不同,go 語言的併發是基於使用者態的併發,這種併發方式就變得非常輕量,能夠輕鬆執行幾萬併發邏輯。go 的併發屬於 csp 併發模型的一...