原文:Globo.com’s Live Video Platform for FIFA World Cup ’14- Part II – DVR and Microservices
译者:杰微刊兼职翻译汪建前端
下文改编自环球网的Leandro Moreira 和Juarez Bochi两位工程师 2015年九月份在San Francisco市举办的nginx会议的演讲。这篇博客是两部分的第二部分,这部分主要关注与使用nginx构建微服务。第一部分主要讲了传输及缓存方面的工做,能够在https://www.nginx.com/blog/globo-coms-live-video-platform-fifa-world-cup-14-part-delivery-caching/这里找到,一样你也能够从YouTube上观看完整的研究视频。nginx
内容表
19:02 DVR
20:24 DVR的挑战——故障转移
21:06 DVR的挑战——存储
22:11 使用Redis做为数据存储
23:20 巴西大选
24:12 从Redis到Cassandra
25:11 等候区
27:40 等候区的架构
29:02 国际足联2014世界杯成绩
31:00 回顾和下一步
31:58 NGINX + Lua 表现惊人
33:17 开源软件开发
33:55 总结和将来
34:50 问答数据库
19:02 DVR缓存
互联网,NGINX,科技服务器
Juarez:到2013年,咱们对咱们的基础设施和咱们提供的用户体验感到很满意,因而咱们开始思考咱们还能够为2014年世界杯作些什么其余事情。架构
咱们决定开发的其中一个功能就是DVR,DVR表明数字视频录像机,它能够提供暂停视频播放、回放和从新观看视频的功能。并发
要作到基于HLS协议的DVR,咱们只需使用一个更大的播放列表,正如你以前见到过的那样,播放列表只是一个排列多个片断的文本文件。对于DVR,要将这些几分钟的视频替换成一个完整的比赛视频的片断。负载均衡
互联网,NGINX,科技框架
从新回顾咱们的解决方案,咱们能够说主要有两大块:采集和前端。二者之间的接口就是存储,存储存放的都是被咱们分割后的片断,分割后的文件经过NGINX提供给用户访问请求。ide
20:24 DVR的挑战——故障转移
互联网,NGINX,科技
所以存储是一个问题,由于咱们没有故障转移能力,若是视频流中止了,那么咱们不得不从新开始,咱们正在使用的EvoStream服务器,只会删除播放列表并从新开始一个新的列表。
若是不提供数字视频录像机DVR功能的话,这个不算是一个问题,由于就算发生故障用户也只会看到缓冲提示而且很快就会从新链接,而后视频流又恢复正常。可是若是你丢失了旧的播放列表,那用户就不能找回原来的播放点,因此对于DVR,咱们必须保持全部片断和播放列表的状态。
21:06 DVR的挑战——存储
互联网,NGINX,科技
咱们也有点担忧存储大小问题,由于对于单一流来讲,一场比赛咱们会按照比特率对其进行切分,这里会切分红6种比特率,每一个比特率对应着不一样的质量。用户根据本身带宽状况,能够观看符合条件的任一个资源,大约每5秒视频就有4.5兆字节,因此对于两小时的比赛,这将达到大约6G字节。
咱们环球公司播放两个同时进行的比赛和其余播放的视频流,因此咱们须要大约40G字节,这并不算不少,咱们能够将他们所有都放到RAM中,因此咱们决定使用Redis做为视频的存储。
Leandro:咱们刚刚替换了咱们旧的架构,旧的架构将数据保存到一个目录下,而如今咱们将数据块和HLS文件保存到Redis中。
22:11 使用Redis做为数据存储
互联网,NGINX,科技
Juarez:咱们用Python创建了一个守护程序,它只是一个简单的脚本,它能够监听文件,当文件被分割成片断后将它们移动到Redis数据库。而后咱们使用NGINX配合Lua模块从Redis获取视频流列表,动态查看播放列表。这项工做牢牢花费了咱们一两天的时间。
Leandro:使用Python感受很好,但与此同时咱们发现很难对其进行扩展,我不知道是否是由于咱们没有足够的经验,对于咱们来讲,Python确实很难在将其扩展到多核,因此监听文件变化并保存为HLS协议文件的守护程序给咱们带来不少痛苦。若是让咱们从新作一遍,咱们可能会选择另一种语言,但在当时这是最简单的解决方案,如今它仍然在工做。
Juarez:是的,这个已经成为一个问题,尤为是在巴西大选直播期间。
23:20 巴西大选
互联网,NGINX,科技
因此,后来,当咱们在直播巴西大选时,咱们有超过30个同时播放的视频流,每一个视频流有各自的状态。如Leandro所说,Python脚本成为了一个瓶颈,而且在使用Redis上咱们也遇到了问题,由于咱们没法把全部这些都放进内存,因此咱们决定从Redis转向Cassandra。
须要澄清一下,世界杯直播时咱们仍然使用Redis,巴西大选时发生在世界杯以后,咱们认为这个比较有趣因此在这里分享。
24:12 从Redis到Cassandra
互联网,NGINX,科技
除了解决其扩展性问题,咱们没有必要对守护程序作过多其余的改动。但在前端咱们必需为Lua开发一个新的驱动程序。在那时候咱们没有找到任何NGINX的Lua驱动模块,因此咱们必须本身编写。从那时起,愈来愈多人使用这个模块,这让人看着很高兴。
25:11 等候室
咱们必须作的另一件事情是创建一个等候区,咱们没有使用CDN,咱们已经和巴西的几个互联网服务提供商合做,咱们有两个数据中心。
有时用户可能经过一个低宽带的ISP链接咱们观看视频,这样会致使在此ISP上的全部用户都体验很很差,因此咱们决定建立一个等候区,若是太多用户从同一个链接观看视频,咱们会将他们放进一个队列里。
互联网,NGINX,科技
Leandro:咱们在后面将涉及更多等候区的相关细节,但首先,咱们要讨论下咱们多链接的解决方案,使得用户能根据IP选择走哪一个线路。
互联网,NGINX,科技
选播的工做原理是这样的:你要有一个BGP协议,该协议用于决定路线,而后咱们要有ISP,因为咱们是一个互联网公司,咱们属于一个自治系统,因此咱们能够用公司的ISP进行数据交换。
因此由咱们决定线路,而后咱们的ISP将认可这条线路,如今,若是在圣保罗附近有不少用户,当他们试图访问给定的地址是,ISP会智能的将他们的请求路由到最近的PoP。
互联网,NGINX,科技
如今咱们能够更加深刻地讨论等待区了。
互联网,NGINX,科技
这里咱们能够看到ISP Y只有很是低的带宽链接到咱们,因此链接他们的用户在看直播时将会体验不好。但他们不会抱怨他们的ISP,他们会经过推特来抱怨咱们,这显然是不理想的,因此咱们想出了等候区方案。
27:40 等候区的架构
互联网,NGINX,科技
这里咱们能够看到ISP Y只有很是低的带宽链接到咱们,因此链接他们的用户在看直播时将会体验不好。但他们不会抱怨他们的ISP,他们会经过推特来抱怨咱们,这显然是不理想的,因此咱们想出了等候区方案。
27:40 等候区的架构
互联网,NGINX,科技
我不知道大家是否像咱们同样喜欢足球,但咱们对这个结果不满意,但这就是生活。
互联网,NGINX,科技
我很是兴奋咱们有不少的带宽供咱们使用,该图大体显示了咱们对比赛进行直播时的几个峰值,这并非全部比赛的状况,但我对这个结果很是满意。
互联网,NGINX,科技
咱们有超过50万用户同时在线,而且咱们能够很容易地支持更多的用户。咱们原本预计有100万用户同时在线观看,但咱们怀疑真实的在线用户可能比预期的要少,由于当巴西进行比赛时,人们能够从家里观看比赛,因此,不少人们更愿意经过电视观看,因而经过环球网观看的用户会少不少。
另外一个很酷的数字是某场比赛达到640Gbps,我认真这是至关不错的。
互联网,NGINX,科技
既然咱们有索伦仪表盘,咱们能够经过监控软件Graphite进行估算,结果是全部观众观看的时间总和大体超过1600年,咱们有超过四千万用户观看。
互联网,NGINX,科技
这里你能够看到咱们的平均比特率,这里面也有我高兴的事情,就是咱们每一个节点使用了仅仅10%CPU就能达到20G每秒速度。
31:00 回顾和下一步
既然咱们已经展现了咱们的成绩,我以为是时候回顾一下,而且讨论下咱们下一步能够为咱们的平台作什么事。
互联网,NGINX,科技
Juarez:咱们在视频流方面使用了不少NGINX,咱们用它来作传输、用来作缓存。咱们开发了地理定位、受权、认证等多个模块。
咱们也围绕它内置了不少微服务,咱们使用NGINX和Lua用于播放列表的生成,也用于等候区。咱们还有另一个前面没有时间说起的系统,这个系统能够锁定一个用户能够拥有并发会话的数量,但这主要用于封闭播放,而不是用于像世界杯这样的直播。
31:58 NGINX + Lua 表现惊人
互联网,NGINX,科技
咱们真的很喜欢NGINX和Lua,咱们也很高兴尝试了nginScript,但到目前为止,咱们更喜欢Lua,它也是在巴西被创造出来的。
Leandro:这个与目前的问题不相关。
Juarez:哈哈,是的,这个与目前的问题不相关。我认为咱们应该看看技术方面的东西,咱们一直在尝试而且很是喜好的框架是Busted,它在测试驱动开发方面表现良好,使咱们的生活更轻松。
Lua是一个小语言,因此很容易学习,与C语言比起来,咱们在开发UGINX+Lua时体验更加好,使用Lua语言开发起来更快,然而你仍然能够获取接近C语言的性能,因此咱们对此十分满意。
Leandro:Lua至少对咱们来讲更加容易,由于咱们不是C语言专家。
33:17 开源软件开发
互联网,NGINX,科技
咱们真的很喜欢NGINX和Lua,咱们也很高兴尝试了nginScript,但到目前为止,咱们更喜欢Lua,它也是在巴西被创造出来的。
Leandro:这个与目前的问题不相关。
Juarez:哈哈,是的,这个与目前的问题不相关。我认为咱们应该看看技术方面的东西,咱们一直在尝试而且很是喜好的框架是Busted,它在测试驱动开发方面表现良好,使咱们的生活更轻松。
Lua是一个小语言,因此很容易学习,与C语言比起来,咱们在开发UGINX+Lua时体验更加好,使用Lua语言开发起来更快,然而你仍然能够获取接近C语言的性能,因此咱们对此十分满意。
Leandro:Lua至少对咱们来讲更加容易,由于咱们不是C语言专家。
33:17 开源软件开发
互联网,NGINX,科技
Leandro:综上所述,从2010年到2014年,咱们从RTMP协议转移到HLS协议,而后咱们推出这个叫DVR的功能。
如今,咱们期待奥林匹克运动会的到来,咱们正考虑提供不一样类型的方式,例如Dynamic Adaptive Streaming over HTTP。咱们可能会改变采集方面关于信号被摄入的方式,也许要让它支持4K。
Juarez:有一件事咱们确定知道的是,咱们将继续使用NGINX。
Leandro:是的。
34:50 问答
一、有多少用户在看巴西队和德国队的比赛?详细状况你知道吗?
Juarez:我以为在第三个进球以后,没有一个观众(笑)。不,只是开个玩笑。观看巴西队比赛的观众不多,由于几乎全部人都使用电视在看比赛,而不是经过互联网,大约有10万左右的用户使用播放器观看。
二、关于前端NGINX服务器,使用了NGINX Plus机器仍是NGINX开源机器。
Leandro:使用了开源机器,咱们使用了社区中的一款。
Juarez:是的,咱们使用了默认的NGINX开源解决方案,咱们也有咱们的一些硬件负载均衡器,咱们使用它们对跨NGINX多个实例的拆分负载。
三、你在讨论的irqbalance和CPU亲和力,你是怎么意识到这是一个问题的呢?
Juarez:咱们注意到的第一件事是咱们一直在丢失数据包,并且咱们注意到的第二件事是机器只有一个CPU核在工做,咱们发现使用最多CPU的进程是处理网卡软中断的那个进程,因此咱们首先安装irqbalance将负载分到其余CPU核上,咱们发现将中断指定到某个CPU核上性能会更好。
Leandro:全部这一切要归结到这一事实,那就是咱们看到每一个节点的极限是拥有20Gbps传输能力,但咱们并无达到20Gbps,因此咱们就认为多是NGINX存在问题,或者是其余问题致使的,由于它仅仅用于处理静态文件,这个不该该这么难,因此咱们开始研究、故障排除,而后咱们就可以理解和运用刚才前面讲到的优化方案。
Juarez:另一个有趣的数字是,仅仅使用2台NGINX服务器,咱们就能够处理10万用户的访问,这个等同于咱们使用50台Flash媒体服务器处理的用户量。