Netflix:当你按下“播放”的时候发生了什么?

1,899 阅读18分钟
原文链接: www.infoq.com

从用户端来看,使用Netflix是很简单的,按下播放键之后视频就像变魔术一样完美呈现了。看起来很容易是吧?然而实际不是这样的。了解过云计算的人可能会简单地以为,既然Netflix使用AWS来提供视频服务,那么在收到播放请求之后,视频就会从所存储的S3中流经网络直达用户用于观看视频的设备中。对于相对小的服务来说,这个流程是完全合理的,但Netflix不完全按这个流程来实现,它背后所涉及的技术手段远比我们能想象到的还要复杂和有趣。

在给大家介绍这些技术之前,我们先来看一组数据:

  • Netflix拥有超过1.1亿的订阅者
  • Netflix业务遍布200多个国家
  • Netflix每季度有近30亿美元的收入
  • Netflix每季度新增超过500万的订阅者
  • Netflix每周视频播放时长超过10亿小时(对比参考数据:YouTube单日视频流为10亿小时, 而 Facebook单日视频流为1.1亿小时。)
  • Netflix在2017年的单日播放视频时长为2.5亿小时
  • Netflix占用了美国超过37% 的高峰网络流量
  • Netflix2018年计划在新内容上花费70亿美元

从这些数据我们可以看出,Netflix拥有庞大的用户群体,这些用户有很大的视频播放需求,而且每一个付费的视频服务都能给Netflix带来收益。那么,Netflix是如何保持用户粘性,让客户满意的呢?

Netflix使用了AWS和Open Connect两种云,两者无缝协同工作,以保证不限时地为客户提供满意的视频服务,使得Netflix可以严格把控客户端、后端和CDN(内容分发网络)三个环节,确保了用户从开始到结束全程的视频观看体验,从而世界各地的用户们随时随地都能获得稳定可靠的视频服务。

Netflix为什么选择AWS,AWS的优势是什么?

从2007年独自建立数据中心到2008年迁移到AWS,Netflix逐步发现自己应该专注于强化视频分发能力而不是一味地建数据中心。虽然选择刚刚开始建设的AWS是一个大胆之举,但AWS刚好满足了它的转型需求。这个选择主要基于以下两个方面的考量:

  • 一方面是Netflix想要一个更可靠的基础设施。它希望删除系统中任何单一的故障点,而AWS正好提供了高度可靠的数据库、存储性能和冗余数据中心。Netflix需要云计算,这样它就不必再建立庞大而又不可靠的单体应用了。简而言之,它希望在不必独自建立数据中心的基础下提供全球化的服务,而这些需求都是老数据中心无法实现也不可能实现的。
  • 另一方面是Netflix不想再做无差别的繁重工作了。虽然这些工作都必须做,但这对于提供高质量视频服务这样的核心业务来说毫无优势。正好AWS为Netflix做了所有无差别的繁重工作,让Netflix有精力专注于提供核心业务价值。

几乎无宕机时间再加上云的弹性,使得既可靠又省钱的AWS成为了Netflix的不二之选。

在按下“播放”之前AWS内部发生了什么?

在按下“播放”之前,AWS预先处理了除视频服务之外的所有其他事情,包括可伸缩的计算、可扩展的存储、业务逻辑、可伸缩的分布式数据库、大数据处理和分析、建议、代码转换以及数以百计的其他功能。

  • 可伸缩的计算和可扩展的存储

可伸缩的计算在EC2实现,可扩展的存储在S3中实现。从播放列表到具体内容等视频服务都是通过Netflix设备(iPhone、TV、Xbox、安卓手机和平板等)访问EC2中的计算机获取的。

  • 可伸缩的分布式数据库

Netflix同时使用DynamoDB和Cassandra作为分布式数据库。如果你对这些数据库名称没有太大辨识度,那就把它们理解为高质量的数据库产品就好了。

数据库:数据库是用于存储数据的,这些数据包括配置文件信息、账单信息和看过的影视作品信息等各种类型的信息。
分布式:分布式意味着数据库不止运行在一台大的计算机上,而是运行在很多台计算机上。用户的数据会被拷贝到多台计算机上,这样的话即使其中一两台计算机上的数据出问题了,其他的计算机仍然保有这些数据,确保用户的数据是安全的。
可伸缩:可伸缩意味着无论用户存入多少数据,数据库都能进行处理。这是分布式数据库的主要优势之一,为了处理更多的数据,会按需增加计算机。

  • 大数据处理和分析

