在研究如何使视频通话在将来更高效,更易于扩展时,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在实施方面提供了帮助,并继续提供指导和支持。