为了后续实战时不迷糊,我们先了解一下 Spring Batch 的架构,所谓“磨刀不误砍柴工”。
Spring Batch 的设计考虑到了可扩展性和不同的终端用户群。下图显示了支持终端用户开发者的可扩展性和易用性的分层架构:
这种分层架构突出了三个主要的高层组件:应用程序(Application)、核心(Batch Code)和基础设施(Batch Infrastructure)。其中:
应用程序:包含所有批处理作业(job)和开发人员使用 Spring Batch 编写的自定义代码。
批处理核心:包含启动和控制批处理作业所需的核心运行时类,它包括 JobLauncher、Job 和 Step 的实现。
基础设施:应用程序和核心都是建立在一个通用的基础设施之上。这个基础架构包含了通用的 reader/writer 和服务(如 RetryTemplate),它们既被应用开发者使用(reader/writer,如 ItemReader 和 ItemWriter),也被核心框架本身使用(retry,这是它自己的库)。
在建立一个批处理解决方案时,应考虑以下关键原则、准则和一般考虑:
记住,批处理架构通常会影响到在线架构,反之亦然。在设计时要考虑到这两种架构和环境,尽可能地使用共同的构件。
尽可能地简化,避免在单批处理应用中建立复杂的逻辑结构。
将数据的处理和存储在物理上保持在一起(换句话说,将你的数据保存在你的处理过程中)。
最大限度地减少系统资源的使用,特别是I/O。尽可能多地在内部存储器中进行操作。
审查应用 I/O(分析SQL语句),以确保避免不必要的物理 I/O。特别是,需要寻找以下四个常见的缺陷:
当数据可以被读取一次并被缓存或保存在工作存储器中时,为每个事务读取数据。
为一个事务重读数据,而该数据在同一事务中早先已被读取。
导致不必要的表或索引扫描。
在SQL语句的 WHERE 子句中不指定 key 值。
不要在一个批处理运行中做两次事情。例如,如果你需要为报告目的进行数据汇总,你应该(如果可能的话)在最初处理数据时递增存储的总数,这样你的报告应用程序就不必重新处理相同的数据。
在批处理程序开始时分配足够的内存,以避免在处理过程中耗费时间的重新分配。
在数据完整性方面,总是假设最坏的情况。插入足够的检查和记录验证以保持数据的完整性。
在可能的情况下,为内部验证实施校验。例如,扁平文件(flat file)应该有一个尾部记录,说明文件中的记录总数和关键字段的总和。
尽早在类似生产环境中计划和执行压力测试,并具有真实的数据量。
在大型批处理系统中,备份可能是一个挑战,特别是当系统与在线应用24小时同步运行时。在在线设计中,数据库备份通常被很好地照顾到,但文件备份应该被认为是同样重要的。如果系统依赖于扁平文件,文件备份程序不仅要到位和记录,还要定期测试。
为辅助批处理系统设计与实现,需向设计者和程序员提供以示例结构图、代码框架形式呈现的基础批处理应用构建模块与模式。设计批处理作业时,应将业务逻辑拆解为一系列步骤,可借助以下标准构建模块实现:
转换应用(Conversion Applications): 对于由外部系统提供或为其生成的每一种类型的文件,必须创建一个转换应用程序,将提供的事务记录转换成处理所需的标准格式。这种类型的批处理程序可以部分或全部由转换工具模块组成。
验证应用(Validation Applications):验证应用程序可确保所有输入 / 输出记录正确且一致。验证通常基于文件头和文件尾、校验和与验证算法以及记录级别的交叉检查。
提取应用(Extract Applications):一个提取应用程序从数据库或输入文件中读取一组记录,根据预定义的规则选择记录,并将记录写入输出文件。
提取/更新应用(Extract/Update Applications):提取/更新应用程序从数据库或输入文件中读取记录,并在每个输入记录中发现的数据驱动下,对数据库或输出文件进行修改。
处理/更新应用(Processing and Updating Applications): 一个处理和更新应用程序对来自提取或验证应用程序的输入事务进行处理。处理过程通常涉及读取数据库以获得处理所需的数据,有可能更新数据库并为输出处理创建记录。
输出/格式化应用(Output/Format Applications):一个输出/格式化应用读取一个输入文件,根据标准格式重组该记录中的数据,并产生一个输出文件用于打印或传输到另一个程序或系统。
此外,对于无法使用上述构建模块构建的业务逻辑,应提供一个基本的应用程序框架。
除了主要的构建模块外,每个应用程序还可以使用一个或多个标准实用步骤,例如:
排序(Sort): 一个读取输入文件并产生输出文件的程序,其中的记录已根据记录中的排序键字段重新排序。排序通常由标准的系统实用程序执行。
切割(Split):取单个输入文件,并根据字段值将每条记录写到几个输出文件中的一个的程序。拆分可以是定制的,也可以由参数驱动的标准系统实用程序执行。
合并(Merge):一个从多个输入文件中读取记录的程序,并以输入文件的合并数据产生一个输出文件。合并可以是定制的,或由参数驱动的标准系统实用程序执行。
批处理应用还可以按其输入源进行分类:
数据库驱动的应用程序是由从数据库检索的行或值驱动的。
文件驱动的应用程序是由从文件中检索的记录或值驱动的。
消息驱动的应用程序是由从消息队列中检索的消息驱动的。
任何批处理系统的基础是处理策略。影响策略选择的因素包括:估计的批处理系统容量、与在线系统或其他批处理系统的并发性、可用的批处理窗口。(注意:随着越来越多的企业希望全天候运行,清晰的批处理窗口正在消失)。
典型的批处理选项是(按实施复杂程度递增):
在离线模式下的批处理窗口中正常处理。
并行批处理或在线处理。
同时对许多不同的批处理运行或作业进行并行处理。
分区(在同一时间处理同一作业的许多实例)。
前述选项的组合。
这些选项中的一部分或全部可能被商业调度器所支持。
点击查看这些处理选项更详细地讨论,或者直接查看原文: