具备构建横跨全球的分布式服务能力的公司寥寥无几,甚至比拥有核武器的国家还要少。然而,Facebook就是这样的一个公司,它的视频流直播系统Facebook Live就是一个横跨世界的分布式服务。Facebook的CEO Mark Zuckerberg说:

我们做了一个重大决定,把更多的精力集中在视频直播上。因为直播是一种新兴的方式,跟过去五年甚至十年的那些离线视频不一样……我们正迎来视频的新黄金时期。如果把时间快进五年,人们在Facebook上看到的和他们每天分享的大部分内容都是视频,这对我来说一点也不惊奇。

如果你身处广告行业,还有什么比获得源源不断的可作为广告载体的内容更能激动人心?这些内容不拘一格地出现,持续增长,永不停息。谷歌在这上面打起了如意算盘,开始把广告业务的重心压在呈指数级增涨的Web上。

能够体现Facebook在流视频方面具有强大能力的例子,当属那个两人使用橡皮圈撬开一个西瓜的视频。这个视频时长45分钟,高峰时段有80万人同时在线观看,这些观众还给出了30万份评论。对于一个拥有15亿用户的社交网络来说,这样的并发量可以说已经达到了病毒级规模。

2015年的Super Bowl(美国国家美式足球联盟年度冠军赛)有1亿1千4百万观众,其中大概有236万观看的是视频直播。在2015年的E3游戏展期间,Twitch直播系统高峰期用户达到84万。9月16日的共和党辩论在高峰时有92万1千人同时在线观看直播。

这么看来,Facebook也已经是名列前茅了。这里要注意的是,Facebook在同一时间还要处理其它大量的视频流。

有一篇文章引用了Facebook首席产品官Chris Cox的话,他说Facebook:

  • 有超过100人同时工作在Live项目上(刚开始只有12个人,现在有150多人)

  • 希望并发直播流的服务能力可以达到百万级别

  • 希望可以做到单个流支持百万并发用户,还能无缝地支持跨设备、跨地域的视频流服务

Cox说“我们发现这是一个非常具有挑战性的基础设施问题”。如果把我们解决这个问题的细节公之于众应该会很有趣的吧?天啊!不过等等,我们会这么干的!

Federico Larumbe来自Facebook流量团队,他负责的缓存系统支撑着Facebook的CDN和全局负载均衡器。他为我们带来了“横向扩展Facebook Live”的出色演讲,分享了Live的一些工作细节。

下面是我对这次演讲做的笔记,它真的令人印象深刻。

最初的故事

Live是一个可以让人们实时分享视频的新项目。它在2015年4月份启动,当时只能通过Mentions使用,作为少数高端人士与他们粉丝之间的互动工具。在之后的一年里,产品不断改进,协议也在迭代更新。

他们开始使用HLS,也就是HTTP Live Streaming。iPhone开始支持Live,并允许他们使用现有的CDN架构。

同时对RTMP(Real-Time Messaging Protocol)进行调研,RTMP是一个基于TCP的协议。手机端分别有一个视频流和音频流被发送到Live Stream服务器。

  • 优点:RTMP缩短了从广播者到观看者之间的延迟,这个对广播来说意义重大。减少几秒钟的延迟,从用户体验方面来说就是一个很大的改进。

  • 缺点:需要全新的架构,因为它不是基于HTTP的。需要开发新的RTMP代理,这样才能大规模使用。

同时调研了MPEG-DASH(基于HTTP的动态自适应流)。

  • 优点:相比HLS,它可以节省15%的空间。

  • 缺点:它支持自适应比特率,编码质量取决于网络的吞吐量。

不同的直播视频引起的问题

之前提到的撬西瓜视频的流量模式:

  • 刚开始增涨很快,在几分钟内就超过每秒100个请求,然后持续增涨,直到视频结束。

  • 然后流量呈断崖式下降。

  • 换句话说,流量的形状就像一个尖刺。

直播视频跟一般的视频不一样,它的流量模式呈尖刺状。

  • 直播视频更吸引人,比一般视频会多出3倍以上的浏览量。

  • 直播视频会出现在显眼位置,更有可能被浏览到。

  • 网站的忠实用户会收到通知,所以有更多的人可能会看到视频。

  • 尖刺流量模式会给缓存系统和负载均衡器带来一些问题。

缓存系统问题

  • 有可能很多用户同时观看视频直播。这样会造成惊群(Thundering Herd)问题。

  • 尖刺流量模式会给缓存系统带来压力。

  • 视频按秒分段存储,缓存视频分段的服务器有可能在流量高峰时过载。

全局负载均衡问题

  • Facebook的PoP(Point of Presence)服务器分布在世界各地,流量通过全局进行分发。

  • 如何防止高峰流量拖垮PoP是个具有挑战性的问题。

全局架构

