这是一个关于在运行时更改线程池大小如何影响弹簧批处理运行时系统的复合问题。
首先,我想澄清一下:并发=运行步骤的数量和并行度=每步骤的#线程。
为了清楚地了解我如何使用 Spring Batch 进行处理。目前我正在生成大量文件(200+),我正在使用 Spring Batch 传输每个步骤映射到 1 个文件的文件。关于工作的一切都是动态的,就像步骤的数量一样,每个步骤的读取器和写入器都与该步骤不同。所以没有步骤共享读者或作者。有一个线程池专门用于并发运行这些步骤,然后每个步骤都有自己的线程池,因此我们可以在每个步骤中进行并行处理。当与提交间隔结合使用时,这提供了巨大的吞吐量和控制。
所以我的问题是:
因此,让我们考虑一个示例,说明我为什么要这样做以及更改“运行步骤”和“提交间隔”的确切含义。
考虑一下您总共有 300 个步骤要处理的情况,步骤线程池大小为 5。我开始处理并意识到我有更多资源可以利用,我想将线程数更改为 8。当我实际执行此操作时在运行时,我的经验是线程池确实增加了,但运行步骤的数量没有改变。这是为什么?
按照类似的逻辑说我有更多的内存可以利用,然后我想在运行时增加我的提交间隔。我在 StepExecution 类中没有发现任何可以让我出人意料地更改提交间隔的东西。为什么不?
有趣的是,对于并行性,我可以通过简单地增加线程池的大小来改变运行线程的数量。通过简单地更改并行线程的数量,我注意到吞吐量大幅增加。
如果您想了解更多信息,我可以提供代码并链接到存储库。
非常感谢。
虽然可以使提交间隔和线程池大小可配置并在启动时更改它们,但一旦作业执行开始,就无法在运行时(即“运行中”)更改它们。
使提交间隔和线程池大小可配置(通过应用程序/系统属性或将它们作为作业参数传递)将允许您根据经验调整这些值以最好地利用您的资源,而无需重新编译/重新打包您的应用程序。
您正在寻找的运行时动态默认情况下不可用,但您始终可以实现该Step
接口并将其用作 Spring Batch 作业的一部分,旁边是框架提供的开箱即用的其他步骤类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句