最佳 Spring 批量缩放策略

Best Spring batch scaling strategy

我们有简单的批处理过程,运行良好。最近我们有新的要求来实施新的批处理过程来生成报告。我们有不同的数据来源可供阅读以准备这份报告。具体来说,我们可能对每个报告都有一个视图。

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

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

在我们的案例中,处理 + 写入文件比读取更多的资源激励。

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

或者如果我们发现从数据库读取数据与写入+处理文件是相同的资源激励,那么我们必须improve/scale这个过程的最佳选择是什么。

TLDR;

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

但是,鉴于您的 reader 是一个数据库,我认为配置分区步骤并使其工作将非常有益。设置需要更多的工作,但在长期 运行.

中会更好地扩展

Multi-threaded Step

用于:

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

不要用于:

  • 状态项 readers

多线程步骤利用 chunk-oriented processing employed by Spring Batch. When you multi-thread a step it allows spring batch to execute an entire chunk in it's own thread. Note that this means the entire read-process-write cycle for your chunks of data will occur in parallel. This means there is no guaranteed order for processing your data. Also note that this will not work with stateful ItemReaders (JdbcCursorItemReader and JdbcPagingItemReader 都是有状态的)。

带同步的多线程步骤Reader

用于:

  • 加速单个步骤的处理和写入
  • 当读取有状态时

不要用于:

  • 加速阅读

有一种方法可以解决无法对有状态项 reader 使用多线程步骤的限制。您可以 synchronize 他们的 read() 方法。这本质上会导致读取顺序发生(虽然仍然不能保证顺序)但仍然允许处理和写入并行发生。当读取不是瓶颈而处理或写入是瓶颈时,这可能是一个不错的选择。

Partitioning

用于:

  • 加快单个步骤
  • 当读取有状态时
  • 何时可以对输入数据进行分区

不要用于:

  • 当输入数据无法分区时

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

Remote Chunking

用于:

  • 加速单个步骤的处理和写入
  • 有状态 readers

不要用于:

  • 加速阅读

远程分块非常先进Spring批量使用。它需要某种形式的持久中间件来发送和接收消息(即 JMS 或 AMQP)。对于远程分块,读取仍然是单线程的,但是当读取每个块时,它会被发送到另一个 JVM 进行处理。实际上,这与多线程步骤的工作方式非常相似,但是远程分块可以利用多个 process 而不是多个 thread .这意味着远程分块允许您 水平 扩展您的应用程序,而不是 垂直 扩展它。 (老实说,我认为如果您正在考虑实施远程分块,您应该考虑看看 Hadoop 之类的东西。)

Parallel Step

用于:

  • 加快整体作业执行速度
  • 当存在互不依赖的独立步骤时

不要用于:

  • 加速步骤执行
  • 相关步骤

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