[译] Facebook Live如何支持80w用户同时在线

2023-11-08 12:50

本文主要是介绍[译] Facebook Live如何支持80w用户同时在线,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


写在前面:

这又是一篇翻译了很久的文章--花费时长其实并不久,主要是断断续续翻译前后算起来时长很久。这篇大概是目前翻译得最有共鸣的一篇文章-- 我大沙发厂也有live产品了呢。虽然量级不可比,文中提到的80w在线的流量盛况目前来说也是个遥远的KPI,不过确实在产品迭代中也像文中一样踩了很多坑。作为产品在和讲师沟通配置的过程中,对文末最后提的上传速度那一块的效果体验尤其感同身受。以及,依托于第三方服务来构建自己的产品终归需要不断试错和磨合--和恋爱一样。

最近还有一个关于live而产生共鸣的地方,想来也可以推荐一下,美剧《硅谷》。是的就是文中提到的那个魔笛手Pied Piper。具体点就是第二季大概最后几集里,在公司大概要宣布破产的时候,互怼基友Gilfoyle和Dinesh还有Jared为了撑住因 拆解秃鹰孵化的摄像头而失足坠落的工作人员的求救直播引来的凶猛流量导致已达极限的服务器 而不停敲代码甚至不顾它已经烧起来的盛况(这句话好长啊,不知道说没说清楚)。虽然情节为了剧情效果颇多不现实,但在我看来确实代表了一些geek精神还有创业维艰的事实。


原文地址 How Facebook Live Streams To 800,000 Simultaneous Viewers


译文部分:

clipboard.png

懂得创建世界级服务产品的公司就像掌握核武器的国家一样非常少,Facebook就是其中之一。 而Facebook Live, 一款Facebook 新出的直播视频推流产品,就是这些世界级服务之一。

Facebook CEO 马克扎克伯格:

我们做的这项重大的决定就是为了将我们做的大量视频方向的尝试更多地转移到直播方向,因为直播是近来兴起的一种新模式;而不是已经在过去五年甚至十年都存在于网络中的视频…我们已经进入了视频行业的黄金时代。如果你展望五年后的facebook,发现人们都通过直播来分享每日见闻,我一点也不奇怪。

如果你身处广告业务,想来最令人愉悦的就是永远不会停止的广告来源,并且不断扩张大量生成了吧。这就是Google 盈利的主要方式:在呈几何级增长的网页中插入广告。

Facebook Live 能展现如上述的能力体现之一就是一个45分钟的视频:两个人用橡皮筋切西瓜。达到了超过80万人同时在线的顶峰,有超过30万的评论。这就是一个拥有十亿五千万用户的社交网络能创造的病毒式传播效应。

作为对比,2015年超级碗一共有1.14亿的观众,有大概两百多万的用户观看直播 。 在2015年的电子娱乐展的 Twith 直播中,达到了84万的观看量。9月16号的共和党辩论达到了最高92.1万的同时在线观看人数。

所以对比来看,Facebook做直播最适合不过。需要注意的是,Facebook也可能会出现同一时段有大量直播正在进行的情况。

连线杂志有一篇文章引用了Facebook的首席产品负责人Chris Cox 的话:

  • 有超过100人的直播产品团队(一开始只有12人左右,现在有超过150位工程师参与该项目)

  • 需要支持百万以上的同步直播流而不崩溃

  • 需要支持超过百万的在线观看人数,同时也要考虑全世界上不同的设备适配以及服务商要求

Cox 说“最后发现这是个考验基础架构的难题”。

如果我们能说一说怎么解决这个架构问题的细节,听起来不是很有趣吗? (为了解决这个问题)我们真的很痛苦!但等等,我们可以聊一下~

来自Facebook 流量团队(traffic team)的Federico Larumbe ,主要优化 Facebook 的CDN 处理能力 以及全球加载平衡系统,发表了一次精彩的演讲:Facebook Live 的演变和优化。 演讲中他分享了一些关于直播如何实现的细节。

