作者丨Todd Hoff
译者丨Sammy Liu @ 世民谈云计算
Netflix 看起来再也简单不过了。你在Netflix App或网站中看到喜欢的视频后,点击播放按钮,立刻视频就魔术般地出现在眼前。真的很简单,不是吗?其实不然。
也许你会认为Netflix完全利用AWS来提供视频服务。在Netflix应用中点击播放按钮后,存放在AWS S3中的视频文件会被以视频流形式通过因特网传送到你的设备上。乍看起来,这似乎是一个非常合理的方法,就像很多小型应用一样。但这不是Netflix的实现方式。它比这个方案复杂得多,也有趣得多,远超你的现象。
2017年的Netflix
我们先来看看Netflix在2017年的一组统计数据:
- 拥有超过1.1亿的订阅用户
- 在超过200个国家提供服务
- 每季度约30亿美金营收
- 每季度新增超过5百万用户
- 每周播放小时数超过10亿
- 平均每天播放视频2.5亿小时
- 所占用的互联网流量超过美国因特网峰值流量的37%
- 计划在2018年在新视频内容上花费超过70亿美金
我们能从中看出些什么呢?
Netflix是个庞然大物,它是全球性企业,拥有海量用户,播放海量视频,挣了很多很多钱。Netflix的业务基于用户订阅模式。订阅用户每个月向Netflix付费后在Netflix中享受视频,觉得它不爽时可以随时取消订阅。
Netflix是我们已经讨论过的所有云计算相关事情的集大成者,这就是为什么本章中我们会比其他章节的内容介绍得更加深入些。我们这么做的一大原因是相比其他企业Netflix做了更多的事情。比如,Netflix公司内有个大家共同遵守的企业文化准则。他们非常开放。过去几年中,Netflix举行了几百场演说,写了成百上千的文章,关于他们公司是如何运作的。整个行业都因此而受益。另一个想要深入了解Netflix的原因是纯属好奇。我们大多数人都或多或少地用过Netflix。谁不想了解下这背后的运作原理呢?
Netflix的运作依赖于两个云:AWS和Netflix自己的Open Connect。
Netflix是如何向其用户提供优质服务的呢?用云!AWS和Open Connect 两个不同的云无缝合作,向用户提供源源不断的视频流服务。Netflix系统包括三部分:客户端、后台和CDN。
客户端(client)运行在用户设备上,用于浏览和播放Netflix视频。比如你iPhone手机上的App,你电脑上的网站,你的智能电视上的App。Netflix管控所有客户端。在你点击播放按钮之前的一切活动都发生在AWS上,包括准备新视频、处理所有客户端发来的请求等。
点击播放按钮后的一切活动由Open Connect处理。它是Netflix定制的全球CDN服务,它在全球不同的地方保存视频。你点击播放按钮后,Open Connect中的视频以流的形式进入你的设备。不要着急,后面我们会详细介绍它。
通过控制客户端、后台和CDN这三个部分,Netflix完成了系统的垂直整合。Netflix端到端地控制视频播放的全流程。因此,不管你在哪里,在任何时候,你都能流畅地播放任何你想看的视频。
下面我们来看看这到底是怎么做到的。
2008年,Netflix开始向AWS迁移系统
Netflix成立于1998年。一开始,他们通过美国邮政提供DVD租用服务,随后,他们看到了按需视频流服务(on-demand streaming video)的未来。2007年Netflix开始提供视频流服务,允许订阅用户点播视频,在个人电脑的网站上、智能手机上、游戏机,和智能电视上。
我个人认为,按需视频流的未来是显而易见的,后来发生的一切也证明了这一点。我工作过的一些创业公司也尝试过此类业务,但他们都失败了。
然而,Netflix成功了。虽然他们进入此行业算晚的了,但这也帮助了他们。2007年,因特网速度足够快了,也够便宜了,因此能很好地支撑这种业务。而在此之前,情况却不是这样。快速的低成本的移动带宽、处理能力强大的设备比如智能手机和平板,使得这一些变得更加容易也更便宜。天时很重要!
一开始,Netflix自己运营数据中心
直到2007年AWS才发布EC2服务,而这一年Netflix也开始提供视频流服务。因此,这时候他们还没法牵手合作。此时,Netflix自己运营两个挨得很近的数据中心。他们遇到了我们在前面章节中提到的几乎所有问题。自己运营数据中心需要投入大量精力,设备采购、安装和上线运行都需要很长时间。每当前一批刚刚上线完成,容量就不够了,一切就得从头来过。
这使得Netflix不得不采用“垂直扩容“策略,也就是在大型电脑上运行被称为”单体“的能处理所有业务的大型系统。问题是,对于Netflix这种体量的公司,很难将这种单体应用弄的非常可靠,实际上他们确实没做到。
一次服务宕机促使Netfix将系统迁移到AWS上
2008年8月间,整整三天,因为数据库宕机,Netflix无法寄送DVD。这是不可接受的。Netflix到了需要改变的时候了。自己运营数据中心的经历让他们懂得了他们并不擅长于此。Netflix所擅长的是向用户提供视频服务,这也是他们未来所在。运营数据中心并不是Netflix的优势技能,只有提供视频服务才是。
这时候,Netflix决定把系统迁移到AWS上。但AWS刚刚建立,因此这个决定是个巨大的冒险。Netflix之所以想迁移到AWS上,是为了获得一个更加可靠的基础设施。他们想从系统中移除所有故障单点。AWS提供高可靠的数据库、存储和数据中心。Netflix想利用云计算,而不是构建不可靠的大型单体应用。他们想在不自己运作数据中心的前提下向全球用户提供服务。这些通过他们自己的数据中心是不可能做到的。
他们选择AWS的另一个原因是他们想从非核心业务上脱身。非核心业务是他们不得不做,但对核心视频服务提供不了任何帮助的事情。AWS把这一切都承担了,这让Netflix能聚焦到核心业务上。
Netflix花了整整八年才完成了全部迁移工作。在此期间,Netflix的流媒体客户数量增长了八倍。 Netflix现在在数十万个EC2实例上运行他们的系统。
AWS上的Netflix更加稳定可靠
并不是说Netflix从未经历过AWS宕机的情况,但总的来说,它的服务比以前更加可靠。你再也看不到下面这种用户抱怨了。
(Netflix看不了了,我要报警了!)
现在的Netflix之所以变得如此可靠了,是因为他们已经采取了非常规手段。Netflix系统运行在三个AWS区域(Region)中:一个在北弗吉尼亚州(North Virginia),一个在俄勒冈州波特兰市(Portland Oregon)以及一个在爱尔兰都柏林(Dublin Ireland)。在每个区域内,Netflix使用三个不同的可用区中。
Netflix表示他们没有计划使用更多区域。添加新区域非常昂贵且复杂。大多数公司在一个地区开展业务,更不用说两个或三个了。
使用三个区域的优点是任何一个区域发生故障后,其他区域将接管故障区域中的所有用户流量。当某个区域发生故障时,Netflix将其称为疏散区域(evacuating)。
我们来举个例子。假设你正在英国伦敦观看《新纸牌屋》。由于你距离伦敦最近,因此你设备上的Netflix客户端连接到AWS都柏林区域。那如果整个都柏林区域都故障了呢?这是否意味着Netflix应该停止为你服务?当然不会!Netflix检测到故障后,客户端会重定向到AWS弗吉尼亚区域。你的设备现在与弗吉尼亚州地区通信,而不是与都柏林通信。你甚至可能没有注意到发生了故障。
一个AWS区域多久发生一次故障?每月一次。嗯,一个区域实际上并不是每个月都会发生故障,只是Netflix会每月进行一次测试。每个月,他们都会故意让某个区域出现故障,以确保其系统可以处理区域级别的故障。一个区域可以在六分钟内被疏散。
Netflix称这为全球服务模型(global services model)。通过这三个区域,Netflix可以服务全球任何地方的用户。这真是个了不起了的创举,但这一切并不是与生俱来的。AWS也无法完全避免整个区域发生故障。Netflix自己完成了处理区域故障的所有工作。Netflix是使用多个区域构建可靠系统的先驱。我不知道有没有其他公司会竭尽所能使他们的服务变得如此可靠。
在这三个地区中的另一个优势是,它使Netflix遍及全球。Netflix进行了一些测试,发现不论用户在世界任何地方使用Netflix应用程序,都能从这三个地区之一获得快速的服务。
Netflix在使用AWS后更省钱了
这可能会让很多人感到惊讶,但是使用AWS确实比Netflix使用自己的数据中心更成本更低。每个视频流的云上成本最终只是其旧数据中心成本的一小部分。
为什么呢?这归功于云的弹性。
Netflix可以在需要时增加服务器,在不需要时将其退还。因此,Netflix不必拥有大量闲置的只是为了处理高峰负载而无所事事的计算机,而仅在需要时才支付所需的费用。
云计算:你点击播放按钮前的行为都在AWS中处理
任何不涉及视频流的请求都在AWS中处理,包括可伸缩计算、可伸缩存储、业务逻辑、可伸缩分布式数据库、大数据处理和分析、推荐、转码以及数百种其他功能。不用担心,你不需要了解所有这些内容,但还是出于好奇,我接下来做下简要说明。
可扩展计算和可扩展存储
可扩展计算是EC2,可扩展存储是S3。这没有什么新鲜的。你的Netflix设备(iPhone,TV,Xbox,Android手机,平板电脑等)与EC2中运行的Netflix服务通信。
查看视频列表时,你的Netflix设备与EC2中实例中的应用通信以获取该列表。询问有关视频的详细信息时,你的Netflix设备在EC2中实例中的应用以获取详细信息。这和本书中讨论的所有其他云服务没有两样。
可扩展的分布式数据库
Netflix将DynamoDB和Cassandra用作分布式数据库。这些名称对你没有任何意义,它们只是高质量的数据库产品。数据库用于存储数据。你的个人资料、帐单、你曾经看过的所有电影等等所有此类信息都存储在数据库中。
分布式(Distributed)。分布式意味着一个数据库不在一台大型计算机上运行,而是分布在多台计算机上运行。数据被复制到多台计算机上,因此,如果一台或几台保存数据的计算机发生故障,你的数据仍然是安全的。实际上,你的数据会被复制到所有三个区域。这样,如果某个区域发生故障,那么当新区域准备开始使用它时,你的数据就会在那里。
可扩展(Scalable)。可伸缩性意味着数据库能处理尽可能多的数据。这是分布式数据库的一大优势。它可以根据需要添加更多计算机以处理更多数据。
大数据处理和分析
简单来说,大数据意味着很多很多数据。Netflix收集了大量信息。Netflix知道每个人都观看了什么、观看时所处的位置、查看了哪些视频但最终没看、每个视频被观看了多少次……还有更多。将所有数据汇总在一起成为处理(processing),而理解所有这些数据被称为分析(analytics)。分析数据以回答特定问题。
Netflix的千人前面
下面是一个很好的例子,说明Netflix如何利用其数据分析功能吸引你观看更多视频。
在浏览Netflix内容时,你会注意到每个视频都会带一个图片,这就是标题图片(header image)。它旨在吸引你选择这个视频。标题图像越引人注目,你观看这个视频的可能性就越大。而且,你观看的视频越多,你退订Netflix的可能性就越小。这是《陌生事物》的不同标题图片的示例:
当了解到每张图片都是Netflix精心为你挑选的时候,你可能会暗暗称奇。一开始,Netflix为每个用户从一组候选图中随机选择一张标题图片,例如上述``陌生事物''拼贴中的图片。Netflix在每次视频被观看时对所显示的图片进行计数。还是``陌生事物''这个例子中,假设显示中间那张集体照时``陌生事物''被观看了1000次,显示其他图片时视频只被观看了一次。由此可见集体照是吸引成员观看的最佳方式,因此Netflix将永远将其作为《陌生事物》的标题图像。这称为被数据驱动(data-driven)。Netflix以数据驱动型公司而闻名。在这种情况下,数据被收集起来(在这种情况下为与每张图片关联的视图数量),并用于做出最佳决策。
这真是个聪明的主意,但是你能想出更好的做法吗?有的,通过使用更多数据,通过机器学习可以做得更好。
你和我可能是完全不同的人。你会认为我们会受到相同类型的标题图片的激励吗?可能不会,因为我们有不同的品味和偏好。Netflix也知道这一点。因此,Netflix现在可以个性化地显示给你的所有图像。Netflix会尝试选择与你的视频最相关的内容。他们是如何做到的?请记住,Netflix会记录并统计你在其网站上所做的一切行为。他们知道你最喜欢哪种电影,最喜欢哪些演员等等。
假设给你的推荐影片是《善意狩猎》。Netflix会为之选择一个最合适的标题图像显示给你。通过这张图像,Netflix先让你对这电影产生兴趣。那Netflix该向你显示哪张图像呢?如果你喜欢喜剧片,Netflix将为你展示以罗宾·威廉姆斯为特色的图像。如果你更喜欢浪漫电影,则Netflix会向你显示马特·达蒙(Mat Damon)和米妮·德米妮(Minnie Driver)准备亲吻的图像。
因为Netflix知道你喜欢喜剧,因此,通过展示罗宾·威廉姆斯(Robin Williams),Netflix使你知道电影中可能有幽默感,从而认为此视频非常适合。而Matt Damon和Minnie Driver的图像传达了完全不同的信息。如果你是喜剧迷并且看到了这张图片,则可以跳过。这就是为什么选择正确的标题图像如此重要的原因。它发送强烈的个性化信号,指示电影的内容。
这是另一个例子,《低俗小说》。如果看过很多由乌玛·瑟曼(Uma Thurman)主演的电影,那么你很可能会看到乌玛(Uma)的标题图片。如果看过很多由约翰·特拉沃尔塔(John Travolta)主演的电影,那么你很可能会看到约翰(John)的标题图片。
现在你能看出来,如何通过选择最佳个性化图片来使你更有可能观看这个视频吗?Netflix在选择内容时会尽可能让你产生兴趣,但Netflix也不想骗你。他们不想为了让你观看你可能不喜欢的视频而显示欺骗性图片,这没有任何动机。一方面,Netflix不按观看的视频付费,同时,Netflix试图使你的遗憾最小化。Netflix希望你对观看的视频感到满意,因此他们会选择最适合你的标题图像。
这只是Netflix如何使用数据分析的一个小例子。 Netflix到处都采用这种策略。
推荐
Netflix有成千上万个视频,但通常只会向你显示40到50个推荐视频。Netflix如何确定推荐哪些视频给你呢?答案是使用机器学习,这是我们刚才谈到的大数据处理和分析的一部分。Netflix会查看你的数据并预测你的需求。实际上,你在Netflix屏幕上看到的所有内容都是使用机器学习而专门为你选择的。
转码:将源媒体转换为你能观看的视频
现在,我们来介绍Netflix处理视频的方法。在你在某个设备上观看某个视频之前,Netflix必须将源视频转换为适合你的设备的格式。此过程称为转码或编码( transcoding or encoding)。转码是将视频文件从一种格式转换为另一种格式,以使视频可以在不同平台和设备上观看的过程。Netflix一次性会在AWS中使用多达300,000个CPU用于视频转码,这比大多数超级计算机都大!
源媒体的来源
那谁向Netflix发送视频源文件呢?制作室和工作室。 Netflix将此视频称为源媒体(source media)。源媒体文件将交给内容运营团队进行处理。这些视频采用高清格式,通常有几个TB大小,这实在很大。在你观看视频之前,Netflix会通过严格的多步骤过程对其进行处理。
验证视频
第一件事是验证视频,这要花费大量时间。它查找可能由先前的转码或数据传输问题引起的数字失真、颜色变化或帧丢失。如果发现任何问题,视频将被退回。
送入媒体管道
视频通过验证后,会被送入到Netflix媒体管道(media pipeline)中。一条管道包括一系列步骤,在其中数据经过一系列环节才能被使用,就像工厂中的装配线一样。70多种软件负责处理每个视频。处理单个几TB大小的文件是不切实际的,因此,管道工作的第一步是将视频分成许多较小的块,然后将这些小的视频块放进管道,以便可以对它们进行并行编码。并行意味着在同一时间处理多个视频块。
让我们用一个例子来说明并行性。假设你有一百只需要清洗的脏狗。你一个人一个接一个地洗狗,或者租一百个狗狗清洗器并同时清洗,哪个会更快吗?显然,后者会更快。这就是并行处理(parallelism)。这也是Netflix在AWS EC2中使用大量服务器用于转码的原因。他们需要大量服务器来并行处理这些巨大的视频文件,这也确实发挥了巨大的作用。Netflix曾经说过可以在短短30分钟之内对一个源媒体文件编码完成并将其推送到CDN。
对代码块进行编码后,将对其进行验证,以确保没有引入新的问题。然后将这些块组装回一个文件中,并再次进行验证。
但结果却是一堆文件!
编码过程会创造出很多文件。为什么呢?因为Netflix的最终目标是支持每台联网设备。Netflix于2007年开始在Microsoft Windows上流式传输视频。随着时间的推移,添加了更多设备,比如Roku、LG、三星蓝光、Apple Mac、Xbox 360、LG DTV、Sony PS3、Nintendo Wii、Apple iPad、Apple iPhone、Apple TV、Android、Kindle Fire和Comcast X1等等。
Netflix总共支持2200种设备。每个设备都具有在该类设备上观看效果最佳的视频格式。如果你在iPhone上观看Netflix,则会看到一个视频,该视频可为你提供最佳的iPhone观看体验。Netflix将视频的所有不同格式称为其编码配置文件(encoding profile)。
Netflix还创建针对不同网络速度优化的文件。如果你在快速网络上观看,则观看的视频质量会比在慢速网络上的观看质量更高。也有用于不同音频格式的文件。音频被编码为不同质量等级和不同语言。还包括字幕文件。视频可能具有多种不同语言的字幕。
每个视频都有很多不同的观看选项。你看到的内容取决于你的设备、网络质量、Netflix计划以及你的语言选择。
那到底有多少个文件呢?
比如《王冠The Crown》这部视频,Netflix一共为它存储了约1200个文件!
《Stranger Things陌生人事物第二季》有更多文件。它以8K格式拍摄,共有9集。源视频文件有很多TB数据。仅编码一个集就会花费190,000 CPU小时。结果共有 9,570个视频、音频和文本文件!
(未完待续)
本文是作者Todd Hoff在《Explain the Cloud Like I'm 10》书中的一章的上半部分,2017年发表在http://highscalability.com/blog/2017/12/11/netflix-what-happens-when-you-press-play.html。