视频直播流从主播端到观众端的流程是这样的:

  • 主播在他们的手机上发起一个视频直播。

  • 手机把RTMP流发送到Live Stream服务器上。

  • Live Stream服务器对视频流进行编码并转成多种比特率。

  • 服务器为每种比特率持续地生成MPEG-DASH分段。

  • 分段被存储在数据中心的缓存里。

  • 分段从数据中心的缓存转发到PoP的缓存里。

  • 观众端接收直播流。

  • 观众端设备上的播放器以一定的速率从PoP缓存里获取分段。

如何横向扩展

  • 在数据中心缓存和PoP缓存之间存在一个多路分发点。用户访问的是PoP缓存,而不是数据中心缓存,而且有很多PoP缓存分布在世界各地。

  • 在每个PoP里也有多路分发机制。

  • PoP内部被分为两层:一层是HTTP代理,一层是缓存。

  • 用户向HTTP代理请求分段,代理检查分段是否已经在缓存里,如果是,就返回分段,否则请求会被发送到数据中心。

  • 不同的分段被存储在不同的缓存里,这样有助于在多个缓存主机间进行负载均衡。

避免数据中心出现惊群效应

  • 如果所有用户同时对同一个分段发起请求会出现什么情况?

  • 如果分段不在缓存里,所有请求都会被发送到数据中心。

  • 合并请求。在PoP缓存里使用合并请求可以减少发送请求的数量,这样只有一个请求会被发送给数据中心。其它请求会等待第一个请求返回的响应,然后把数据返回给用户。

  • 增加一个新的缓存层,避免出现热点服务问题。

    - 所有用户向的请求都发给同一个主机会造成该主机过载。

    - 在代理里增加缓存层。只有第一个请求会访问到缓存,代理会处理剩下的请求。

PoP还存在风险,需要全局负载均衡来救场

  • 数据中心的惊群问题得到了解决,但PoP仍然存在风险。Live存在的一个问题是,在PoP达到负载均衡器的负载指标之前,高峰流量已经让PoP发生过载。

  • 每个PoP的服务器数量和连接带宽都是有限的。如何避免PoP在高峰时发生过载?

  • 一个叫Cartographer的系统把子网跟PoP映射起来,它会对每个子网和PoP之间的延时进行监测。

  • 在知道每个PoP负载的情况下,用户请求会被发送到距离最近的可用PoP上。代理有一个负载计数器记录了它们的负载情况。通过收集这些计数器我们就可以知道每个PoP的负载情况。

  • 现在出现了对PoP处理能力的约束和最小化延迟的优化问题。

  • 控制系统在收集指标和作出反应方面存在延时。

  • 他们把指标收集时间从一分半钟减少到3秒,不过3秒仍然是延迟。

  • 解决方案是对负载进行预测。

  • 他们实现了一个负载评估器,通过前一个负载和当前负载来推断后面的负载。

    - 如果当前负载是增加的,那么评估器如何能推断下一个负载会减弱?

    - 他们使用了三次样条插值(Cubic Spline Interpolation)功能。

    - 先获得第一个和第二个导数,如果速度是正数,说明负载在增加。如果加速度是负数,那么说明速度在下降,并最终变成零。

    - 三次样条插值可以预测更复杂的流量模式,不仅仅是线性模式。

    - 避免振动。

    - 插值功能同时解决了振动问题。

    - 指标收集和反应出现延迟说明数据已经过时。插值会减小误差,预测更准确,同时减少振动。这样负载就可以接近预设值。

    - 目前的预测是基于前三次的时间间隔,每个间隔30秒,所以得出的结果几乎是实时的。

测试

  • 想办法让PoP过载。

  • 构建一个负载测试服务,为PoP模拟直播流量。

  • 模拟10倍于真实数据的负载。

  • 模拟每次请求一个分片的客户端。

  • 这个测试系统有助于发现和修补负载评估器的漏洞,用以调整配置参数,并验证用于解决惊群问题的缓存层是否工作正常。

上传的可靠性

  • 实时上传视频是一个挑战。

  • 举个使用100Kbps到300Kbps的网络带宽上传视频的例子。

  • 音频需要64Kbps的吞吐量。

  • 标准分辨率的视频需要500Kbps的吞吐量。

  • 手机的自适应码率用于协调视频跟音频之间的吞吐量差值。视频的码率根据实际可用的网络带宽进行调整。

  • 手机根据已通过RTMP上传的字节数和上一个间隔的平均权重来决定上传的码率。

未来的方向

  • 使用推送机制代替轮询机制,在发送分片请求前,使用HTTP/2把分片推送到PoP上。

-END-

欢迎关注“互联网架构师”,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们只聊互联网、只聊架构,不聊其他!打造最有价值的架构师圈子和社区。

本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。

  • 长按下方的二维码可以快速关注我们

  • 如想加群讨论学习,请点击右下角的“加群学习”菜单入群

