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

阅读数:935 2018 年 6 月 7 日

话题:CDN语言 & 开发架构

从用户端来看,使用 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?

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