最佳Spring批量扩展策略

use*_*755 11 parallel-processing spring scalability spring-batch

我们有简单的批处理工作,工作正常.最近,我们有新的需求来实现新的批处理以生成报告.我们有差异的数据源来阅读以准备此报告.具体来说,每个报告可能有一个视图.

现在我们希望以这样一种方式扩展这个过程,它可以扩展并尽早完成.

我熟悉多线程步骤但不确定其他策略(远程分块和分区步骤)以及何时使用.

在我们的案例中,处理+写入文件是更多的资源激励然后阅读.

在这种情况下哪种方法最适合.

或者,如果我们发现db中的读取数据与写入+处理到文件的资源激励相同,那么我们必须改进/扩展此过程的最佳选择是什么.

FGr*_*reg 28

TLDR;

根据您的描述,我认为您可以尝试使用同步读取器进行多线程步骤,因为您提到处理和写入是您步骤中更昂贵的部分.

但是,看到你的读者是一个数据库,我认为配置分区步骤和工作将是非常有益的.设置需要更多的工作,但从长远来看会更好地扩展.

多线程步骤

用来:

  • 加快个人步伐
  • 当读取器(即JMS或AMQP)可以处理负载平衡时
  • 使用自定义阅读器时,手动分区正在读取的数据

不要用于:

  • 有状态项目读者

多线程步骤利用Spring Batch采用的面向块的处理.当你多线程一步时,它允许spring批处理在它自己的线程中执行整个.请注意,这意味着您的数据块的整个读取 - 写入 - 写入周期将并行发生.这意味着没有保证处理您的数据的订单.另请注意,这不适用于有状态的ItemReaders(JdbcCursorItemReaderJdbcPagingItemReader都是有状态的).

具有同步读取器的多线程步骤

用来:

  • 加快处理和编写单个步骤
  • 阅读是有状态的

不要用于:

  • 加快阅读速度

有一种方法可以解决无法使用有状态项目阅读器的多线程步骤的问题.你可以用synchronize他们的read()方法.这实质上会导致读取连续发生(尽管仍然无法保证顺序),但仍然允许处理和写入并行发生.当读取不是瓶颈但处理或写入时,这可能是一个很好的选择.

分区

用来:

  • 加快个人步伐
  • 阅读是有状态的
  • 可以对输入数据进行分区

不要用于:

  • 当输入数据无法分区时

对步骤进行分区的行为与多线程步骤略有不同.通过分区步骤,您实际上拥有完全不同的StepExecutions.每个StepExecution都在它自己的数据分区上工作.这样,读取器在读取相同数据时就没有问题,因为每个读取器只查看特定的数据片段.这种方法非常强大,但设置起来比多线程步骤更复杂.

远程分块

用来:

  • 加快处理和编写单个步骤
  • 有状态的读者

不要用于:

  • 加快阅读速度

远程分块是非常先进的Spring Batch使用方法.它需要具有某种形式的持久中间件来发送和接收消息(即JMS或AMQP).通过远程分块,读取仍然是单线程的,但是当读取每个块时,它将被发送到另一个JVM进行处理.实际上,这与多线程步骤的工作方式非常相似,但是远程组块可以使用多个进程而不是多个线程.这意味着远程分块允许您水平缩放应用程序而不是垂直缩放它.(TBH我认为如果你正在考虑实现远程分块,你应该考虑看看像Hadoop这样的东西.)

平行步骤

用来:

  • 加快整体工作执行速度
  • 当存在不依赖于彼此的独立步骤时

不要用于:

  • 加快步骤执行速度
  • 依赖步骤

当您有一个或多个可以独立执行的步骤时,并行步骤非常有用.Spring批处理可以轻松地允许步骤在单独的线程中并行执行.