Facebook是如何支持80万并发视频流直播的?相关推荐

  1. 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求

    由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误. 为了避免这样的错误,我们根据相关文档调整了设置,让服务器从设置上支 ...

  2. 让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求--转载

    今天下午17点左右,博客园博客站点出现这样的错误信息: Error Summary: HTTP Error 503.2 - Service Unavailable The serverRuntime@ ...

  3. [转载]让Windows Server 2008 + IIS 7+ ASP.NET 支持10万并发请求

    由于之前使用的是默认配置,服务器最多只能处理5000个同时请求,今天下午由于某种情况造成同时请求超过5000,从而出现了上面的错误. 为了避免这样的错误,我们根据相关文档调整了设置,让服务器从设置上支 ...

  4. MySQL单机并发量_mysql百万并发量-MySQL集群能支持100万个并发请求吗

    当然支持100万并发. 首先,我们必须做出决定,把阅读和写作分开. 然后,它取决于你需要分配多少个单元用于写作和阅读. 我的SQL集群不建议您使用它,因为有太多的错误. 所有这些都需要先进行压力测试. ...

  5. 一台mysql并发能力_mysql怎么支撑百万级并发-对于同一个表,MySQL支持多少个并发操作...

    到服务器的SQL最大并发连接数为16384.mysql百万级数据查询. 受服务器配置和网络环境的限制,实际服务器支持的并发连接数量会更小. MySQL流量大,并发问题高 因为mysql是一个线程的连接 ...

  6. android 高并发服务端,GitHub - android-coco/chat: 支持10万人同时在线 Go语言打造高并发web即时聊天(IM)应用...

    IM 支持10万人同时在线 Go语言打造高并发web即时聊天(IM)应用 部署前准备 配置文件 config/config.yml 样例: # 服务端监听配置 service: port: :8181 ...

  7. Meta首份元宇宙白皮书9大看点,瞄准80万亿美元市场

    近日,Meta委托国际经济咨询公司Analysis Group编写了一份元宇宙白皮书,该报告以移动设备的发展为依据,预测了元宇宙技术对全球经济的影响. 该报告主要分为四个部分:元宇宙的应用及挑战.移动 ...

  8. 100万并发连接服务器

    100万并发连接服务器笔记之准备篇 前言 测试一个非常简单服务器如何达到100万(1M=1024K连接)的并发连接,并且这些连接一旦连接上服务器,就不会断开,一直连着.  环境受限,没有服务器,刚开始 ...

  9. ab压力 failed_ab压力测试的安装、使用、破2万并发测试

    ab压力测试 ab的简介 ab命令是Apache Bench的缩写. ab命令是Apache自带的压力测试工具. ab命令非常的实用,它不仅可以对Apache服务器进行压力测试,也可以对其它的WEB服 ...

  10. 30岁测试开发年薪不足80万,还要被面试官diss混得太差?

    近日,有网友发帖称:"30岁去应聘测试开发,拿不到七八十万的年薪确实有点丢人了,还被面试官diss混得太差了",网友们看完都炸了. ​ 来看看网友们都是怎么说的. ​ @有网友说: ...

最新文章

  1. Wake-On-LAN待机或休眠模式中唤醒
  2. 将BYTE[] 输出到edit控件中
  3. 分布式缓存服务器设计原理
  4. saltstack配置管理之YAML(二)
  5. const形参与非const形参
  6. 推翻Hinton NeurIPS论文结论!审稿人评价:该文章在标签平滑和知识蒸馏的关系上取得了重大突破!...
  7. V4L2框架分析学习二
  8. .NET 6新特性试用 | PriorityQueue
  9. 【LeetCode笔记】279. 完全平方数(Java、动态规划)
  10. TreeView 数据库绑定实例
  11. 数字的补数——力扣476
  12. [Lintcode]66. Binary Tree Preorder Traversal/[Leetcode]144. Binary Tree Preorder Traversal
  13. Python 面向对象(OOP)基本概念
  14. jquery级联下拉框
  15. JAVA版村庄哨塔种子_我的世界:TOP18种子,刷怪笼、哨塔和村庄挤在一起,还不来试试?...
  16. JAVA项目-学生成绩管理系统
  17. 一网打尽Mac上的高效工具 - 系统工具篇(附演示视频)
  18. 分立元器件——电感器
  19. nokia专业显示器测试软件,Nokia Monitor Test(
  20. [caffe] Long-term Recurrent Convolutional Networks

热门文章

  1. 解密jQuery内核 DOM操作
  2. UITableView的复用过程
  3. E-MapReduce 2.0.0 版本发布
  4. declare-styleable中format详解
  5. SQL2008系统统计函数
  6. 中国行业应用软件领域恶性循环的原因是什么?【转载】
  7. [蛋蛋四格漫画]-贺沪江日语四周年版庆
  8. 国人项目,上Github全球热榜了!! 来瞅瞅,你会发现相见恨晚
  9. git 操作 中文文件名的时候,显示乱码 ,解决方法
  10. 14 英寸与 16 英寸 MacBook Pro 应该购买哪一款,M1 Pro 还是 M1 Max Mac?