许多企业领域的应用需要在关键任务中进行批量处理来操作业务逻辑。这些业务操作并不需要与人类进行交互就能够自动高效地进行大数据量的复杂处理。例如有基于时间的事件(如月底的统计、通知、邮件等),也有定期对大数据量进行业务逻辑计算(如保险收益计算和利率调整),或者是把从内部和外部系统中获取到的数据进行格式化以及校验后集成到系统记录中去。在这些情况下,批处理操作被用来处理企业每天数十亿的操作。
Spring Batch是一个轻量级的、完善的批处理框架,旨在帮助企业系统日常操作建立健壮的批处理应用。为了在需要时使开发者能够轻松的访问和利用高级的企业服务,人们可以通过Spring框架来了解Spring Batch所构建的高效、基于POJO的开发方式以及容易使用的特性。Spring Batch并非是一个调度框架。在商业软件和开源软件中已经有很多优秀的企业级调度框架(如Quartz, Tivoli, Control-M等),Spring Batch的目标是和调度框架协作,而非取代调度框架。
Spring Batch提供了许多可重用的功能,这些功能对于进行大数据量计算是必不可少的,包括了日志/追踪,事务管理,任务处理统计,任务重启,跳过,资源管理。还提供了更多高级功能和特性使之能够使用优化及分片的技术来处理大数据量和高性能的批处理任务。简单的、复杂的和大数据量的批处理作业都能够通过框架来使用高扩展性的方法处理大量信息。
1.1 背景
在开源项目及其相关社区把大部分注意力集中在基于web和基于soa消息机制的框架中时,基于java的可复用的批处理框架却无人问津,尽管一直都需要这些软件来处理企业的IT环境。
SpringSourc与Accenture合作会改变这种情况。Accenture在批处理架构上有着丰富的工业和技术经验,SpringSource有着深刻的技术经验以及Spring框架提供的编程模型,两者能够结合成为默契且强大的合作关系去创造一个市场需要的高质量软件用于填补企业级java在这方面的空缺。两个公司都开发基于Spring的批处理框架为许多客户解决类似的问题,同时提供了一些有用的额外细节以及真实环境的限制用来确保解决方案能够被客户用于解决真实情景下的问题。基于这些原因,SpringSource和Accenture合作开发Spring Batch。
Accenture已经贡献了之前专用的批处理体系框架,这些框架是基于数十年宝贵的经验在最近几代平台(例如COBOL/Mainframe, C++/Unix以及现在到处都是的java)上所得以实现的。Spring Batch未来将会由提交者的资源来实现支持、强化以及未来蓝图。
Accentrue与SpringSource的合作目标是为软件处理的方案、框架和工具改进标准,并在创建批处理应用时能够持续影响企业用户。公司与政府机构如果希望为他们的企业环境提供标准的、经验证过的解决方案,那么也会受益于Spring Batch。
1.2 使用场景
一个典型的批处理应用通常从数据库、文件或队列中读取大量的数据,之后使用一些方法处理数据,最终用修改过的格式写回数据。通常在一个无需用户交互的离线环境下,SpringBatch能够自动进行基本的批处理迭代,也能够为一个数据集提供事务。批处理任务是一个大多数IT项目的组成部分,而Spring Source是唯一能够提供健壮的、企业级扩展的开源批处理框架。
商业场景:
- 定期提交批处理任务
- 并发进行批处理:并行处理任务
- 阶段性的,企业级消息驱动处理
- 高并发任务处理
- 失败后人工或定时重启
- 按顺序处理依赖的任务(可扩展为工作流驱动的批处理)
- 部分处理:忽略记录(例如在回滚时)
- 完整的批处理事务:以防万一有小数据量的批处理或是存在存储过程或脚本
技术目标:
- 批处理的开发人员使用Spring的编程模式:专注于业务逻辑,让框架解决基础系统
- 清晰的分离基础系统和批处理执行环境、批处理应用之间的定义
- 将通用核心的服务以接口形式提供以便所有项目都能使用
- 提供核心执行接口的默认实现,“开箱即用”
- 在所有层面上使用spring框架,从而能够很容易的配置、自定义和扩展服务。
- 所有现存的核心服务都能够很容易的被扩展与替换,却不会影响基础系统层。
- 提供一个简单的使用Maven编译的部署模型,能够把结构jar包和应用系统完全分离开来
1.3 Spring批处理架构
Spring批处理最早的设计思想是为最终用户设计成可扩展与多样化的。下图展示了为支持最终开发用户的扩展性与易用性而设计的层次结构草图。
这个层次结构突出了三个主要的高级组件:application,core,infrastructure。application包含了开发者使用Spring Batch编写的所有批处理任务与业务代码。Batch Core包含了用于启动与控制批处理任务所必须的核心运行类,例如JobLauncher,Job和Step的实现。Application与Core都是建立在通用结构上。infrastructure包含了通用的读取器与编写器,以及一些服务(如RetryTemplate),这些服务也会被application开发者(ItemReader与ItemWriter)与core框架(retry)所使用。