在研究如何使視頻通話在將來更高效,更易於擴展時,Facebook意識到,最好的方法是從頭開始從新設計庫並重寫整個庫,也就是Rsys。
做者 / Ishan Khotweb
原文連接 / https://engineering.fb.com/20...segmentfault
Facebook的視頻通話初始版本是在一個已有7年曆史的WebRTC分支上編寫的,專門用於在Messenger中啓用本機音頻通話。當時,咱們的目標是爲咱們的用戶提供功能最豐富的體驗。從那時起,咱們添加了視頻通話,羣組通話,視頻聊天引擎和交互式AR效果。每個月有數百萬人使用視頻通話,這個功能齊全的庫表面上看起來簡單,但在幕後卻變得複雜得多。咱們有大量特定於Messenger的代碼,這使得咱們很難支持像Portal和Instagram這樣的應用程序。對於組調用和對等調用,咱們有單獨的信令協議,這要求咱們編寫兩次特徵,並在代碼庫中形成很大的不一致。咱們還花費了更多的時間來更新WebRTC的分支,並使用開源的最新改進功能。但最後,咱們發現咱們在爲低功耗設備和低帶寬場景提供可靠服務方面落後了。網絡
在研究如何使視頻通話在將來更高效,更易於擴展時,咱們意識到,最好的方法是從頭開始從新設計庫並重寫整個庫。結果就是Rsys,這是一個視頻通話庫,它讓咱們可以利用自2014年編寫原始庫以來在視頻通話領域取得的一些重大進步。與之前的版本相比,Rsys縮小了約20%,而且可在全部開發中使用平臺。經過這一新的迭代,咱們將從新構想咱們對視頻通話平臺的見解,並從頭開始使用新的客戶端核心和可擴展性框架。這有助於咱們提高本身的最早進技術,新的代碼庫旨在在將來十年保持可持續性和可擴展性,爲跨應用程序的遠程存在和互操做性奠基基礎。架構
不管設備類型或網絡條件如何,使用較小的代碼庫能夠爲其用戶實現更快地加載、更新和啓動。相比之下,小型庫也更易於管理、更新、測試和優化。當咱們開始考慮準備新的版本時,咱們的峯值二進制大小已高達20 MB。儘管咱們能夠經過編輯一些代碼段來減小一些內容,可是要達到咱們想要的效果,咱們意識到咱們須要從頭開始重寫整個代碼庫。框架
想要得到較小的庫,最簡單方法是去掉多年來咱們添加的許多功能特徵,可是對咱們來講,保留全部最經常使用的功能(如AR效果)很重要。所以,咱們退後一步,研究瞭如何應用過去十年中所學到的知識以及咱們對現在使用咱們產品的用戶的需求瞭解。探索完咱們的這些選擇以後,咱們決定須要越過接口,並深刻研究庫自己的基礎結構。ide
咱們作了幾個架構選擇來優化大小,引入了一個即插即用的框架,使用selects有選擇地將特徵編譯到須要它們的應用程序中,並引入了一個通用框架來編寫基於Flux架構的新特性。咱們也從Folly這樣的模板化通用庫轉向了像Boost這樣規模更優的庫。SML在全部應用程序中實現大小增益。單元測試
最後,咱們將核心二進制文件的大小減小了大約20%,從大約9MB減小到大約7MB。咱們經過從新構建咱們的特徵以適應簡化的體系結構和設計來實現這一點。雖然咱們保留了大部分特性,但隨着時間的推移,咱們將繼續引入更多可插入特性。更少的代碼行數使代碼庫更輕、更快、更可靠,而精簡的代碼庫意味着工程師能夠更快地進行創新。測試
這項工做的主要目標之一是最小化代碼複雜性和消除冗餘。咱們知道,一個統一的體系結構將容許全局優化(而不是讓每一個特性都集中在局部優化上),並容許代碼重用。爲了構建這個統一的體系結構,咱們作了一些主要的更改:優化
用於調用的Rsys架構編碼
現在,咱們的調用平臺明顯要小得多,而且可以在許多不一樣的用例和平臺上擴展。咱們支持天天都有數百萬人使用的電話。咱們的庫是咱們全部主要通話應用程序的一部分,包括Messenger,Instagram,Portal和Workplacechat。構建Rsys須要一個很長的過程,可是,對於使用這些應用程序的人們來講,它的感受並無太大不一樣。它將繼續爲人們提供出色的通話體驗。但這僅僅是開始。
咱們在Rsys中所作的工做將使咱們在邁向將來的過程當中可以繼續創新和擴展咱們的通話體驗。除了構建可在將來十年或更長時間保持可持續發展的庫以外,這項工做還爲咱們全部應用的跨應用調用奠基了基礎。它也爲咱們創建以遠程存在爲中心的環境奠基了基礎。
這項工做得益於與客戶平臺團隊合做。咱們感謝全部爲Rsys作出貢獻的人,特別是Ed Munoz,Hani Atassi,Alice Meng,Shelly Willard,Val Kozina,Adam Hill,Matt Hammerly,Ondrej Lehecka,Eugene Agafonov,Michael Stella,Cameron Pickett,Ian Petersen和Mudit Goel在實施方面提供了幫助,並繼續提供指導和支持。