Facebook Live的擴充套件之道

2021-09-17 19:09:24 字數 1575 閱讀 4816

2023年4月18日和19日,facebook在san jose召開了一年一度的f8大會,本次大會通過facebook live進行了直播。designing for scale的博主wissam abirached通過facebook live**了這屆f8大會,他對facebook live是如何擴充套件以支援f8的這個問題產生了十分濃厚的興趣,因此撰寫了一篇名為《how facebook live scales》的文章,由此也引出了facebook live的很多細節。

\\ 早在2023年底,facebook的工程師就在《under the hood: broadcasting live video to millions》一文中介紹了faceook live的一些細節。facebook擁有龐大的使用者群,在面對流量尖刺的同時,還要盡可能降低延時以帶來更強的參與感,他們遇到了什麼問題,又是如何解決的呢?

\\ 首先是「驚群問題」(thundering herd problem),它會造成延時、丟幀,甚至是掉線,為了避免直播流伺服器(live stream server)被大量請求沖垮,facebook構建了由直播流伺服器、源伺服器(origin server)和邊緣快取(edge cache)組成的三層結構。使用者訪問最近的邊緣快取,邊緣快取負責回源,源伺服器向直播流伺服器取得實際的內容。\\

\\ facebook的arun moorthy在《connecting the world: a look inside facebook』s networking infrastructure》中對facebook的全球節點做過介紹,資料中心主要在北美和歐洲,而邊緣節點更是幾乎遍布全球(除了南北極),加之還有自己定製的伺服器、機櫃與網路結構。在這樣的基礎設施支援下,facebook live的伺服器能盡可能地靠近使用者。

\\ 如果某個邊緣快取負載過高,負載均衡器會將請求重定向到離該節點最近的另乙個尚可提供服務的邊緣快取上,負載均衡器能夠**目標節點的負載情況,這是乙個非常實用的功能。

\\ 在這種情況下,仍然會有1.8%的請求透過邊緣快取落到源伺服器上,在海量請求下,1.8%也是乙個很大的數字。為了應對這個問題,邊緣快取只會讓第乙個請求回源,其他的相同請求則放在乙個佇列中,等第乙個請求的結果返回了,它們也就不用再回源了。源伺服器上也有類似的請求合併回源處理機制。wissam abirached在文章中提到,如果使用nginx,可以將proxy_cache_lock設定為on開啟請求合併功能。

\\ 值得一提的是,國內的一些直播服務提供商也擁有與facebook類似的架構,針對海量請求做了各種優化,可以說不亞於facebook。比如,七牛雲白順龍的《移動cdn及直播效能優化》(這篇《七牛直播雲效能優化實踐》部落格的內容也是一樣的),又拍雲黃慧攀的《雲直播系統架構與實施》,兩者都提到了類似facebook的多層伺服器結構和網路智慧型排程系統(可能大家在節點部署上略有不同,畢竟服務的目標更多是在國內),能夠在極大程度上保證使用者的體驗。大家也都對直播常用的協議進行了說明,介紹了rtmp、hls和http-flv,以及它們分別適用的場景,在各自系統中的位置。

\\ 此外,上述兩個演講中還提到了一些其他的優化,比如gop快取的權衡、多位元速率支援和http-dns等等,相信facebook也有類似的處理。

\\

構建Facebook Live直播流中的挑戰

針對在擴充套件性上的挑戰,kulkarni指出,併發直播流的數量和全部直播流的總計 者數量都是可 的,因此並不存在多少挑戰性問題。真正的問題在於,單一直播流上的 者數量不定,從寥寥數人到門庭若市。因為 者是不可 的,也就無法對其做出規劃。為解決該問題,facebook採用了快取和直播流分配這兩種方法...

wdcp mysql擴充套件 wdcp的安裝擴充套件模組

其實就是官方包裡面的所有附加模組全部支援啦.是在官方的基礎上修改的 優化了每次都解壓縮php原始碼包,按需解壓縮 使用方法如下 wget sh ext.sh 然後選擇php版本 接下來選擇要編譯的模組,直接輸入模組名即可 目前官方2個版本,這裡也是兩個,和官方同步 另外說下,官方php5.3是5.3...

C 擴充套件 2 Random的擴充套件

在.net中關於random一共也只有這幾個方法 摘要 表示偽隨機數生成器,一種能夠產生滿足某些隨機性統計要求的數字序列的裝置。comvisible true public class random 提供的方法很少,所以我們很有必要我們可以擴充套件一下 public static t nextenu...