如何使用 Spring Cloud Task 动态部署独立 Spring 批处理

Posted

技术标签:

【中文标题】如何使用 Spring Cloud Task 动态部署独立 Spring 批处理【英文标题】:How to dynamic deploy for standalone Spring batch using Spring Cloud Task 【发布时间】:2016-11-21 18:01:44 【问题描述】:

我们计划淘汰现有的遗留 Java 批处理应用程序,并使用最新的可用批处理框架重新创建它。 鉴于我们有大量的批处理作业需要现代化,我们正在寻找一个框架或架构,让我们能够

    开发一个批处理解决方案,使我们能够在创建新批处理时动态部署它们,而不会干扰现有已部署的应用程序。 - Spring cloud Task 是否提供任何此功能。注意:我们只希望将应用部署到我们的本地服务器,与云无关。 如果 Spring Batch/Boot 可以为我们提供我们通常期望从批处理应用程序中获得的功能,那么 Spring Cloud Task 的特殊附加值是什么? - 从在线提供的 Spring 文档中,我无法完全理解这一点。 从 Spring Cloud Task 的文档中,我了解到它允许应用程序在其中包含许多任务。如果每个任务都有自己的库依赖关系,这可能与其他任务的依赖关系相矛盾,我该怎么办?那么在这种情况下,是否应该将这些任务中的每一个都转移到一个新的应用程序中,还是有办法解决这个问题?

【问题讨论】:

只是在我回复之前澄清一下,所有这些都是为了在“裸机”上运行吗?虚拟机/物理服务器,而不是任何类型的云平台? 是的,没错。 【参考方案1】:

回答您的问题:

    Spring Cloud Task 是否处理编排 - 否。Spring Cloud Task 不处理任务或作业的编排。这个生态系统中处理任务或作业的部署/编排的组件实际上是 Spring Cloud Data Flow(这就是为什么我问你是否使用任何类型的云平台,包括 YARN、Cloud Foundry、Kubernetes 或 Mesos……环境Spring Cloud Data Flow 支持)。 Spring Cloud Task 相对于 Spring Boot/Spring Batch 提供了哪些附加值 - Spring Cloud Task 旨在提供以下几点:
      在状态管理方面与 Spring Batch 类似,无需创建批处理作业。在云环境中运行 Boot 应用程序时,没有标准的方法来获取不同环境的结果(YARN 处理作业结果的方式与 Cloud Foundry 上的任务不同,后者与 Kubernetes 上的作业不同等)。 Spring Batch 提供了这一点,但现在所有短期流程都需要 Batch API 的开销,因此 Spring Cloud Task 为这些用例提供了更轻松的体验。 自动添加信息监听器。 使用 Spring XD,当您在 XD 容器中运行作业时,XD 容器会自动添加一些信息监听器,这些监听器会广播您可以监听的事件。 Spring Cloud Task 无需 XD 容器即可带来相同的功能。 与 Spring Cloud Stream 的集成。 Spring Cloud Task 提供了从从 Spring Cloud Stream 接收到的消息启动任务的能力。此外,前面提到的信息性消息(批处理事件和任务事件)都是通过 Spring Cloud Stream 通道发送的。 DeployerPartitionHandler 在云环境中工作时,这个PartitionHandler 实现允许您将工作人员作为任务启动分区批处理作业。这允许动态扩展分区批处理作业,而不是在现代云环境中预先部署工作人员来监听工作的传统选项会浪费资源。
    多个任务的打包如何处理依赖关系- 总而言之,不推荐这样做。 Spring Cloud Task 的思想是 Spring Boot 应用程序的执行是 Task。虽然您可以打包多个任务并使用不同的方法,但让它们根据不同的刺激执行,这与正确使用 Spring Cloud Task 必不可少的 12 要素应用程序概念背道而驰。

我的两分钱 对于现代批处理平台的最佳选择,您确实需要首先研究一些平台,从 Cloud Foundry/Kubernetes/Mesos/YARN 层开始。否则,您最终将自己构建大部分基础架构。这就是 Spring XD 演变成 Spring Cloud Data Flow 的原因。 Spring XD 容器中增加的复杂性通过需要一个现代平台来运行(因为它们都自己处理这些保证)而被消除。如果没有这部分,您将花费大量时间来管理大多数现代平台为您处理的应用程序的部署和编排。

从那里开始,恕我直言,选择变得非常简单,Spring Cloud Task 用于简单任务,Spring Batch 用于批处理作业,Spring Cloud Data Flow 用于编排。

【讨论】:

非常感谢迈克尔。这真的很有帮助,内容丰富。

以上是关于如何使用 Spring Cloud Task 动态部署独立 Spring 批处理的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JobParameters 传递给 Spring Cloud Task 启动的批处理作业?

Spring Cloud Task

Spring Cloud Task 参考指南

Spring Batch 与 Spring Cloud Task Quartz 等概念辨析

Spring Cloud Task 参数不会传播到 Spring Batch 作业参数

Spring Cloud Task 主要是干什么的啊?跟 Quartz 和 Spring Task 有啥关系?