【发布时间】:2022-08-23 03:19:17
【问题描述】:
如果这个问题被重复,我很抱歉。
我们目前的环境:
Java 1.17
Spring 5.3.18
Spring batch 4.2.8
在高层次上,我们的架构意图是在物理上将启动器线程与我们的 Spring 批处理进程的执行线程分开,在工作节点上的可用处理器上快速处理繁重的工作负载步骤。我们为这种操作模型设计了分区器和流程。
期望在工作系统上,我们可以有一堆“step”bean 松散地漂浮在 JVM 中,在“master”JVM 上进行分区,通过 AMQ 传播出去,然后在工作人员虚拟机。
我已经查看了https://docs.spring.io/spring-batch/docs/4.2.x/reference/html/spring-batch-integration.html#remote-partitioning 的文档。给出的示例(实际上是我迄今为止在 Internet 上找到的所有示例)都被编写成好像有一个正在远程运行的“A”单步。
今天:
由于 Spring 和 Java 作用域的一些特殊性,我们对作业使用 XML bean 配置。具有讽刺意味的是,在我们的例子中,XML bean 定义提供了 Java DSL 中不可用的范围选项。
下面的 XML 摘自具有单个远程步骤 bean 的工作配置。
在主控端,我们有这个 PartitionHandler 配置:
<bean id=\"ecPartitionHandler\" class=\"org.springframework.batch.integration.partition.MessageChannelPartitionHandler\">
<property name=\"stepName\" value=\"as-step0002.slave\"/>
<property name=\"jobExplorer\" ref=\"jobExplorer\"/>
<property name=\"messagingOperations\" ref=\"amqMessagingTemplate\"/>
</bean>
<int:poller default=\"true\" task-executor=\"stepTaskExecutor\" fixed-delay=\"1000\" />
在从属端,我们有这样的配置:
<bean id=\"stepExecutionRequestHandler\"
class=\"org.springframework.batch.integration.partition.StepExecutionRequestHandler\">
<property name=\"jobExplorer\" ref=\"jobExplorer\" />
<property name=\"stepLocator\" ref=\"stepLocator\" />
</bean>
<bean id=\"stepLocatorAmq\"
class=\"org.springframework.batch.integration.partition.BeanFactoryStepLocator\" />
<bean id=\"slavePartitionHandler\" class=\"org.springframework.batch.integration.partition.MessageChannelPartitionHandler\">
<property name=\"stepName\" value=\"as-step0002.slave\"/>
<property name=\"gridSize\" value=\"3\"/>
<property name=\"messagingOperations\" ref=\"stepMessagingTemplate\"/>
</bean>
<bean id=\"amq-properties\"
class=\"com.maxis.mxarchive.spring.InjectableProperties\"
factory-method=\"getAmqProperties\">
<constructor-arg ref=\"configPropertiesService\" />
</bean>
观察:
发起主控和接收从属消息处理程序都直接引用要执行的特定步骤。
问题:
从纯粹实用的角度来看,这是否意味着我可以简单地添加更多 MessageChannelPartitionHandler bean 对来引用适当的步骤,以确保生成的分区被工作系统上的正确步骤 bean 拾取和执行?
或者我是否需要插入带有决策者的流程以从步骤 ExecutionContext 中选择适当的步骤?
或者我应该实现一个 StepLocator bean?
谢谢,
哎呀,我比以往任何时候都更迷失了。由于我发现的示例似乎是针对最简单的场景构建的,因此对于我正在尝试构建的模型几乎没有什么可推广的。
这是架构的近似值:
将有 0 到 n 个作业同时运行,从从属 VM 上同时运行的许多作业有 0 到 n 个步骤。
- 是否每个主作业(或步骤?)都需要自己的请求和回复通道,以及扩展自己的 OutboundChannelAdapter?或者请求和回复通道是否共享?
- 是否每个主作业(或步骤?)都需要自己的聚合器?暗示这意味着每个作业(或步骤)都有自己的分区处理程序(现有代码库可能支持)
- 从站上的 StepLocator 似乎需要一个跨所有步骤的共享回复通道,但在我看来,messageChannelpartitionHandler 每个步骤都需要一个单独的回复通道。
我认为不清楚(但我不能说,因为不清楚)是聚合的ReplyChannel如何拾取单个回复通道,然后返回到正确的步骤。当然,我可能会迷失方向,我问错了问题
-
您在工作人员方面有一个
slavePartitionHandler的事实让我有点困惑,我不确定我是否理解您在寻找什么。您是尝试在单个工作人员中运行多个步骤还是尝试在工作人员上运行分区步骤(意味着每个工作人员创建第二级分区,即对分配给它的分区进行分区)? -
高层次的期望:我想利用集群的资源来运行我所有正在运行的作业中的所有繁重的步骤。我的特定流程适合大规模并行处理。我可能在任何给定时间运行数百个作业,每个作业都有不同的处理(步骤),并且可以分成潜在的数千个分区,每个分区有几千行数据。我希望将繁重的工作集中到集群进行处理。由于另一个 SO 线程,slavePartitionHandler 是几年前实现的。
-
...(续)是的,远程流可以进一步拆分或分区
-
...另一方面,如果它是多余的、无关的或对系统有负面影响,我都赞成删除您观察到的 slavePartitionHandler。
-
感谢您的更新。我将添加一些细节的答案,希望能提供尽可能多的帮助。
标签: java spring-batch