1 Spring Batch介绍

企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务。这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行。这些典型作业包括:基于时间的事件处理(例如:月底结算,通知或信函);重复的、数据量大的、业务逻辑规则错综复杂的定期任务(例如:保险盈利决策和利率调整);来自内外部不同应用系统的信息集成任务,这些信息需要进行格式化、校验,并通过事务的方式处理成为系统可用的记录。批处理程序就是用来处理这种数以亿计的企业日常事务。

Spring Batch是一个轻量级的,全面的批处理框架,旨在帮助开发人员构建出健壮的用于处理日常事务的企业级批处理系统。Spring Batch 构建于POJO和Spring框架,开发者容易上手,现有的优秀企业级服务也能融合进来。Spring Batch不是一个调度框架。当前开发市场上有许多优秀的企业级调度器,包括付费软件和开源软件,例如Quartz, Tivoli, Control-M等。Spring Batch的设计意图不是来替换它们,而是配合这些调度器协同工作。

Spring Batch提供处理大数据的可复用的核心功能,包括日志/跟踪,事务管理,Job程序统计,job重启,job跳转和资源管理,它同时也提供先进的技术服务和特性,即通过优化和分区技术使得批处理作业达到高容量和高性能。无论简单的,复杂的还是高容量的批处理任务都可以利用该框架的可扩展性来处理大量的信息。

1.1 背景

当开源软件项目和相关的社区重点关注网络和基于SOA消息的体系框架时,java领域仍然缺少一个可复用的批处理框架,企业应用仍在当前的IT环境中处理这样的批处理事务。标准化、可复用的批处理架构的缺失导致IT企业各自开发了一次性的、并只针对本企业内部系统的解决方案,无法复用。

SpringSource和Accenture 计划合作改变这一状况,Accenture在人工处理批处理事务和技术经验提供批处理框架指导,SpringSource具备技术优势和Spring的编程模型优势,双方取长补短组合成自然而强大的伙伴关系,在Java企业级应用中构建高质量的、市场相关度极高的软件以填补这一领域的空白。当前已经有2家公司正在与一些客户解决类似的问题,开发基于Spring的批处理架构方案,这也给我们提供了一些额外的客户使用细节和现实约束,帮助验证该方案应用于客户真实环境中的可用性。正是基于此,SpringSource和Accenture联手合作开发此项目。

Accenture已经贡献了以前专有的批处理体系结构框架,基于过去几代人几十年构建批处理架构的经验,(例如,COBOL/Mainframe大型机, C++/Unix系统, 现在Java/任何环境 )用于Spring Batch 项目的建设,并提供资源支持、提高该项目质量和规划未来的路线图。

Accenture和SpringSource共同努力,致力于推动软件处理方法、架构、框架以及工具的标准化,以便于企业用户在业务批处理应用保持一致性,企业用户和政府可基于Spring Batch构建标准的、已论证过的可用解决方案。

1.2 使用场景

一个典型的批处理程序通常从数据库、文件或队列中读取大量的数据记录,以某种方式处理这些数据,然后把修改后的数据写回。Spring Batch 自动进行循环这些基础批处理,像处理集合一样来处理相似的事务,并在不需要用户干预的离线环境中进行。Batch jobs是大多数IT 项目的组成部分,Spring Batch是目前唯一的健壮的、企业级的开源解决方案。

 业务场景

•  Commit batch process periodically

定期提交批处理程序

•  Concurrent batch processing: parallel processing of a job

并行批处理:作业的并行处理

•  Staged, enterprise message-driven processing

分段式的消息驱动的企业信息处理

•  Massively parallel batch processing

海量的并行处理

•  Manual or scheduled restart after failure

发生故障后的手动或调度重启

•  Sequential processing of dependent steps (with extensions to workflow-driven batches)

有先后依赖关系的串行分步处理(扩展到工作流驱动的批处理)

•  Partial processing: skip records (e.g. on rollback)

