Spring Batch 简介
在企业级应用领域中,许多应用程序需要进行批量处理,以在关键任务环境中执行业务操作。这些业务操作包括:
-
自动化、复杂地处理大量信息,这些信息无需用户交互即可最高效地处理。此类操作通常包括基于时间的事件(例如月末计算、通知或信函)。
-
定期应用复杂的业务规则,在非常大的数据集上重复处理(例如,保险福利确定或费率调整)。
-
整合来自内部和外部系统的信息,这些信息通常需要以事务性方式进行格式化、验证和处理,然后录入记录系统。批处理每天为企业处理数十亿笔交易。
Spring Batch 是一个轻量级、全面的批处理框架,旨在开发健壮的批处理应用程序,这些应用程序对企业系统的日常运营至关重要。Spring Batch 建立在人们所期待的 Spring 框架特性之上(高效性、基于 POJO 的开发方法以及普遍易用性),同时让开发者在必要时能够轻松访问和使用更高级的企业服务。Spring Batch 不是一个调度框架。在商业和开源领域都有许多优秀的企业级调度器(例如 Quartz、Tivoli、Control-M 等)。Spring Batch 旨在与调度器协同工作,而不是取代调度器。
Spring Batch 提供了处理大量记录时必不可少且可复用的功能,包括日志记录与追踪、事务管理、作业处理统计、作业重启、跳过机制以及资源管理。它还提供更高级的技术服务和特性,通过优化与分区技术实现极高吞吐量和高性能的批处理作业。无论是简单场景(如将文件读取到数据库或运行存储过程)还是复杂的高吞吐量场景(如在数据库间迁移海量数据并进行转换等),均可使用 Spring Batch。高吞吐量批处理作业能以高度可扩展的方式利用该框架处理海量信息。
背景
尽管在企业IT环境中持续存在处理批处理的需求,但开源软件项目及相关社区在关注基于Web和微服务的架构框架的同时,却明显缺乏对可重用架构框架的关注,以满足基于Java的批处理需求。缺乏标准、可重用的批处理架构,导致客户企业IT部门内部开发了许多一次性、内部解决方案的激增。
SpringSource(现为VMware)与埃森哲携手改变了这一现状。埃森哲在批处理架构实施方面拥有深厚的行业实践经验与技术积累,SpringSource具备扎实的技术底蕴,而Spring久经考验的编程模型——这三者的结合形成了天然且强大的合作伙伴关系,共同打造出高质量、贴合市场需求的企业级软件,旨在填补企业级Java领域的重要空白。两家公司曾与众多客户合作,这些客户当时正通过开发基于Spring的批处理架构解决方案应对类似挑战。这些实践反馈提供了宝贵的补充细节和现实约束条件,从而确保该解决方案能够切实解决客户提出的实际问题。
埃森哲(Accenture)向 Spring Batch 项目贡献了其先前专有的批处理架构框架,并提供了提交者资源以推动支持、增强和现有功能集的开发。埃森哲的贡献基于数十年来在不同平台构建批处理架构的经验,包括大型机上的 COBOL、Unix 上的 C++,以及如今随处可用的 Java。
埃森哲与SpringSource之间的合作旨在推动软件处理方式、框架和工具的标准化,使企业用户在创建批处理应用程序时能够一致地使用。那些希望为其企业IT环境提供标准化、经过验证的解决方案的公司和政府机构,都能从Spring Batch中获益。
使用场景
一个典型的批处理程序通常:
- 从数据库、文件或队列中读取大量记录。
- 以某种方式处理数据。
- 以修改后的形式写回数据。
Spring Batch 自动化了这种基础的批处理迭代,提供了将类似事务作为集合处理的能力,通常在离线环境中进行,无需任何用户交互。批处理作业是大多数 IT 项目的一部分,而 Spring Batch 是唯一提供健壮、企业级解决方案的开源框架。
业务场景
Spring Batch 支持以下业务场景:
-
定期提交批处理过程。
-
并发批处理:并行处理作业。
-
分阶段、企业级消息驱动的处理。
-
大规模并行批处理。
-
失败后手动或计划重启。
-
依赖步骤的顺序处理(可扩展为工作流驱动的批处理)。
-
部分处理:跳过记录(例如,在回滚时)。
-
整批事务处理,适用于批处理规模较小或已有存储过程或脚本的情况。
技术目标
Spring Batch 具有以下技术目标:
-
让批处理开发者能够使用 Spring 编程模型:专注于业务逻辑,让框架处理基础设施。
-
在基础设施、批处理执行环境和批处理应用程序之间提供清晰的关注点分离。
-
提供通用的核心执行服务作为接口,所有项目都可以实现。
-
提供核心执行接口的简单默认实现,可以“开箱即用”。
-
通过在各个层使用 Spring 框架,使服务易于配置、定制和扩展。
-
所有现有的核心服务应该易于替换或扩展,且不影响基础设施层。
-
提供一个简单的部署模型,架构 JAR 包与应用程序完全分离,使用 Maven 构建。