最近在研究后端应用架构相关的东西,微服务、事件驱动、CQRS、Event Souring ... 打算实践之后给大家提供一套可实施的方法。(11/11 —— 11/17 可以参加宁皓网的后端应用架构训练,理解微服务、GraphQL、CQRS 在 Node.js 中的实现方法。)
了解 CQRS 与 Event Souring 的时候,找到了 Netflix 分享的一个相关案例,在他们的播放授权服务中用到了 Event Souring 这种模式的事件驱动架构。Netflix 提供影视流媒体订阅服务,全球有 1.5 亿订阅用户。
本来 Netflix 只提供在线的流媒体播放,2016 年初的时候,有团队提出是否可以允许用户下载视频实现离线播放,团队花了 9 个月的时间上线了这个下载离线播放功能。用 Event Sourcing 模式的架构开发了一个灵活,可靠,可扩展,可调试的新服务。
下面我们先理解一下,用户在 Netflix 上按了播放按钮与下载按钮之后都发生了什么。
在线播放(Streaming)
用户在自己的设备上,按了播放按钮以后,设备会先去请求一个元数据服务(Metadata Service)。这个元数据服务会返回用户需要播放的内容相关的一些元数据,比如跟这个视频相关的图像资源,内容的播放地址等等,Netflix 管这些东西叫 Playback Context。
视频内容是用 DRM(Digital Rights Management,数字版权管理) 技术加密过的,所以只有在解密之后才能正常播放视频内容。解密内容需要用到一个 License(许可证)。用户设备得到播放信息之后就会到许可服务(License Service)那里请求一个播放这个视频内容的许可证。设备有了这个许可证,就可以用它解密加载后的内容,这样设备就可以播放视频了。
在线播放的时候,用户设备会不断的发布一些事件通知给后端服务,比如 START(开始),PAUSE(暂停),RESUME(恢复),STOP(停止) 等等。申请获取到的这个许可证是短期的,而且用一次就作废了。也就是用户按了 “停止” 以后,设备会申请释放播放许可证,这个许可证也就不能再用了。
从上面这个流程可以看出,Netflix 的这个颁发许可证的服务非常重要,因为用户请求播放视频,如果从这个许可服务那里获取不到许可证,就无法正常播放加密的视频内容。
离线播放(Downloads)
用户在设备上按了 “下载” 按钮,用户设备会到元数据服务(Metadata Service)那里请求要下载的内容相关的信息。确定内容可以被下载,用户设备就会到许可服务那里申请一个许可证。
许可服务需要再到一个验证服务那里查询一下,判断用户能不能下载需要下载的内容。如果可以,用户设备就会得到颁发的许可证,在用户设备上可以使用这个许可证解密下载下来的视频内容,然后离线播放视频内容。
跟在线播放不太一样的是,下载的时候得到的许可证可以重复使用一段时间,比如可以使用 30 天。过期以后,可以申请续期,延长许可证的使用时间。用户删除了下载到本地的视频以后,设备申请释放许可证,后端服务处理之后,就会给用户留出新的下载机会。
离线播放的时候,设备会把一些播放事件放到一个队列里,等用户上线以后,设备会把队列里的事件再交给后端服务。
下载功能的限制比在线播放要多很多,Netflix 会跟很多影视公司合作,不同的影视公司对下载都有自己的要求,另外 Netflix 本身对下载也会有一些限制。
比如一个下载的视频内容可以被看多少次,能看多久,同一内容在一年之内可以被下载多少次。一个用户可以下载的内容是多少,能下载多少同一个影视公司制作的内容,用户都在什么设备上下载了视频,看了多少次等等。用户可以下载并能正常播放,需要通过这些非常复杂的限制,而且这些限制会不断的变化。所以这个许可服务需要非常灵活,最终 Netflix 团队选择使用了 Event Sourcing 这种模式的架构 。
广告:CQRS、Event Sourcing 都是经常用在事件驱动架构里的设计模式。11/11 —— 11/17 可以参加宁皓网的后端应用架构训练,理解微服务、GraphQL、CQRS 在 Node.js 中的实现方法,了解详情 →