以下是演讲内容的介绍。非常令人印象深刻。

最开始

  • Facebook 是一个允许用户实时分享内容的新功能(注意这里应该是指Facebook Live)

  • 2015年4月以 Mentions 的移动客户端形式发布,当时只能名人使用,作为和粉丝交流互动的媒介

  • 由此开始了一年的产品优化以及协议迭代

    • 他们最开始使用HLS(HTTP Live Streaming) ,这个协议在iPhone设备下被支持,同时也允许他们使用存在的CDN 架构

    • 同时也开始研究 RTMP(实时消息传输协议),一个基于TCP 的协议。会有一个视频流和音频流从手机上传到直播推流服务器

      • 优点: RTMP 在推流端和播放端之间有更低的点到点等待时间 。这在主播和观众经常互动的场景下非常有用。降低等待时间以及较少的延迟在体验上都是非常棒的改进

      • 缺点: 会请求整个架构资源因为它不是基于HTTP 协议。于是需要开发一个全新的 RTMP 代理。

    • 也在研究 MPEG-DASH (基于 HTTP 的动态适应串流)

      • 优点:对比HLS 节省了15%的空间

      • 缺点:允许自适应比率串流 ,编码质量会根据网络上传速度不断变化

    • 魔笛手数据压缩方法(开玩笑233333)

  • 2015年12月在超过12个国家发布

clipboard.png

视频直播有些不一样—也造成了一堆问题

  • 之前提到的橡皮筋切西瓜的直播的网络传输问题:

    • 一个陡增,几分钟内就达到了每秒超过100次请求而且持续增加直到直播结束

    • 传输又像碰到障碍一样一下完全停下来

    • 换言之,整个数据访问非常迅速而又猛烈

    clipboard.png

  • 视频直播和正常的录制视频不一样:访问会造成大量的网络请求

    • 视频直播更强调参与性因此可能有三倍于录制视频的访问量

    • 视频直播会出现在新闻动态推送的顶部因此有更大的可能性被访问

    • 通知会被推送到所有页面上的粉丝,因此会有另外一群用户会观看直播

  • 迅速而又猛烈的网络访问请求会造成缓存和加载平衡系统方面的问题

  • 缓存问题

    • 很多用户可能想同时观看直播视频,这就是经典的 惊群现象

    • 高访问请求会给缓存系统造成压力

    • 视频都是被分段放进一个二级文件中,高且频繁的访问会让缓存这些视频片段的服务器过载

  • 全球加载平衡问题

  • Facebook 有遍布全球的网络连接点(PoPs),所以直播的网络传输问题也是分布在全球的

  • 问题就在于防止高访问量对网络连接点的访问过载问题

直播架构构建

以下就是一条直播推流如何由发起人(推流端)传到百万观众面前的过程:

  • 发起人在手机上开启视频直播

  • 手机发送一条RTMP 流到直播流服务器

  • 直播流服务器解码传过来的视频并转码成多个比特率

  • 每个比特率的信息都会创建一个二级 MPEG-DASH 片段

  • 这些片段都被存在一个数据中心缓存器中

  • 在数据中心缓存器里,每个片段又会被送到网络连接点中的缓存器里(一个 PoP 缓存)

  • 在播放端,观众就收到了一个完整的直播视频

  • 观众设备上的播放器会从 PoP 缓存中以每秒一次的速度抓取视频片段

一条直播推流又是如何传播扩散的?

  • 在数据中心缓存器和众多 PoP 缓存器之间有一个聚合结点(multiplication point), 用户会向 PoP 缓存器发送请求而不是数据中心,而同时有大量的 PoP 缓存器遍布全球。

  • 另一个聚合传播结点在每一个PoP 内部

  • 每一个PoP 内部有两层:一层 HTTP 协议代理层,一层缓存层

  • 播放端在HTTP 代理层请求视频片段,代理会检查改视频片段是否在缓存中,若有则直接从缓存中给出片段,没有则再向数据中心发送片段请求

  • 不同片段被存在不同的缓存器中,这样可以减少不同缓存宿主之间的负载平衡