从字面上来看,我们知道大数据意味着有大量的数据。Netflix在记录用户习惯的过程中搜集了很多信息,比如用户看了什么内容,在哪儿看的,哪些视频是用户已经看过而不需要再看的以及每个视频的播放频次等等。我们把将所有数据统一成为标准的格式这个过程叫做大数据处理,把读懂、理解数据叫做大数据分析,大数据分析都是为特定的问题需求来做的。

  • 为每个用户做个性化的定制

Netflix是如何利用数据分析能力吸引用户看更多视频的呢?在我们检索视频的结果界面,每个视频都显示了一张图片(我们称之为页首图片)。这个页首图片可能会引起用户的兴趣和关注,引导用户最终选择观看这个视频。毋庸置疑,视频的页首图片越具有吸引力,用户就越可能观看该视频。一旦用户观看的视频越多,订阅Netflix内容的可能性就随之变大了。

如上图,虽然同样是《Stranger Things》,但是Netflix为它做了很多张不同的页首图片,并针对不同的用户进行个性化展示,这与以往我们常常只能看到相同的页首图片不同。那么它的原理是什么样的呢?

Netflix会从一组可选择的图片里面随机挑出一张,然后记录下视频被播放的次数以及相应的页首图片。在《Stranger Things》这个例子中,我们假设组图中央的那张图片作为页首图片时该影片被观看了1000次,而组图中的其他图片作为页首图片时该影片都只被观看了1次,这种情况下我们很容易看出中央那张图片更容易吸引用户的观看,Netflix就会把这张图片设为《Stranger Things》的页首图片。这样的选择方式我们称为数据驱动,Netflix正是以数据驱动型公司而闻名。

这样的做法看起来很聪明吧,但其实还可以做得更好,只是需要使用更多的数据,这就是未来通过学习数据来解决问题的主题。用户们是不同的人,大家可能不会被同一张页首图片所吸引,他们有不同的口味和偏好。Netflix也了解这点,这也就是它现在要为每个用户定制化所有图片的原因,它试图选出和用户最相关的作品亮点。那它是怎么做到的呢?

这里我需要强调一下,Netflix不仅会记录用户在它网站的的所有行为,也会进行相应计数。它会知道用户最喜欢看的影片,最喜欢的演员等等。我们假设Netflix为用户推荐了影片《Good Will Hunting》,Netflix首先做的是为用户选择页首图片,它的目标就是展示一张让用户会对这部影片感兴趣的页首图片,它怎么做出这个选择呢?

如果用户喜欢喜剧,Netflix会给用户看一个Robin Williams的形象。如果用户更喜欢浪漫的电影,那么Netflix会向用户展示Matt Damon和Minnie司机准备接吻的照片。通过展示Robin Williams,Netflix让用户知道电影中可能会有幽默的片段,因为Netflix知道用户喜欢喜剧,这段视频很适合。Matt Damon和Minnie司机的形象则传达了一个完全不同的信息,如果用户是一个喜剧迷,看到了这张图片,他可能会直接跳过。这也证明了精准选择页首图片的重要性,因为它向用户发送了一个强烈的个性化讯号(同时也展示了该影片的相关信息)。

发现没有,Netflix所选的页首图片会直接影响用户是否观看一部影片。Netflix在做选择的环节就迎合了用户的兴趣,而且它不作假,不会为了点击率而让用户看自己不喜欢的影片,这没有任何诱因。Netflix并不是每集视频都需要付费观看的,它试图最优化用户体验,希望用户对所观看的视频感到满意,所以它会为用户挑选最好的页首图片。

这只是Netflix应用数据分析的一个小例子,实际上它在每个地方都应用了这样的策略。

  • 推荐

Netflix是如何在成千上万的视频资源里面为用户推荐出四五十个视频的呢?主要归功于机器学习的使用,这也就和我们之前谈到的大数据处理和分析环节相关。Netflix正是利用了这些技术手段从它庞大的数据中预测出用户想看的内容。实际上用户在屏幕上看到的内容都是Netflix使用机器学习特别做过选择的。

  • 源视频的转码

