Spring 云数据流:任务的编程编排

Spring Cloud Data Flow : Programmatical Orchestration of Tasks

背景

我在 Kubernetes 中有 Spring 云数据流服务器 运行ning 作为 Pod。我能够从 SCDF server UI 仪表板启动任务。我希望开发一个更复杂的、真实世界的任务管道用例。

我不想使用 SCDF UI 仪表板,而是想从标准 Java 应用程序启动顺序任务列表。考虑以下任务管道:

任务 1: 从数据库中读取作为任务参数输入接收到的唯一 ID 的数据并执行扩充。丰富的记录被写回数据库。执行一个任务实例负责处理一个唯一id。

任务 2: 读取步骤 1 为作为任务参数输入接收到的唯一 ID 写入的丰富数据并生成报告。一个任务实例的执行负责为一个唯一的id生成报告。

从上面的解释应该很清楚,Task 1和Task 2是顺序步骤。假设输入数据库包含 50k 个唯一 ID。我想开发一个 orchestrator Java 程序来启动任务 1,限制为 40。(即只有 40 pods 可以在任务 1 的任何给定时间 运行ning。任何请求为任务 1 启动更多 pods 应该等待)。一旦通过任务 1 实例处理了所有 50k 个唯一 ID,只有这样才能启动任务 2 pods。

到目前为止我发现了什么

通过文档,我发现了一个叫做 CompositeTaskRunner 的东西。但是,这些示例显示了在 shell/cmd window 上触发的命令。我想做类似的事情,但不是打开数据流 shell 程序,而是想将参数传递给可以在内部启动任务的 Java 程序。这使我可以轻松地将我的应用程序与知道如何与 Java 代码集成的遗留代码集成(通过按需启动一个 Java 程序,该程序应启动一组任务并等待它们完成或者通过调用 Rest API).

问题

  1. 如何使用 Java 而不是数据流 shell 通过 Spring 云数据流以编程方式按需启动任务? (是否有一个 Rest-API 来执行此操作,或者一个简单的 Java 程序将 运行 在独立服务器上也应该没问题)
  2. 如何以编程方式构建顺序管道,每个任务可以启动的数量上限为 pods 并且具有依赖性,使得任务只能在前一个任务完成处理所有输入后才能启动.

请查看 Java DSL 对 Tasks 的支持。

您可以通过这种流畅的风格 API 执行 sequential/parallel 来编排任务。 [示例:.definition("a: timestamp && b:timestamp")]

使用此定义为 Java 的代码,您将能够构建、启动或安排这些有向图的启动。我们看到许多客户采用这种方法进行 E2E 验收测试和部署自动化。

[添加]

此外,您还可以扩展 continuous deployments 的编程任务定义。