【问题标题】:Configuration of MessageChannelPartitionHandler for assortment of remote steps为各种远程步骤配置 MessageChannelPartitionHandler
【发布时间】: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 个步骤。

  1. 是否每个主作业(或步骤?)都需要自己的请求和回复通道,以及扩展自己的 OutboundChannelAdapter?或者请求和回复通道是否共享?
  2. 是否每个主作业(或步骤?)都需要自己的聚合器?暗示这意味着每个作业(或步骤)都有自己的分区处理程序(现有代码库可能支持)
  3. 从站上的 StepLocator 似乎需要一个跨所有步骤的共享回复通道,但在我看来,messageChannelpartitionHandler 每个步骤都需要一个单独的回复通道。

    我认为不清楚(但我不能说,因为不清楚)是聚合的ReplyChannel如何拾取单个回复通道,然后返回到正确的步骤。当然,我可能会迷失方向,我问错了问题

  • 您在工作人员方面有一个 slavePartitionHandler 的事实让我有点困惑,我不确定我是否理解您在寻找什么。您是尝试在单个工作人员中运行多个步骤还是尝试在工作人员上运行分区步骤(意味着每个工作人员创建第二级分区,即对分配给它的分区进行分区)?
  • 高层次的期望:我想利用集群的资源来运行我所有正在运行的作业中的所有繁重的步骤。我的特定流程适合大规模并行处理。我可能在任何给定时间运行数百个作业,每个作业都有不同的处理(步骤),并且可以分成潜在的数千个分区,每个分区有几千行数据。我希望将繁重的工作集中到集群进行处理。由于另一个 SO 线程,slavePartitionHandler 是几年前实现的。
  • ...(续)是的,远程流可以进一步拆分或分区
  • ...另一方面,如果它是多余的、无关的或对系统有负面影响,我都赞成删除您观察到的 slavePartitionHandler。
  • 感谢您的更新。我将添加一些细节的答案,希望能提供尽可能多的帮助。

标签: java spring-batch


【解决方案1】:

在工作人员端执行的步骤类型是完全任意的,因此没有什么能阻止您在工作人员端运行分区步骤。实际上,这允许您实现二级分区,其中每个工作人员可以进一步分区分配给它的分区。

现在回答你的问题:

从纯粹实用的角度来看,这是否意味着我可以简单地添加更多 MessageChannelPartitionHandler bean 对来引用适当的步骤,以确保生成的分区被工作系统上的正确步骤 bean 拾取和执行?

是的,如前所述,worker 端的 step 可以是 partitioned step。所以它需要自己的Partitioner/PartitionHandler 两人团队。

或者我是否需要插入带有决策者的流程以从步骤 ExecutionContext 中选择适当的步骤?

这种方法没有错,但我个人不推荐它。原因是这种方法会使实现变得复杂,因为几乎所有组件都应该是步进范围的以访问 EC,以便设置/获取执行所需的分区元数据(执行步骤、分区定义等)工作。试一试,你很快就会明白我要解释什么。

或者我应该实现一个 StepLocator bean?

如果 step bean 是在工作端引导的应用程序上下文之外定义的,那么这可能是一个选项。否则,可以使用默认的BeanFactoryStepLocator 来定位工作人员上下文中定义的(分区的)步骤。


也就是说,我只是想分享一些在朝着同一个目标工作时的个人经验:如何在不同机器上运行多个作业时最大限度地利用资源。以下是效果良好的非详尽列表:

  • 将作业实例设计为彼此独立(例如,每个输入文件都有一个作业实例,而不是处理所有输入文件的单个作业)。这最大限度地提高了并行性并实现了容错
  • 将远程分区/分块与工作人员的多线程步骤相结合。这有点类似于您正在尝试做的事情。唯一的区别是在工作人员上使用多线程步骤,而不是您尝试做的分区步骤(顺便说一句,我从未尝试过)。

我试图在这篇文章中总结我在这件事上的经验:Spring Batch on Kubernetes: Efficient batch processing at scale

【讨论】:

  • 我会确保阅读链接的文章。当我慢慢想起您和您的同胞在之前的链中试图告诉我的内容时,接收 MessageChannelPartitionHandler 仅响应对已识别步骤的请求。因此,如果我有 100 个可用步骤由主分区器排队,我需要 100 对 MessageChannelPartitionHandler 附加到 AMQ 系统。
  • 好吧,我比以往任何时候都更加困惑。我已经开始尝试正式分析我们所拥有的工作并将其转化为下一步。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 2012-06-23
  • 2019-11-21
相关资源
最近更新 更多