避免数据中心出现惊群现象

  • 当所有用户同时请求了同一个视频片段会发生什么?

  • 如果该请求的视频片段不在缓存中,则会为每一个用户向数据中心再发送一条请求

  • 请求合并。请求的数量会通过向PoP 缓存添加请求合并而减少。只有第一条请求会被发送给数据中心,其它请求则会被挂起直到第一个响应到达,数据就会被送到所有用户播放端

  • 新的缓存层会被加到代理中以避免热服务器问题

  • 所有的用户请求会被发送到一个缓存主机中等待视频片段,这样可能导致负载过重

  • 代理会增加一个缓存层,只有第一条请求会被代理发送到缓存器,所有接下来的请求则会直接被代理处理

PoPs 仍处于危险之中 —随时需要处理全球性负载均衡问题

  • 所以数据中心已被避免发生惊群问题,但是PoP 节点仍在危险之中。直播的问题在于流量陡增太迅速PoP节点会在达到负载均衡前就已过载。

  • 每一个PoP节点都有一个限制服务器数量和连接点数量。如何避免直播时的迅猛访问对PoP造成过载?

  • 一个叫 Cartographer的系统会把子网与PoP映射起来。这个系统用来处理每个子网和每个PoP节点之间的延迟。这是一种延迟处理方式

  • 每一个PoP的加载都会被处理,每一个用户的请求都会被发送到有足够容量的PoP节点中。在每一个代理中都有计数器来统计他们收到的加载数量。这些计数器的统计会让我们了解到每一个PoP的负载情况

  • 所以又有了关于负载容量限制的考虑和最小化延迟的优化问题

  • 在控制系统内部接收和处理也同样存在延迟

  • 他们将窗口的加载处理时间从一分半缩减到3秒钟—仍存在3秒钟延迟

  • 解决问题的关键是预处理(上述提到的所有的需要处理的)加载时间

  • 通过注入容量预估器来推断内部加载时间以及每一个PoP传输加载时间还有返回后的加载时间

    • 如果当前的的加载时长在上升,预测器是如何能判断加载时间会减少?

    • 三次样条插值函数(Cubir splines)用来描述插入函数

    • 一阶导数和二阶导数会先被执行,如果显示速度为正值则说明加载会增加。如果加速度为负值则意味着速度在减少并最终减为零并开始减速。

    • 三次样条插值函数比线性函数更能预测复杂的网络流量类型

    • 避免抖动,这类插入函数同时也避免了传输抖动问题

    • 接收和处理的延迟意味着在对旧数据的处理,插入函数能减少出错,更精准预测和减少抖动,这样能使负载更接近容量目标

    • 当前预测时间是基于最近三次处理的间隔时间(每次间隔有30秒),几乎是瞬时加载

测试

  • 需要测试PoP的过载情况

  • 一个模拟直播实时流量的加载测试服务会通过PoP节点分发到全球

  • 能够模拟10倍于正常情况下的负载

  • 能够模拟一位观众不停请求视频片段的情况

  • 测试系统帮助复现和修复容量预估器会出现的问题,修正一些参数值设置,以及鉴别缓存层可能出现的惊群现象

上传可靠性

  • 实时上传视频非常有挑战性

  • 以大概有100-300 Kbps 的有效带宽为例

  • 音频大概需要64 Kbps 的有效上传带宽

  • 标清视频需要大概500 Kbps

  • 移动设备上采用适应性编码来调整音频+视频上传时码率不足的问题。编码视频时会根据网络上行带宽来调整上传码率

  • 通过处理 RTMP 协议连接时的上传字节数来自动调节手机上的上传码率,一般是通过读取单位上传时间间隔内获取的字节数的平均速率

未来的方向

  • 研究推流方向的优化而非拉流,在视频片段被PoP节点请求前来平衡 HTTP/2 协议的推流效率

