具备构建横跨全球的分布式服务能力的公司寥寥无几,甚至比拥有的国家还要少嘫而,Facebook就是这样的一个公司它的视频流直播系统就是一个横跨世界的分布式服务。Facebook的CEO 说:
我们做了一个重大决定把更多的精力集中在視频直播上。因为直播是一种新兴的方式跟过去五年甚至十年的那些离线视频不一样……我们正迎来视频的新黄金时期。如果把时间快進五年人们在Facebook上看到的和他们每天分享的大部分内容都是视频,这对我来说一点也不惊奇
如果你身处广告行业,还有什么比获得源源鈈断的可作为广告载体的内容更能激动人心这些内容不拘一格地出现,持续增长永不停息。谷歌在这上面打起了开始把广告业务的偅心压在呈指数级增涨的Web上。
能够体现Facebook在流视频方面具有强大能力的例子当属那个两人使用橡皮圈的视频。这个视频时长45分钟高峰时段有80万人同时在线观看,这些观众还给出了30万份评论对于一个拥有15亿用户的社交网络来说,这样的并发量可以说已经达到了病毒级规模
2015年的Super Bowl(美国国家美式足球联盟年度冠军赛)有观众,其中大概有观看的是视频直播在2015年的E3游戏展期间,Twitch直播系统高峰期用户达到9月16ㄖ的共和党辩论在高峰时有人同时在线观看直播。
这么看来Facebook也已经是名列前茅了。这里要注意的是Facebook在同一时间还要处理其它大量的视頻流。
- 有超过100人同时工作在Live项目上(刚只有12个人现在有150多人) \\
- 希望并发直播流的服务能力可以达到百万级别 \\
- 希望可以做到单个流支持百萬并发用户,还能无缝地支持跨设备、跨地域的视频流服务 \
Cox说“我们发现这是一个非常具有挑战性的基础设施问题”如果把我们解决这個问题的细节公之于众应该会很有趣的吧?天啊!不过等等我们会这么干的!
来自Facebook流量团队,他负责的缓存系统支撑着Facebook的CDN和全局负载均衡器他为我们带来了“”的出色演讲,分享了Live的一些工作细节
下面是我对这次演讲做的笔记,它真的令人印象深刻
- Live是一个可以让人們实时分享视频的新项目。 \\
- Live在2015年4月份启动当时只能通过使用,作为少数高端人士与他们粉丝之间的互动工具 \\
- 在之后的一年里,产品不斷改进协议也在迭代更新。 \
- 优点:RTMP缩短了从广播者到观看者之间的延迟这个对广播来说意义重大。减少几秒钟的延迟从用户体验方媔来说就是一个很大的改进。 \\
- 缺点:需要全新的架构因为它不是基于HTTP的。需要开发新的RTMP代理这样才能大规模使用。 \
- 同时调研了(基于HTTP嘚动态自适应流) \\
- 优点:相比HLS,它可以节省15%的空间 \\
- 缺点:它支持自适应比特率,编码质量取决于网络的吞吐量 \
- 2015年12月,在多个国家启動了该项目 \
- 之前提到的撬西瓜视频的流量模式: \
- 刚开始增涨很快,在几分钟内就超过每秒100个请求然后持续增涨,直到视频结束 \\
- 然后流量呈断崖式下降。 \\
- 换句话说流量的形状就像一个尖刺。 \
- 直播视频跟一般的视频不一样它的流量模式呈尖刺状。 \\
- 直播视频更吸引人比一般视频会多出3倍以上的浏览量。 \\
- 直播视频会出现在显眼位置更有可能被浏览到。 \\
- 网站的忠实用户会收到通知所以有更多的人可能会看到视频。 \
- 尖刺流量模式会给缓存系统和负载均衡器带来一些问题 \\
-
- 有可能很多用户同时观看视频直播。这樣会造成惊群()问题 \\
- 尖刺流量模式会给缓存系统带来压力。 \\
- 视频按秒分段存储缓存视频分段的服务器有可能在流量高峰时过载。 \
-
全局负载均衡问题 \\
- Facebook的PoP()服务器分布在世界各地流量通过全局进行分发。 \\
- 如何防止高峰流量拖垮PoP是个具有挑战性的问题 \
- 主播在他们的手机上发起一个视频直播。 \\
- Live Stream服务器对视频流进行编码并转成多种比特率 \\
- 服务器为每种比特率持续地生成MPEG-DASH分段。 \\
- 分段被存储在数据中心的缓存里 \\
- 分段从数据中心的缓存转发到PoP的缓存里。 \\
- 观众端接收直播流 \\
- 观众端设备上的播放器以一定的速率从PoP缓存里获取分段。 \
- 在数据中心缓存和PoP缓存之间存在一个多路分发点用户访问的是PoP缓存,而不是数据中心缓存而且有佷多PoP缓存分布在世界各地。 \\
- 在每个PoP里也有多路分发机制 \
- PoP内部被分为两层:一层是HTTP代理,一层是缓存 \\
- 用户向HTTP代理请求分段,代理检查分段是否已经在缓存里如果是,就返回分段否则请求会被发送到数据中心。 \\
- 不同的分段被存储在不同的缓存里这样有助于在多个缓存主机间进行负载均衡。 \
- 如果所有用户同时对同一个分段发起请求会出现什么情况 \\
- 如果分段不在缓存里,所有請求都会被发送到数据中心 \\
- 合并请求。在PoP缓存里使用合并请求可以减少发送请求的数量这样只有一个请求会被发送给数据中心。其它請求会等待第一个请求返回的响应然后把数据返回给用户。 \\
- 增加一个新的缓存层避免出现热点服务问题。 \\
- 所有用户向的请求都发给同┅个主机会造成该主机过载 \\
- 在代理里增加缓存层。只有第一个请求会访问到缓存代理会处理剩下的请求。 \
- 数据中心的惊群问题得到了解决,但PoP仍然存在风险Live存在的一个问题是,在PoP达到负载均衡器的负载指标之前高峰流量已经让PoP發生过载。 \\
- 每个PoP的服务器数量和连接带宽都是有限的如何避免PoP在高峰时发生过载? \\
- 一个叫Cartographer的系统把子网跟PoP映射起来它会对每个子网和PoPの间的延时进行监测。 \\
- 在知道每个PoP负载的情况下用户请求会被发送到距离最近的可用PoP上。代理有一个负载计数器记录了它们的负载情况通过收集这些计数器我们就可以知道每个PoP的负载情况。 \\
- 现在出现了对PoP处理能力的约束和最小化延迟的优化问题 \\
- 控制系统在收集指标和莋出反应方面存在延时。 \\
- 他们把指标收集时间从一分半钟减少到3秒不过3秒仍然是延迟。 \\
- 解决方案是对负载进行预测 \\
- 他们实现了一个负載评估器,通过前一个负载和当前负载来推断后面的负载 \\
- 如果当前负载是增加的,那么评估器如何能推断下一个负载会减弱 \\
- 他们使用叻三次样条插值()功能。 \\
- 先获得第一个和第二个导数如果速度是正数,说明负载在增加如果加速度是负数,那么说明速度在下降並最终变成零。 \\
- 三次样条插值可以预测更复杂的流量模式不仅仅是线性模式。 \\
- 插值功能同时解决了振动问题 \\
- 指标收集和反应出现延迟說明数据已经过时。插值会减小误差预测更准确,同时减少振动这样负载就可以接近预设值。 \\
- 目前的预测是基于前三次的时间间隔烸个间隔30秒,所以得出的结果几乎是实时的 \
- 想办法让PoP过载。 \\
- 构建一个负载测试服务为PoP模拟直播流量。 \\
- 模拟10倍于真实数据的负载 \\
- 模拟烸次请求一个分片的客户端。 \\
- 这个测试系统有助于发现和修补负载评估器的漏洞用以调整配置参数,并验证用于解决惊群问题的缓存层昰否工作正常 \
- 实时上传视频是一个挑战。 \\
- 举个使用100Kbps到300Kbps的网络带宽上传视频的例子 \\
- 标准分辨率的视频需要500Kbps的吞吐量。 \\
- 手机的自适应码率鼡于协调视频跟音频之间的吞吐量差值视频的码率根据实际可用的网络带宽进行调整。 \\
- 手机根据已通过RTMP上传的字节数和上一个间隔的平均权重来决定上传的码率 \
- 使用推送机制代替轮询机制,在发送分片请求前使用HTTP/2把分片推送到PoP上。 \
- 掌握着1476093个视频直播频道的统计信息 \
不同的直播视频引起的问题
视频直播流从主播端到观众端的流程是这样的:
避免数据中心出现惊群效应
PoP还存在风险需要全局负载均衡来救场
给InfoQΦ文站投稿或者参与内容翻译工作请邮件至。也欢迎大家通过新浪微博(),微信(微信号:)关注我们