部分处理:跳过记录(如回滚)

•  Whole-batch transaction: for cases with a small batch size or existing stored procedures/scripts

整批处理:如批量的小程序或现有的存储过程/脚本

技术目标

•  Batch  developers  use  the  Spring  programming  model:  concentrate  on  business  logic;  let  the framework take care of infrastructure.

Batch开发者使用Spring编程模型:专注于业务处理,让框架管理底层基础架构。

•  Clear separation of concerns between the infrastructure, the batch execution environment, and the batch application.

明确关注点分离:底层基础架构,批处理的执行环境和应用。

•  Provide common, core execution services as interfaces that all projects can implement.

提供公共的、核心的执行服务程序和可供第三方实现的接口

•  Provide simple and default implementations of the core execution interfaces that can be used ‘out of the box’.

提供和框架解耦的、缺省的、核心接口执行程序

•  Easy to configure, customize, and extend services, by leveraging the spring framework in all layers.

通过使用spring framework实现易配置,定制化,易扩展的服务

•  All existing core services should be easy to replace or extend, without any impact to the infrastructure layer.

所有已有的核心服务须易替换,易扩展,并且不需要引入底层架构层

•  Provide a simple deployment model, with the architecture JARs completely separate from the application, built using Maven.

提供简单的部署模型,使用从应用中完全分离的JARs,使用Maven进行构建

1.3 Spring Batch架构

Sring Batch的设计理念兼顾可扩展性和用户群体的多样化。如下图所示,Spring Batch具有支持可扩展并且易用的多层体系结构,供开发者使用。

分层的体系架构突出了3个组要的层级组件: 应用层,核心层和基础层。应用层包括所有的batch jobs和用户自定义的Spring Batch. 核心层包括关键的启动和控制batch job的运行时类,该层包括JobLauncher, Job, 和 Step的实现。应用层和核心层构建在基础层之上。基础层包括公共的Readers和Writers,以及服务类,如RetryTemplate, 这些类被应用层的开发者(ItemReader and ItemWriter)和核心层框架使用。

1.4 批处理的一般性原则和指南

下面是构建批处理解决方案的一些关键原则、指南和通用性注意事项。

•  批处理系统的架构通常会影响线上的系统架构,线上的系统架构也会影响批处理系统的架构。在设计这2个系统的架构和环境时,尽可能使用公共构建模块。

• 尽量简单,避免在单个批处理系统中采用过于复杂的逻辑架构。

•  尽量在离数据存储的位置近的地方处理数据,反之亦然。(在你处理数据的位置保存数据)

• 最小化正在使用的系统资源,尤其是I/O。在内部内存中处理尽量多的操作。

•  检视应用的I/O(分析SQL语句),避免使用不需要的物理I/O。

尤其是下面4个公共缺陷需要注意:

•  每一个事务处理都读取一次数据,这些数据实际上可读取一次后并保存在缓冲区或工作区内存中;

•  在同一个事务操作中重复的读取数据;

•  造成不必要的表或索引查询;

•  在SQL语句中未指定键值.

•  不要在一个批处理执行中进行2次完全相同的操作。如,如果你需要进行数据汇总并做报表,只需要做增量处理,而不需要重复执行已经处理过的数据;

•  在批处理应用开始的时候分配足够的内存,以免内存不够重新分配;

•  做数据完整性的最坏打算。插入足够多的检查和记录验证以保持数据的完整性。

•  增加内部的求和校验。如,flat文件在结尾有一个所有记录的总和以及所有关键字段的总数。

•  尽量早的计划和执行压力测试,在尽量接近真实环境数量级的预生产环境中进行。

•  在大型批处理系统中备份是一件很棘手的事情,尤其系统是持续的7*24小时不间断运行。数据库备份还好说,因为数据库系统已经设计了线上备份,文件不仅要备份在合适的位置,同时需要进行备份记录和常规测试。

1.6 批处理策略