Spring batch是轻量级,全面的批处理框架,旨在开发对企业系统日常运营至关重要的强大批处理应用程序。
Spring Batch负责大量记录,包括日志记录/跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理。 它还提供更高级的技术服务和功能,通过优化和分区技术实现极高容量和高性能的批处理作业。 简单和复杂的大批量批处理作业可以高度可扩展的方式利用框架来处理大量信息。
关于spring batch的细节介绍,请参加Spring batch官网,本文主要是记录一个poc的过程,主要包含单个实例应用和远程分析多实例处理的cases。
模拟demo的用户场景:
定时处理多个系统输出的csv文件,然后跑批处理到数据到DB,简要架构图如下:
单个实例处理(且单个文件)
通过cron job定时调度batch job,整个job由两个step组成的一个flow,step1 - 清理目标数据库表(模拟场景,可能是数据备份,建立新的day表等); step2 - 加载文件,解析数据内容并转化为java对象,经processor处理,后倒入db存储.
sequence diagram:
主要配置文件
SingleProcessConfiguration
1 | package org.akj.batch.configuration; |
ScheduledJobLancherConfiguration
1 | package org.akj.batch.configuration; |
配置文件 in application.yml
1 | batch: |
single process可以对应大部分场景了,并且可以通过设置taskExecutor来支持多线程处理
1 |
|
当数据量或者处理步骤更加复杂的场景时,JVM多线程都难以应对时,spring batch也提供了远程分块和远程分区支持,把task调度到远程instance上进行然后聚合,下面演示一个主从架构的多实例remote partition处理架构
Remote partition主从架构
在single process的基础进行修改,保留处理流程step,并将其修改为master/slave step结构,主要流程为:
- cron task trigger jobLauncher 运行job任务
- 运行master step任务分区并存储在DB,public Map<String, ExecutionContext> partition(int gridSize)
- 通过AMQP协议,将partitioned task(StepExecution)分派到message queue
- Slave node通过监听message queue,接受partioned task,运行slave step并更新运行结果
- 所有step运行完成后,job complete.
架构如下:
Partitioner 分区器
1 | package org.akj.batch.configuration.partitioner; |
AMQP配置
1 | package org.akj.batch.configuration.partitioner; |
demo中用profile进行了区分,可以主从方式,一主多从,暂时不支持mixed模式,主节点无法兼做从节点,理论上可以做到。
spring.profiles.active=master 主节点,可以进行batch任务调度和任务分区和job状态监控
spring.profiles.active-slace 从节点,从message queue中拉去任务并执行,更新任务完成情况到db
源码 - https://github.com/cloud-poc/springbatch-userservice
参考资料:
https://blog.51cto.com/13501268/2177746
https://cloud.tencent.com/developer/article/1096337
https://asardana.com/2018/01/01/scaling-spring-batch-on-aws-with-remote-partitioning/
https://docs.spring.io/spring-integration/docs/5.1.6.RELEASE/reference/html/#amqp
https://www.docs4dev.com/docs/zh/spring-batch/4.1.x/reference/spring-batch-integration.html