Netflix需要转换出最适合用户设备的视频格式,这个过程称为转码或者编码。转码就是将视频文件从一个格式转化为另一个格式,使得不同的平台和设备都能观看同一个视频。Netflix在AWS中实现所有视频的转码,一次有将近300000个CPU同时工作,甚至大于超级计算机。

  • 从源媒体到用户看到的版本Netflix做了哪些处理?

视频生产工作室将视频发送给Netflix,Netflix称收到的视频为源媒体,并将这些新的视频交给内容运营团队进行处理。这些视频都是高清晰度的,大小都是TB级。在用户看到视频之前,Netflix会对视频进行严谨的多步处理。

具体步骤如下:

第1步:审核源视频
Netflix要做的第一件事情是花大量的时间审核源视频,寻找出数字工件,颜色变化或丢失的帧,这些可能是由之前的转码尝试或数据传输问题引起的。一旦发现问题,视频就会被撇弃。
第2步:注入媒体管道
视频审核完成之后就会被注入到媒体管道,经一系列步骤的处理使数据可用,像工厂中的流水线一样。在每个视频的创建过程中都使用了超过70种处理软件。由于直接处理单个的几TB大小的文件是不实际的,所以媒体管道的首要步骤是将视频分割成许多小块。
第3步:将放入管道中的视频块进行并行编码
也就是说,这些视频块是同时处理的。这也就是Netflix之所以要在EC2中使用很多服务器的原因,他们需要大量的服务器来并行处理这么大的视频文件。而且,Netflix给自己定了一个硬性要求,源媒体从开始编码到输送到CDN尽可能要在30分钟以内。一旦这些视频块编码完成,Netflix就会重新验证以确保不会出现新的问题,然后将这些视频块重新组合到一个文件中并再次验证。

这样做的直接后果就是会产生一堆文件。2007年,Netflix开始在微软的Windows系统上播放流媒体视频,随着时间的推移,Netflix开始支持更多的设备,包括:Samsung Blu-ray、Apple Mac、Xbox 360、LG DTV、Sony PS3、Nintendo Wii、Apple iPad、Apple iPhone、Apple TV、Android、Kindle Fire和Comcast X1。总的来说,Netflix支持2200个不同的设备,而它的最终目标是支持每一个联网设备,它为每个设备都配置了一个效果最好的视频格式,所以编码过程创建了大量的文件。Netflix将一个视频的所有不同格式称为其编码配置文件。

Netflix还为不同的网络速度创建了优化的文件。和慢速的网络状况相比下,用户在快速的网络状况下会看到更高质量视频。不同的音频格式同样有很多文件,音频可转码为不同的质量水平和不同的语言。也有用于字幕的文件,一个视频可能有许多不同语言的字幕。所以,每个视频都有很多观看版本,比如说我们上文提到的《Stranger Things》最终就生成了9570个不同的视频、音频和文本文件。观看版本的选择主要依据用户的播放设备、网络质量、Netflix计划和所选的语言等。

CDN的必要性

完成转码之后,Netflix怎么分发视频呢?Netflix已经尝试过三种不同的视频流策略,分别为:它自己的小CDN,第三方CDN和Open Connect。CDN存在的初衷是将视频放到离用户尽可能近的服务器中(遍布全世界)。当用户发起观看视频需求的时候,CDN找到离得最近的服务器(存有视频资源),将所需视频源传到用户播放设备。CDN最大的优点是稳定性和快速性。假设你在伦敦看视频,但是视频流来自俄勒冈州的波特兰,这种情况下视频会流经很多层网络,其中包括不可靠的地下光缆,这样会直接引起传输速度变慢以及造成传输不可靠。不难得知,视频内容离观看它的用户越近,给用户的观看体验就越快越稳定。

从2011年开始,Netflix意识到,以它的规模,它需要专用的CDN解决方案来最大化网络使用率。视频分发是它的核心竞争力,也将成为一个巨大的竞争优势。所以Netflix从2012年开始部署Open Connect。对Netflix来说,Open Connect有很多优势,比如:

  1. 不像第三方CDN那样贵,用起来比较节约钱。
  2. 质量更好,通过对整个视频生成路径(转码、CDN和设备端的客户)的控制,Netflix认为它可以提供更好的视频观看体验。
  3. 可伸缩性更强,Netflix的目标是为世界各地的用户提供服务,既要快速支持所有用户又要提供高质量的视频观看体验(需要建立自己的系统)。

