批量系统设计之禅

之前写过关于基于SpringBatch框架来实现批量的文章,有些同学反应希望写写关于批量设计的文章,毕竟笔者以前也在国有大银行写过3年的后台OLAP批量系统,在批量程序方面还是掉过很多坑,同时也学到了很多批量优化方面的经验,本篇文章就是总结了我自己批量的经验和原先行里总结的一些批量设计经验,以前我们批量都是使用大量的存储过程来实现功能,使用存储过程的问题就在于扩展性非常差,对某个数据库的依赖非常高,工作中会遇到各种因为数据库产品导致的bug,对程序员SQL要求非常高,优秀的SQL和烂SQL性能可能会差几十倍,所以目前除了一些传统公司还在使用老式的存储过程来实现批量,大部分互联网公司的批量都已经改为使用一些类似Springbatch的框架,通过这样的框架可以减少很多开发工作,而且对于一般能够写java的同学都可以去写批量了,但是做联机和做批量在设计思想上还是有很大差别,本文就给大家梳理下批量设计思路。文章开头说下批量的设计核心思想就是“减少IO”,这是所有批量系统优化性能的核心思路,做批量的同学请牢记这一条!!!

1. 批量系统使用场景

  • 定期提交批处理任务
  • 并发批处理:并行执行任务
  • 分阶段,企业消息驱动处理
  • 高并发批处理任务
  • 失败后手动或定时重启
  • 按顺序处理任务依赖(使用工作流驱动的批处理插件)
  • 局部处理:跳过记录(例如在回滚时)
  • 完整的批处理事务:因为可能有小数据量的批处理或存在存储过程/脚本

2. 批量设计原则

  • 批处理架构通常会影响在线服务的架构,反之亦然。设计架构和环境时请尽可能将联机数据资源和批量数据资源分开。
  • 尽可能的简化,避免在单个批处理应用中构建复杂的逻辑结构。
  • 尽可能在数据存放的地方处理这些数据,反之亦然(即各自负责处理自己的数据)。
  • 尽可能少的使用系统资源,尤其是I/O。尽可能多地在内存中执行大部分操作。
  • 审查应用程序I/O(分析SQL语句)以避免不必要的物理I/O。特别是以下四个常见的缺陷需要避免:
    • 在每个事务中都将(所有并不需要的)数据读取,并缓存起来;
    • 多次读取/查询同一事务中已经读取过的数据;
    • 引起不必要的表或索引扫描;
    • 在SQL语句的WHERE子句中不指定过滤条件。
  • 在同一个批处理不要做两次一样的事。例如,如果你需要报表的数据汇总,请在处理每一条记录时使用增量来存储,尽可能不要再去遍历一次同样的数据。
  • 在批处理程序开始时就分配足够的内存,以避免运行过程中再执行耗时的内存分配。
  • 总是将数据完整性假定为最坏情况。插入适当的检查和数据校验以保持数据完整性(integrity)。
  • 如有可能,请为内部校验实现checksum。例如,平面文件应该有一条结尾记录,说明文件中的总记录数和关键字段的集合。
  • 尽可能早地在模拟生产环境下使用真实的数据量,进行计划和执行压力测试。
  • 在大型批处理系统中,备份会是一个很大的挑战,特别是 7x24小时不间断的在线服务系统。数据库备份通常在设计时就考虑好了,但是文件备份也应该提升到同养的重要程度。如果系统依赖于文本文件,文件备份程序不仅要正确设置和形成文档,还要定期进行测试。

3. 批量设计策略

为了辅助批处理系统的设计和实现、应该通过结构示意图和代码实例的形式为设计师和程序员提供基础的批处理程序构建模块和以及处理模式. 在设计批处理Job时,应该将业务逻辑分解成一系列的步骤,使每个步骤都可以利用以下的标准构建模块来实现:

  • 转换程序(Conversion Applications): 由外部系统提供或需要写入到外部系统的各种类型的文件,我们都需要为其创建一个
  • 转换程序, 用来将所提供的事务记录转换成符合要求的标准格式.这种类型的批处理程序可以部分或全部由转换工具模块
  • 验证程序(Validation Applications): 验证程序确保所有输入/输出记录都是正确和一致的.验证通常基于文件头和结尾信息,
  • 校验和(checksums)以及记录级别的交叉验证算法.
  • 提取程序(Extract Applications): 这种程序从数据库或输入文件读取一堆记录,根据预定义的规则选取记录,并将选取的记录
  • 写入到输出文件.
  • 提取/更新程序(Extract/Update Applications): 这种程序从数据库或输入文件读取记录,并将输入的每条记录都更新到数据库或记录到输出文件.
  • 处理和更新程序(Processing and Updating Applications): 这种程序对从 提取或验证程序 传过来的输入事务记录进行处理.这些处理通常包括 从数据库读取数据,有可能更新数据库,并创建输出记录.
  • 输出/格式化程序(Output/Format Applications): 这种程序从输入文件中读取信息,将数据重组成为标准格式,并打印到输出文件,或者传输给另一个程序或系统.

因为业务逻辑不能用上面介绍的这些标准模块来完成, 所以还需要另外提供一个基本的程序外壳.

除了这些主要的模块,每个应用还可以使用一到多个标准的实用程序环节(standard utility steps),如:

  • Sort 排序,排序程序从输入文件读取记录,并根据记录中的某个key字段重新排序,然后生成输出文件. 排序通常由标准的系统实用程序来执行.
  • Split 拆分,拆分程序从单个输入文件中读取记录,根据某个字段的值,将记录写入到不同的输出文件中. 拆分可以自定义或者由参数驱动的(parameter-driven)系统实用程序来执行.
  • Merge 合并,合并程序从多个输入文件读取记录,并将组合后的数据写入到单个输出文件中. 合并可以自定义或者由参数驱动的(parameter-driven)系统实用程序来执行.

批处理程序也可以根据输入来源分类:

  • 数据库驱动(Database-driven)的应用程序, 由从数据库中获取的行或值驱动.
  • 文件驱动(File-driven)的应用程序,是由从文件中获取的值或记录驱动的.
  • 消息驱动(Message-driven)的应用程序由从消息队列中检索到的消息驱动.

所有批处理系统的基础都是处理策略.影响策略选择的因素包括: 预估的批处理系统容量, 在线并发或与另一个批处理系统的并发量, 可用的批处理时间窗口(随着越来越多的企业想要全天候(7x24小时)运转,所以基本上没有明确的批处理窗口).

典型的批处理选项包括:

  • 在一个批处理窗口中执行常规离线批处理
  • 并发批处理/在线处理
  • 同一时刻有许多不同的批处理在并行执行
  • 分区(即同一时刻,有多个实例在处理同一个job)
  • 上面这些的组合

上面列表中的顺序代表了批处理实现复杂性的排序,在同一个批处理窗口的处理最简单,而分区实现最复杂,分区实现虽然并发性能高能够充分利用IO资源,但是缺点是对数据结构设计和批量设计要求很高,弄不好就会出很多多线程或资源死锁问题导致批量加工数据错误或中断,所以如果数据量不是非常巨大就不要用分区批量实现方案了,当你数据量足够大了,并且自己已经能力提高并能够充分理解批量精髓后,自然就会灵活使用批量分区实现方案了.

总结

本文主要是从各个角度讲诉了下批量设计的思路,真的只是思路,估计很多同学看完了很多条tips都不知道在说啥或者不知道如何实践,如果具体展开讲这些tips要写太多字了,本人比较懒不想写了,如果感兴趣的人比较多后续可能会对于大家感兴趣的一些tips展开讲讲后面的故事。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容