对于扩展性,框架提供的扩展能力包括如下的四种模式 :
Multithreaded Step 多线程执行一个Step;
Parallel Step 通过多线程并行执行多个Step;
Remote Chunking 在远端节点上执行分布式Chunk操作;
Partitioning Step 对数据进行分区,并分开执行;
我们先来看第一种的实现Multithreaded Step:
批处理框架在Job执行时默认使用单个线程完成任务的执行,同时框架提供了线程池的支持(Multithreaded Step模式),可以在Step执行时候进行并行处理,这里的并行是指同一个Step使用线程池进行执行,同一个Step被并行的执行。使用tasklet的属性task-executor可以非常容易的将普通的Step变成多线程Step。
Multithreaded Step的实现示例:
需要注意的是Spring Batch框架提供的大部分的ItemReader、ItemWriter等操作都是线程不安全的。
可以通过扩展的方式显现线程安全的Step。
下面为大家展示一个扩展的实现:
需求:针对数据表的批量处理,实现线程安全的Step,并且支持重启能力,即在执行失败点可以记录批处理的状态。
对于示例中的数据库读取组件JdbcCursorItemReader,在设计数据库表时,在表中增加一个字段Flag,用于标识当前的记录是否已经读取并处理成功,如果处理成功则标识Flag=true,等下次重新读取的时候,对于已经成功读取且处理成功的记录直接跳过处理。
Multithreaded Step(多线程步)提供了多个线程执行一个Step的能力,但这种场景在实际的业务中使用的并不是非常多。
更多的业务场景是Job中不同的Step没有明确的先后顺序,可以在执行期并行的执行。
Parallel Step:提供单个节点横向扩展的能力
使用场景:Step A、Step B两个作业步由不同的线程执行,两者均执行完毕后,Step C才会被执行。
框架提供了并行Step的能力。可以通过Split元素来定义并行的作业流,并制定使用的线程池。
Parallel Step模式的执行效果如下:
每个作业步并行处理不同的记录,示例中三个作业步,处理同一张表中的不同数据。
并行Step提供了在一个节点上横向处理,但随着作业处理量的增加,有可能一台节点无法满足Job的处理,此时我们可以采用远程Step的方式将多个机器节点组合起来完成一个Job的处理。
Remote Chunking:远程Step技术本质上是将对Item读、写的处理逻辑进行分离;通常情况下读的逻辑放在一个节点进行操作,将写操作分发到另外的节点执行。
远程分块是一个把step进行技术分割的工作,不需要对处理数据的结构有明确了解。
任何输入源能够使用单进程读取并在动态分割后作为"块"发送给远程的工作进程。
远程进程实现了监听者模式,反馈请求、处理数据最终将处理结果异步返回。请求和返回之间的传输会被确保在发送者和单个消费者之间。
在Master节点,作业步负责读取数据,并将读取的数据通过远程技术发送到指定的远端节点上,进行处理,处理完毕后Master负责回收Remote端执行的情况。
在Spring Batch框架中通过两个核心的接口来完成远程Step的任务,分别是ChunkProvider与ChunkProcessor。
ChunkProvider:根据给定的ItemReader操作产生批量的Chunk操作;
ChunkProcessor:负责获取ChunkProvider产生的Chunk操作,执行具体的写逻辑;
Spring Batch中对远程Step没有默认的实现,但我们可以借助SI或者AMQP实现来实现远程通讯能力。