Netflix Cosmos平台:微服务+工作流+无服务器


Cosmos是一个计算平台,将微服务的最佳方面与异步工作流和无服务器函数结合在一起。它的优点是应用程序涉及资源密集型算法,这些算法通过复杂的层次化工作流进行协调,持续时间长达数分钟到数年不等。它既支持一次消耗数十万个CPU的高吞吐量服务,又支持对延迟敏感的工作负载,在这些负载下,人们正在等待计算结果。

本文将说明我们构建Cosmos的原因,其工作方式并分享我们在此过程中学到的一些知识。
 
概述
Cosmos服务不是微服务,但是有相似之处。Cosmos服务保留了微服务的强大合同和隔离的数据/依赖关系,但添加了多步工作流和计算密集型异步无服务器功能。
传统的微服务是具有无状态业务逻辑的API,该API可根据请求负载自动缩放。该API与对等方提供了强有力的合同,同时将应用程序数据和二进制依赖项与其他系统隔离开来。
在Cosmos服务的下图中,客户端将请求发送到视频编码器服务API层。一组规则协调工作流步骤,以及一组无服务器功能为特定于域的算法提供支持。函数打包为Docker映像,并带来它们自己的特定于媒体的二进制依赖性(例如,debian软件包)。它们根据队列大小进行缩放,并且可以在成千上万个不同的容器上运行。请求可能需要几个小时或几天才能完成。

 
关注点分离
Cosmos有两个分离轴。一方面,逻辑在API,工作流和无服务器功能之间划分。另一方面,逻辑在应用程序和平台之间是分开的。平台API为应用程序开发人员提供了特定于媒体的抽象,同时隐藏了分布式计算的详细信息。例如,视频编码服务由与规模无关的组件构成:API,工作流和功能。
他们没有关于其经营规模的专门知识。这些特定于域的,与规模无关的组件是建立在三个可感知规模的Cosmos子系统之上的,这些子系统处理分配工作的细节:

  • Optimus,一个将外部请求映射到内部业务模型的API层。
  • Plato,用于业务规则建模的工作流层。
  • Stratum,一个无服务器层,要求运行无状态和计算密集型功能。

子系统都通过Timestone(一种大规模,低延迟优先级排队系统)彼此异步通信。每个子系统都解决了服务的不同问题,并且可以通过专门构建的托管连续交付流程来独立部署。关注点的分离使编写,测试和操作Cosmos服务变得更加容易。


  
工作流规则
Plato是通过为服务开发人员提供一个定义域逻辑和协调无状态功能/服务的框架,将Cosmos中的所有内容联系在一起的粘合剂。
Plato是一个前向链接规则引擎,可使其适用于我们算法的异步和计算密集型性质。与Netflix的Conductor这样的过程性工作流引擎不同,Plato使创建“始终在线”的工作流变得容易。例如,随着我们开发更好的编码算法,基于规则的工作流程将自动管理更新现有视频,而无需触发和管理新的工作流程。此外,任何工作流程都可以调用另一个工作流程,从而实现了上述服务的分层。
Plato是一个多租户系统(使用Apache Karaf实现),可以大大减少工作流的操作负担。用户在自己的源代码存储库中编写和测试他们的规则,然后通过将编译后的代码上传到Plato服务器来部署工作流。
开发人员通过以Emirax(一种基于Groovy构建的领域特定语言)编写的规则来指定其工作流程。每个规则有4个部分:

  • match:指定触发此规则必须满足的条件
  • 动作:指定触发该规则时要执行的代码;在这里,您可以调用Stratum函数来处理请求。
  • reaction:指定操作代码成功完成时要执行的代码
  • 错误:指定遇到错误时要执行的代码。

在这些部分的每一个中,您通常通常首先记录工作流状态的变化,然后执行使工作流向前移动的步骤,例如执行Stratum函数或返回执行结果
  
我们于2018年开始构建Cosmos,并自2019年初开始投入生产。Optimus,Plato和Stratum是独立构思的,最终融合为一个平台的愿景。团队中的应用程序开发人员使每个人都专注于用户友好的API和开发人员的生产力。基础架构和媒体算法开发人员之间建立了牢固的伙伴关系,以将愿景变为现实。我们不可能在自上而下的工程环境中做到这一点。
 
微服务+工作流程+无服务器
我们已经发现,“触发工作流对无服务器函数编排的微服务”的编程模型是一个强大的范例。它对我们的大多数用例都适用,但是某些应用程序非常简单,以至于增加的复杂性是不值得的。
更多点击标题见原文。