卡伦·卡塞拉 ( Karen Casella) , 菲利普·艾利 ( Phillipa Avery) , 罗伯特·雷塔 ( Robert Reta) , 约瑟夫 ·布劳 ( Joseph Breuer)
在2016年初,几个Netflix团队被问到一个问题:“允许成员在他们的移动设备上离线下载和查看内容需要什么?”
- Netflix计划在2018年发行80部原创电影供您添加到列表中,然后完全忘记
- 今年6月在Netflix上播出100部必看纪录片
- 鸟箱
- “ Trolls The Beats Goes On”展示了更多音乐世界–
- Netflix获得“关闭” —女权主义电影制片厂陷入困境
对于“播放许可”团队来说,这意味着我们需要提供一个内容许可系统,该系统将允许会员的设备存储和解密下载的内容以供离线查看。 要安全地执行此操作,将需要一项新服务来处理一组尚未定义的复杂业务验证,以及用于客户端和服务器交互的新API。 此外,当我们所有现有系统都为无状态时,我们确定此新服务需要为有状态的。
“大! 那要花多长时间?
2016年11月下旬,是在问了最初问题9个月后,Netflix成功启动了新的下载功能,该功能使会员可以在其移动设备上下载和播放内容。 数个产品和工程团队合作设计和开发了这项新功能,该功能同时向全球所有Netflix成员推出。
本系列文章将概述为什么以及我们如何建立新的许可系统来支持Netflix下载体验。 在本系列的第一篇文章中,我们概述了Netflix下载项目及其对Netflix内容许可团队的意义。 进一步的帖子将更深入地介绍我们为满足这些要求而创建的解决方案。
流播放如何工作
当成员在Netflix上流式传输内容时,我们会先从后端服务器将数据传送到其设备,然后才能开始播放内容。 这些数据是通过我们的回放服务系统上的复杂的设备到服务器交互来检索的,可以总结如下。

为了播放标题,成员的设备检索与内容相关联的所有元数据。 响应对象称为“播放上下文”,其中包含诸如内容的图像资产和用于流传输内容的URL之类的数据(有关流播放过程和系统的出色概述,请参阅Netflix如何引导互联网流量的1/3)。 )。 流式传输的数据已使用数字版权管理(DRM)技术进行了加密,必须对其进行解密才能观看。 这是通过许可过程完成的,在该过程中,设备可以请求特定标题的许可,然后使用该许可来解密该设备上的内容。 在流传输的情况下,许可证是短暂的,并且只能使用一次。 成员观看完内容后,该许可证被视为已消耗并且不再可以用于播放。
Netflix支持多种不同的DRM技术,以实现内容许可。 这些中的每一个都生活在自己的微服务中,需要独立的扩展和部署策略。 该许可层需要尽可能强大和可靠。 尽管Netflix的许多服务都定义了后备功能,以在出现故障或请求延迟时提供可能降级的体验,但许可服务却没有后备功能。 如果许可下降,则不会播放。 为了降低可用性和弹性的风险,并允许灵活扩展,传统上,许可服务是无状态的。
还有下载…
下载流程与流媒体下载流程略有不同。 与流式传输流程类似,我们为下载的内容生成一个播放上下文(元数据)。 一旦有了内容的元数据,就可以启动许可证流,如下所示:

在检查以确保可以下载标题后,成员的设备尝试获取许可证。 然后,我们执行几次后端检查,以验证是否允许成员下载内容。 如果满足各种业务规则,我们将退回许可和用于离线播放内容的任何其他信息,然后设备可以开始下载加密的字节。
用于下载内容的许可证也不同于流传输-许可证可以在设备上保留更长的时间,并且可以在多个播放会话中重复使用。
标题下载到设备后,其生命周期如下:

成员每次按一下下载内容上的播放按钮时,应用程序都会将会话事件排队,以提供有关观看体验的信息,并在成员下次上线时将其发送出去。 但是,在为每个标题定义了期限后,随下载内容检索的原始许可证将到期。 此时,取决于内容,可能可以续订许可证,这要求设备向后端请求续订的许可证。 此续订还根据下载的业务规则进行了验证,如果成功,则可以继续离线播放内容。 成员删除内容后,将安全关闭(发布)许可证,以确保不再脱机播放内容。
限制迷宫
Netflix与全球各地的工作室合作伙伴合作,为我们的会员获取最佳内容。 通常,对下载内容的限制要比对流媒体的限制更为复杂,并且各工作室之间的差异也要大得多。 除了与标题可以观看多长时间相关的要求外,我们还根据设备或每个成员的下载次数以及可能限制标题在一个电影中下载或观看多少次的限制,有多种不同的上限。指定的时间段。
我们还具有与下载观看相关的内部业务限制,例如可以在其上下载内容的设备数量。
我们必须对Netflix成员下载的所有合并电影都应用所有这些限制。 成员每次在初始许可到期后下载标题或想要延长观看时间时,我们都必须针对该伙伴的所有可能限制来验证请求,并考虑到成员过去的下载交互。 如果成员不满足这些要求中的任何一个,则后端会发回响应,并说明下载请求失败的原因。
下载的开始(和这篇文章的结尾)
随着下载功能的引入,我们需要重新考虑维护状态的方法。 下载功能要求我们根据以前的下载历史记录来验证是否允许成员播放。 我们决定在请求许可证时执行此验证,因此我们需要一个新的有状态服务,许可服务可以参考该服务来验证业务规则。 我们花了很短的时间来设计这个新的有状态系统,该系统将强制执行业务规则并根据尚未定义的一组要求拒绝许可。
我们拥有从零开始创建新服务的绝佳机会,现有用户数百万,并且创建时间有限。激动人心的时刻即将来临!
更多信息,请!
在本系列的下一篇文章中,我们将讨论为验证和跟踪下载使用情况而创建的服务:事件源支持的有状态存储微服务。 未来的帖子将深入探讨实施细节,包括使用数据版本控制和快照以提供灵活性和可扩展性。
该团队最近在纽约QCon上提出了这个主题,您可以在这里下载幻灯片并观看视频。 加入我们在纽约Velocity(2017年10月2日至4日),对实施和经验教训进行更深入的技术探讨。
作者是Netflix Playback许可团队的成员。 我们以成为分布式系统开发和运营方面的专家而感到自豪。 而且,我们正在招聘高级软件工程师! 如有必要,请发送电子邮件至kcasella@netflix.com或在LinkedIn上进行连接。