经过六年的开发,Uber发布了一个名为Cadence的工作流编排平台的重要版本。Uber和其他公司可以使用Cadence使用本地编程语言大规模构建有状态服务。团队将继续改进后续版本的可用性、可观察性和效率。
Cadence是一个用于工作流编排的开源平台。与该类型的其他系统一样,它有助于在确保效率和可靠性的情况下大规模地处理复杂的有状态工作流。与类似的平台不同,Cadence的工作流是直接用Java和Go(官方支持)、Python或Ruby(由社区支持)等编程语言定义的。
Uber高级经理Ender Demirkaya解释了Cadence这样构建编排工作流方法的原因:
“传统上,工作流是使用领域特定语言(DSL)或配置文件编写的,这些文件定义了任务的顺序和依赖关系。虽然这种方法简化了工作流编排,但随着时间推移,它限制了用户对工作流的操作,或者使DSL和配置文件过于复杂,已经不再实用。使用案例的增加和复杂性的增加证明了像编写本地编程语言中的程序一样自由编写工作流的必要性。与使用配置文件和DSL不同,编程也是软件工程师的自然思维方式。”
典型的Cadence应用程序由Cadence服务、工作流和活动工作者以及外部客户端组成。除Cadence服务外,其他组件是特定于应用程序的,负责定义和配置工作流以及执行工作流步骤。
Cadence服务是一个具有gRPC API的高度可扩展的多租户系统,它提供了工作流编排的核心功能,包括存储版本化的工作流定义和将工作流任务执行分派给应用程序拥有的工作程序。它还提供了一个无状态的API前端和内部工作程序,用于执行特定于Cadence的工作流,比如归档。在Uber的典型部署中,Cadence服务可以支持100多个应用程序。对于本地开发,使用一个使用Docker的本地Cadence实例。
Cadence服务将数据存储在持久数据存储中,并支持Apache Cassandra、MySQL、PostgreSQL、CockroachDB和TiDB。此外,可以使用ElasticSearch或OpenSearch集群实现高级搜索功能。
在Uber,Cadence支持超过一千个服务,并每月管理超过120亿个工作流执行。该平台用于各种功能,包括微服务编排、批处理、分布式定时任务、分布式cron、数据管道、模型训练等。
在1.0版本发布之后,团队希望通过更好的文档、代码示例和应用代码质量检查来改进可用性,包括操作和开发领域。此外,他们计划在可观察性方面进行改进,扩展报告的指标,提供更多可用的警报,并与Web界面进行更好的集成。最后,团队将努力降低数据库负载并增加存储容量。
Cadence 是 Uber 开发的原创开源项目,但目前已有包括 Temporal 在内的 700 多个分支。