我无法理解Spring批处理中多线程和分区之间的区别。实现方式当然有所不同:在分区中,您需要准备分区,然后对其进行处理。我想知道当瓶颈是项目处理器时,区别是什么,哪种是更有效的处理方式。

最佳答案

TL; DR;
当瓶颈在处理器中时,两种方法都无济于事。通过使多个项目同时通过一个处理器,您会看到一些收获,但是当您指出的两个选项在受I/O约束的流程中使用时,它们都会发挥其全部优势。 AsyncItemProcessor/AsyncItemWriter可能是一个更好的选择。

Spring Batch可伸缩性概述
有五个用于扩展Spring Batch作业的选项:

  • 多线程步骤
  • 并行步骤
  • 分区
  • 远程分块
  • AsyncItemProcessor/AsyncItemWriter

  • 每个人都有其自身的优点和缺点。让我们逐一介绍一下:

    多线程步骤
    多线程步骤仅执行一个步骤,并在单独的线程上执行该步骤中的每个块。这意味着每个批处理组件(读取器,写入器等)的相同实例在线程之间共享。在大多数情况下,这可以通过在步骤中添加一些并行性来提高性能,但以可重新启动性为代价。您牺牲了可重新启动性,因为在大多数情况下,重新启动的能力取决于读取器/写入器/等内部保持的状态。随着多个线程更新该状态,该状态将变为无效且无法重新启动。因此,您通常需要关闭各个组件的保存状态,并在作业上将可重启标志设置为false。

    并行步骤
    并行步骤是通过拆分实现的。它允许您通过线程并行执行多个独立的步骤。这不会牺牲可重启性,但不会帮助提高单个步骤或业务逻辑的性能。

    分区
    分区是指先通过主步骤将数据划分为较小的块(称为分区),然后让从属在分区上独立工作。在Spring Batch中,主服务器和每个从服务器都是一个独立的步骤,因此您可以在一个步骤中获得并行性的好处,而无需牺牲可重启性。分区还提供了扩展到单个JVM之外的能力,因为从服务器不必是本地的(您可以使用各种通信机制与远程从服务器通信)。

    关于分区的重要说明是,主服务器和从服务器之间的唯一通信是对数据的描述,而不是数据本身。例如,主服务器可以告诉从服务器1处理记录1-100,从服务器2告诉处理记录101-200,依此类推。主服务器不发送实际数据,仅发送从服务器获取其应处理的数据所需的信息。 。因此,数据必须是从属进程本地的,而主控主机可以位于任何地方。

    远程分块
    远程分块允许您扩展进程以及跨JVM的可选写逻辑。在这种使用情况下,主机读取数据,然后通过电线将其发送到从设备,在此从设备进行处理,然后要么本地写入从设备,要么返回到主机以本地写入主机。

    分区和远程组块之间的重要区别在于,远程组块通过有线发送实际数据,而不是通过有线进行描述。因此,远程分块将发送实际记录1-100,而不是用单个数据包说过程记录为1-100。这可能会对步骤的I/O配置文件产生很大的影响,但是如果处理器足够成为瓶颈,这可能会很有用。

    AsyncItemProcessor/AsyncItemWriter
    扩展Spring Batch流程的最后一个选项是AsyncItemProcessor/AsycnItemWriter组合。在这种情况下,AsyncItemProcessor包装了ItemProcessor实现,并在单独的线程中执行了对实现的调用。然后,AsyncItemProcessor返回一个Future,该AsyncItemWriter传递到ItemWriter并在其中解开并传递给委托(delegate)ItemProcessor实现。

    由于数据如何通过此选项流动,因此不支持某些监听器方案(因为直到ItemWriter内我们才知道ItemProcessor调用的结果),但总的来说,它可以提供一个有用的工具,仅对ojit_code进行并行化单个JVM中的逻辑,而不会牺牲可重新启动性。

    09-16 06:56