背景
随着机构码用码量越来越多目前为止有4百万,统计异常接口响应时间会变慢,而且统计异常只统计48小时内,count效率实在太低。
最后考虑使用采集的方式,将异常数据采集到另一张异常表,这样子的话count效率会高些。不仅要采集异常表,还要根据月份汇总归档表也就是分表的概念,这样也能减轻单表的压力。
Spring Batch
目前,Spring Batch是批处理框架为数不多的优秀框架,是一个轻量级、完善的批处理框架。提供了大量可重用的组件,包括了日志、追踪、事务、任务统计、任务重启、跳过、重复、资源管理。
Spring Batch是一个批处理应用框架,不是调度框架,需要调度框架来构建完成批处理任务。项目中使用定时器来调度。
业务场景
- 周期性的提交批处理
- 把一个任务并行处理
- 处理时跳过部分记录
Spring batch 4个主要组件
-
JobLauncher :任务启动器,程序的入口
-
Job:一个具体的任务
-
Step:一个具体的执行步骤,一个Job有多个Step
-
JobRepository:存储数据的仓库,在任务执行的时候,需要它来记录任务状态信息,可以看做是一个数据库的接口
Spring Batch基本层级结构
- 运行的基本单位是一个Job,一个Job就做一件批处理的事情
- 一个Job包含多个Step,Step就是每个Job要执行的单个步骤
- Step会有Tasklet,它是一个任务单元,属于可以重复利用的对象(分表、创建新表)
- Step会有Chunk,需要定一个多大的数据量是一个chunk,chunk里就是不断循环的一个流程(读数据,处理数据,写数据)
结合项目来说明如何使用SpringBatch
-
读取数据库的定时任务表,通过反射,执行相应定时任务
-
进入SringBatch部分
-
JobLauncher.run(XXXJob1,JobParameters) 开始启动任务了
-
XXX1Job任务有3个Step(1.建立表+月份 2.读取原表写入到 表+月份 3.删除原表已归档数据)
-
XXX2Job任务有3个Step(1.获取采集48小时时间 2.读取原表异常数据 写入异常表)
Tasklet 与 chunk 总结
tasklet更适合一个步骤到另一个步骤场景,chunk实现处理分页读,或我们不想再内存中保留大量数据场景,项目中用于创建分表和获取时间放入上下文的操作用tasklet,像比如读取表1000条写入表这种利用chunk