第三方CDN必须支持用户访问来自世界各地的任何内容,而Netflix不需要。Netflix知道自己的用户是谁,因为用户必须订阅Netflix。Netflix也清楚地知道它需要播放哪些视频,当知道它只需要服务于大视频流时,Netflix就可以做出很多智能优化选择,而其他的CDN无法做到这一点。对于用户的偏好,Netflix也是非常了解,比如他们喜欢看什么视频,什么时候喜欢看。所以利用这些信息,Netflix建立了一个非常高效的CDN网络-Open Connect。

Open Connect是如何工作的?

为了存储视频,Netflix开发了自己的计算机系统。Netflix称其为OCAs(Open Connect Appliances)。每个OCA都是一个快速的服务器,高度优化过后可用于交付大文件,同时每个OCA有许多用于存储视频的硬盘和闪存驱动器。OCAs实体图如下:

按使用目的来划分可将OCAs分为几种:很大的OCAs可以存储Netflix的整个视频目录;稍微小一点的OCAs只能存储Netflix视频目录的一部分;更小的OCAs则用于存储非高峰时段主动缓存的视频。从硬件的角度来看,OCAs并没有什么特别之处,它们都是基于PC商品组件,由不同供应商在具体的定制案例中组装而成。从软件的角度来看,OCAs使用FreeBSD操作系统和Nginx作为Web服务器,并且每个OCA都有一个Web服务器,而Nginx主要作为视频流服务器使用。每个站点上的OCAs数量取决于Netflix对该站点可靠度的期望值、从该站点分发出来的Netflix流量(带宽)以及该站点所允许流经的流量百分比。

当用户按下播放键时,会看到由一个特定的OCA(在用户附近的位置)缓存的视频。为了获得最好的视频观看体验,Netflix甚至想做到在用户住所里缓存视,但这明显不切实际。所以,Netflix想尽可能地把mini-Netflix放到用户附近,它是怎么做到的呢?

Netflix在全球1000多个地点部署了大量的视频传输服务点。Netflix既不运营自己的网络,也不再运行自己的数据中心。取而代之,Netflix将OCAs放入互联网服务供应商(ISP)的数据中心中。这些OCAs被免费提供给ISP,以嵌入他们的网络。Netflix也将OCAs放在互联网交换位置(IXP)或接近IXP的位置。通过这种方式,Netflix不需要运行自己的数据中心就可以直接从别人的普通数据中心中获得所有的好处。

除此之外,Netflix每天会通过预测用户可能会观看的视频来进行主动缓存,提前将用户可能会观看的视频复制到相应的OCAs中。

总结:当你按下“播放”的时候发生了什么?

究竟Netflix是如何为用户提供视频服务的呢?我们做了如下总结:

  1. 用户通过终端设备上的Netflix客户端选择所要观看的视频,按下“播放”之后客户端发送播放请求给运行在AWS中的Netflix播放应用程序(请求简单陈述出用户想要播放的视频是什么)。在这儿需要给大家提一下“播放许可”,不是每个地方每个用户都有播放许可的。对于一些特别的视频,Netflix需要做一个鉴权以判断用户是否有“播放许可”。为了让世界各地的用户都不受“播放许可”的影响,创造属于自己的内容成为了Netflix最容易的方法。
  2. 考虑到各种相关信息,播放应用程序为不同的OCAs服务器(不超过10个)反馈URL,这些URL与用户在Web浏览器中使用的类型相同。Netflix通过ISP中的IP地址和信息来确定用户最适用的OCAs集群。
  3. 客户端通过测试每个OCA的网络连接质量来智能选择使用哪个OCA,优先考虑最快最可靠的。在视频流处理全程,客户端都保持测试状态,以探测出从OCA接收内容的最佳方式,然后连接OCA,开始将视频流传输至用户设备上。
  4. 不知道大家有没有注意到看视频时图像质量的不同,比如说有时候画面看起来很不清晰,但过了一段时间之后,画面又重回高清质量。这是因为客户端正在适配网络质量。如果网络质量下降,客户端会降低视频质量来适配。如果网络质量下降太多,客户端将切换到另一个OCA。

查看英文原文:Netflix: What Happens When You Press Play?

感谢丁晓昀对本文的审校。