如何为 spring 批次应用反应式

how to apply reactive for spring batch

我想知道如何将 spring 反应应用于 spring 批次。我该怎么做。为什么我们应该对 spring 安全性应用 spring 反应性?为什么我可以申请 spring security 但我不能申请 reactive 到 spring batch

Spring 批处理的反应版本不存在。 Spring 开发人员正在 Github issue 中讨论此实现。

我要标记下面解释所有原因的评论。

Spring Batch and Reactive Streams

首先,Reactive Streams是为数据流(无限)设计的,而SpringBatch是为固定数据集(有限)设计的批处理框架。在我看来,这已经是一个根本性的错配,可能导致这两个工具之间的 non-natural 集成。

现在,即使我们尝试在 Spring 批处理中以某种方式引入“反应式”,我们也需要注意几个设计选择。 Spring Framework FAQ 部分的以下摘录是关键:

For handlers to be fully non-blocking, you need to use reactive libraries throughout the processing chain,
all the way to the persistence layer.

Spring 如果堆栈部分响应,框架甚至建议继续使用阻塞模型:

By all means, keep using Spring MVC if you are developing web apps that don't benefit from a non-blocking
programming model, or that use blocking JPA or JDBC APIs for persistence (typically in combination with
thread-bound transactions).

根据这些陈述,要使 Web 应用程序完全反应,整个堆栈都应该是反应性的,从控制器一直到持久层。这对于批处理应用程序没有什么不同,除了我们这里显然没有控制器,但是 end-to-end 作业执行应该是反应性的。与阻塞作业存储库交互的“反应性 non-blocking 步骤”没有意义。

因此,要真正从这个反应式故事中受益,整个框架应该是反应式的,从批处理工件(reader、处理器、编写器、侦听器等)到基础设施 bean(作业存储库、事务管理器等) ).要实现这一目标,需要付出巨大的努力:

  • 应提供反应式作业存储库实施
  • 所有使用 PlatformTransactionManager 的 API(即 BatchConfigurerTaskletStepBuilderHelper 等)都应更新为使用新引入的 org.springframework.transaction.TransactionManager 接口。这是为了能够根据需要提供 ReactiveTransactionManager 或经典 PlatformTransactionManager
  • readers/writers 的所有实现都应更新为使用 non-blocking API(文件 IO、数据库 IO 等)
  • 以及许多其他变化

此外,当前的 chunk-oriented 处理模型实际上与反应式范式不兼容。原因是ChunkOrientedTasklet等待chunkProcessor(处理器+writer)处理完整个chunk再读取下一个chunk:

Chunk inputs = chunkProvider.provide();
chunkProcessor.process(inputs);

所以这个实现也应该进行调整。所有这些更改都是必需的,甚至没有谈论 Spring Batch 当前的并发模型(与反应范式不兼容)和在作业存储库级别使用的乐观锁定策略..

在我看来,“响应式支持”不是我们可以在 Spring Batch 中引入的功能,它实际上需要完整的 re-write 80% 的框架(如果不是更多的话)。出于所有这些原因,我认为这种集成的 cost/benefit 太高而无法考虑,但我愿意接受其他方面的说服。