相关文章
  • hacker news

  • 为什么扎克伯格全力投入视频直播方向

  • 连接世界:facebook的网络架构一瞥

  • Gamoloco 获取到的1476093 个频道的视频直播数据

这篇关于[译] Facebook Live如何支持80w用户同时在线的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369961

相关文章

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

Golang支持平滑升级的HTTP服务

前段时间用Golang在做一个HTTP的接口,因编译型语言的特性,修改了代码需要重新编译可执行文件,关闭正在运行的老程序,并启动新程序。对于访问量较大的面向用户的产品,关闭、重启的过程中势必会出现无法访问的情况,从而影响用户体验。 使用Golang的系统包开发HTTP服务,是无法支持平滑升级(优雅重启)的,本文将探讨如何解决该问题。 一、平滑升级(优雅重启)的一般思路 一般情况下,要实现平滑

vue2实践:el-table实现由用户自己控制行数的动态表格

需求 项目中需要提供一个动态表单,如图: 当我点击添加时,便添加一行;点击右边的删除时,便删除这一行。 至少要有一行数据,但是没有上限。 思路 这种每一行的数据固定,但是不定行数的,很容易想到使用el-table来实现,它可以循环读取:data所绑定的数组,来生成行数据,不同的是: 1、table里面的每一个cell,需要放置一个input来支持用户编辑。 2、最后一列放置两个b

sqlite不支持中文排序,采用java排序

方式一 不支持含有重复字段进行排序 /*** sqlite不支持中文排序,改用java排序* 根据指定的对象属性字段,排序对象集合,顺序* @param list* @param field* @return*/public static List sortListByField(List<?> list,String field){List temp = new ArrayList(

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

Science Robotics 首尔国立大学研究团队推出BBEX外骨骼,实现多维力量支持!

重复性举起物体可能会对脊柱和背部肌肉造成损伤,由此引发的腰椎损伤是工业环境等工作场所中一个普遍且令人关注的问题。为了减轻这类伤害,有研究人员已经研发出在举起任务中为工人提供辅助的背部支撑装置。然而,现有的这类装置通常无法在非对称性的举重过程中提供多维度的力量支持。此外,针对整个人体脊柱的设备安全性验证也一直是一个缺失的环节。 据探索前沿科技边界,传递前沿科技成果的X-robot投稿,来自首尔国立

家庭和学生用户笔记本电脑配置方案

2.6.1  家庭和学生用户笔记本电脑配置方案   2.6.1  家庭和学生用户笔记本电脑配置方案   普通家庭用户、学生用户主要用于上网、娱乐、学习等,这类用户要求笔记本电脑的各方面 功能比较均衡。在选购此类笔记本电脑时,主要考虑外观设计方面要比较时尚,而且性能上也要 够强,一些大型复杂的软件以及目前的主流游戏都要能够流畅地运行才行。   对于CPU方面,可以考虑目前主流的第二

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

QtC++截图支持窗口获取

介绍 在截图工具中你会发现,接触到窗口后会自动圈出目标窗口,个别强大一点的还能进行元素识别可以自动圈出元素,那么今天简单分析一下QTc++如何获取窗口并圈出当前鼠标下的窗口。 介绍1.如何获取所有窗口2.比较函数3.实现窗口判断 结尾 1.如何获取所有窗口 1.我们需要调用windows接口EnumWindowsProc回调函数来获取所有顶级窗口,需要包含windows.

Nacos Config 配置中心支持配置共享

文章目录 一、什么是配置中心二、Nacos Config2.1 Nacos Config 工作原理 (★)2.2 Nacos Config 的使用2.3 动态刷新2.4 配置共享2.4.1 同一个微服务的不同环境之间共享配置2.4.2 不同微服务中间共享配置 一、什么是配置中心 微服务架构下关于配置文件的存在以下问题: 配置文件相对分散。在一个微服务架构下,配置文件会随