Cadence:驯服复杂流程的工作流引擎


Cadence是一个开源的无故障状态代码平台和工作流引擎,专为解决与第三方 API、内部服务和长期运行的业务流程进行复杂交互的挑战。Cadence 为使用需要容错的基于微服务的架构以及包含无数多步骤并发工作流或与多个第三方 API 交互的应用程序的开发团队提供了很多价值。
Cadence 将应用程序的整个状态保存在与任何特定进程无关的持久虚拟内存中。存储的应用程序状态包括用户定义活动的所有调用参数和返回结果。然后,它使用该信息来赶上并重播被中断的工作流。
Cadence 拥有使开发人员能够使用 Java、Go、Python 和 Ruby 等流行语言创建和协调工作流的库。Cadence 服务(例如工作人员)在很大程度上是无状态的,并利用数据存储来实现任务/工作流的持久性。支持的存储选项包括开源 Cassandra 和 MySQL/PostgreSQL,并且适配器可用于任何具有多行单分片事务的数据库。还提供多种服务部署模型。例如,Uber 使用由数百个应用程序共享的多租户 Cadence 集群。
Cadence 的优势体现在以下用例中:

  • 定期执行(分布式 cron)。Cadence 保证定期调度的业务逻辑的执行,完成复杂的错误处理、重试策略和异步历史事件复制。重要的是,Cadence 支持大规模并行执行作业,能够同时执行数百万个工作流。

  • 微服务编排。实现为多个微服务调用的业务流程必须使所有这些调用成功,即使下游服务失败。Cadence 保证工作流代码的完成,支持无限重试并使补偿逻辑易于开发,例如 SAGA 模式。

  • 轮询。定期检查状态更改的轮询作业(通常用于监视或文件处理)与 Cadence 对长时间运行的活动和无限重试的支持特别匹配。

  • 事件驱动的应用程序。Cadence 直接支持异步事件,并为开发人员抽象出状态持久化的复杂性,使实现侦听多个事件源的应用程序变得简单。

  • 存储扫描。Cadence 支持对大型分区数据集(甚至是数十亿个文件)进行可扩展、弹性和完整的扫描。

  • 批量作业。对于外部 API 调用可能失败的批处理作业,Cadence 保证持久性。

  • 基础设施供应。长时间运行的配置操作可能会出现间歇性故障;Cadence 可以防止这种情况发生。该平台还支持将活动执行路由到特定进程或主机,以及可扩展的容错锁定行为以一次在资源上执行单个突变。

  • CI/CD 管道和应用程序部署。通过使开发人员能够专注于业务逻辑,Cadence 为构建部署解决方案提供了一个理想的平台。

  • 运营管理。Cadence 支持自动管理和恢复,以创建自操作数据库等。

  • 交互式应用程序。Cadence 的性能和可扩展性支持 UI 会话状态跟踪和同步后台操作执行。

  • DSL 工作流程。Cadence SDK 允许开发人员编写解释 DSL 流程定义的容错、可扩展、持久的应用程序。

  • 大数据和机器学习。Cadence 为大数据和机器学习解决方案提供强大的控制平面,提供任务执行路由来控制 ML 模型和其他文件的分配方式。

要开始使用 Cadence,请获取Cadence 服务器或Docker 映像的[url=https://github.com/uber/cadence]GitHub 存储库[/url]。
在此处获取最新的 Cadence Java 客户端。将其作为依赖项包含在您的 Java 项目中:
通过向连接到 Cadence 服务的工作人员注册,将此工作流链接到 Cadence 框架(工作人员默认连接到本地运行的服务)。

public static void main(String[] args) {
  WorkflowClient workflowClient =
      WorkflowClient.newInstance(
          new WorkflowServiceTChannel(ClientOptions.defaultInstance()),
          WorkflowClientOptions.newBuilder().setDomain(DOMAIN).build());
  // Get worker to poll the task list.
  WorkerFactory factory = WorkerFactory.newInstance(workflowClient);
  Worker worker = factory.newWorker(TASK_LIST);
  worker.registerWorkflowImplementationTypes(HelloWorldImpl.class);
  factory.start();
}

现在,通过运行工作程序使用 CLI 执行 Hello World 工作流。

> docker run --network=host --rm ubercadence/cli:master --do test-domain workflow start --tasklist HelloWorldTaskList --workflow_type HelloWorld::sayHello --execution_timeout 3600 --input \"World\"
 
Started Workflow Id: bcacfabd-9f9a-46ac-9b25-83bcea5d7fd7, run Id: e7c40431-8e23-485b-9649-e8f161219efe