基于JMS 远程分区的 spring batch

基于JMS 远程分区的 spring batch

关于 spring batch 的应用场景

通常做法

在支付系统中避免不了每天的交易结算,我们通常这样做,定时每天读取所有需要处理的交易记录,然后 for 循环处理,数据量小业务逻辑简单这样做没什么问题。如果业务复杂,就不能这么简单处理了,后期代码维护将是一个大问题。当数据量大了读取所有数据再处理也是行不通的,大量数据不可能一次全部读取到内存中,数据量大单台机处理也会很缓慢。

思考解决方案

这里可能会考虑到分批次多进程多线程处理,大致方案是读取所有需要处理数据的key,发送到mq,多台机器消费处理。

spring batch 来解决

spring batch 介绍 可以在官方文档看看,鉴于上面的场景,在 step read 前读取所有 key,然后拆分,拆分数量可以根据部署消费者数量定义,分区之后发送到mq,消费者接收到需要处理的 key 后,本地再拆分多线程处理,大致方案就是这样。

一张图来理解

jms-batch
这里 定义为 M, 定义为 S.
调度系统发送一条起批消息,哪台先抢到消费,哪台就是 M(注意:这种模式即是M也是S,除非明确指定了某一台来起批,不去监听 S 队列)。M 启动 job 执行分区逻辑,通过mq分发 keyS(本身 M 也监听了,所以 M 也是 S), S 收到消息执行业务逻辑(也可本地分片多线程处理),S执行完回复消息,或者 M 到数据库轮训结果。批量结束。

一个简单的demo batch-demo