前言
整个章节由浅入深了解Spring Batch,让你掌握批处理利器。面对大批量数据毫无惧色。本章只做介绍,后面章节有代码示例。好了,接下来是我们的主角Spring Batch。
1.1 背景介绍
1.1.1 诞生
开源社区一直把大部分注意力集中在web和SOA框架中,基于java的批处理框架确很少,因此一个标准的、可重用的批处理框架对我们来说很重要。先来说一下什么是批处理?在企业应用时,需要定期或者人工触发的读入大批量数据,然后完成相应的业务处理并进行归档。这类工作就成为批处理。
SpringSource和Accenture致力于通过合作来解决这种状况,Accenture在实现批处理架构上有着丰富的产业实践经验,SpringSource则有深厚的技术开发经验,两者成为强大的合作伙伴,创造出高质量的、市场认可的企业级java解决方案。因此诞生了Spring Batch
1.1.2 为什么使用它?
Spring Batch作为Spring的子项目,是一款轻量级的综合批处理框架,通过它可以构建出壮健的企业级批处理应用,因为基于Spring,所以开发者十分容易上手使用。SpringBatch不仅提供了统一的读写接口、丰富的任务处理方式、可重用的功能,还包括了日志,事务管理,任务统计、弹性处理等功能。使开发人员可以更多的关注业务处理过程。
Spring Batch不是一个调度框架,因为已经有非常好的企业级调度框架包括Quartz等,它只注重任务处理相关问题,如执行任务、事务、并发等,而不是提供调度功能。它是为了和调度程序一起完成任务而设计的。比如我们希望定期的执行大批量数据任务,那么可结合Quartz等来实现。
1.1.3 应用场景
大量文件处理是比较常见的企业级应用场景,比如你要做聚合支付,那么必定会有聚合账单,如果每天有百万甚至千万级别的交易数据。那么将如何处理呢?如何进行海量数据的对账成了难题。或者每天需要处理其他业务场景的大数据量的文件,最后将处理好的数据写入数据库中。
其实可以先不用想Spring Batch,如果没有,我们如何开发?这里就需要一个框架需要以下几点:
- 支持对多种数据源进行操作
- 能够定义不同job之间的顺序关系
- 能够定义每个job的输入和输出数据操作
- 对异常输入数据有校验机制和弹性处理
- 支持job重跑等处理机制
这不就是一个批处理框架需要的基础功能吗?
1.2 Spring Batch架构
1.2.1 框架层次
Spring Batch分三层,应用层,核心层和基础架构层。
应用层:开发人员使用Spring Batch编写的所有批处理任务代码
核心层:包含加载和控制批处理作业所需的核心类,Job,Step等类的实现
基础架构层:包含通用的读写器和重试模块
1.2.2 概念模型
下图显示了完整的概念模型,JobLauncher启动Job,Job可以有多个Step组合,每一个Step由开发者自己编写,可一把一个大Step分成多个小Step,完全看开发者意愿。每一个Step对应一个ItemReader、ItemProcessor和ItemWriter。所有的批处理框架都可以抽象成最简单的过程,读取数据,处理数据,写数据。所以Spring Batch提供了3个接口,ItemReader、ItemProcessor和ItemWriter。JobRepository则是记录Job、Step和发起Job的执行信息等。
下图为处理流程,reader读,processor处理校验数据,writer写数据(入参是list,减少io次数)
1.3 处理原则
下面是一些处理原则,可参考
- 尽量使用公用模块
- 尽量简化操作,不要有复杂的业务逻辑。更不要处理一条数据还要调外部接口进行数据加工
- 尽可能少的IO操作
- 同一个批处理文件不要处理2次
- 尽可能压力测试