随着项目的渐渐扩展,微服务的使用,每一个独立服务(我喜欢称为产品)和其他服务直接的业务关系或者数据关系的问题慢慢暴露,我们要处理的问题真的是任重而道远。
一直摸索着微服务里面的各个拐拐角角,不光光是技术。从来没有人告诉我们微服务怎么切分,怎么实施。我们有着强大的理论知识,但是还没有达到“知行合一”。
当我们的服务越来越多,服务和服务之间的数据交叉也会紧跟着会变多,虽然我们保证了每一个服务的独立性,但是对于数据的来源,去处的处理还没有做到完美的解决方案。
我们要抛弃之前的一些处理方式,我们已经抛弃了一个DB,将每一个服务独立成一个DB,保证了数据的独立性。但是对于Batch,我们没做任何的处理,一直在考虑,我们的Batch如何做到很好的切分。
什么是Batch?
Batch俗称批处理。
现在任何一个互联网产品,随着长时间的积累,数据的会随着时间的推移会增长到海量。
对于这些海量数据,任何企业应用或者产品都需要在对于关键数据中进行批量处理来操作业务逻辑。通常这种情况下,此类操作不需要人工参与就能够自动高效惊喜复杂数据处理和分析。例如:银行对账和利率调整或者跨系统数据同步,又或者把内部和外部系统中获得的数据进行批处理以后集成到其他系统中取,这类工作被称为“批处理”。
一个项目里面典型的场景:产品系统从产品数据库中获取数据,经过业务处理后,导出价盘系统中需要的数据到文件中,价盘系统读取该文件,经过业务处理后,最好存处到价盘系统的数据库中。通常这种情况下该动作需要每一个价盘周期结束之前执行,最好保证在价盘周期最后一天的24:00-02:00之间进行,此时对系统的性能影响最小。
Batch工作在面对复杂的业务以及海量的数据处理时,无需人工干预,仅需定期读入批量数据,然后完成对应业务处理进行归档操作。
典型的批处理应用有如下几个特点:
1)自动执行,根据系统定制的工作步骤自动完成
2)数据量大,少则百万,多则千万甚至上亿
3)定时执行,例如每天执行,每周执行或者每月执行
从这些特点可以看出,批处理的整个流程可以明显的分为3大阶段
1)读取数据,数据可以来自文件,数据库,或者消息队列等等
2)处理数据,处理读取的数据并且形成输出结果,如银行对账系统的资金对账处理
3)写数据,将输出结果写入文件,数据库或者消息队列。
Batch应该要支撑哪些业务场景?
1)定期提交批处理任务
2)并行批处理,即并行处理任务
3)企业消息驱动处理
4)大规模的并行处理
5)手动或定时重启
6)按照顺序处理依赖任务
7)部分处理,如在回滚时忽略记录
8)完整的批处理事务
我们做到哪些?
我一直不太喜欢从对日那边引用过来那套Batch处理方式,我一直不认为那是一套Batch处理服务,对于我而言,那只是一个简单的后台处理服务。因为那只是一个简单的一个Application,然后监控DB Batch表,然后启动指定Batch,然后一个Service里面处理所有的业务操作。我一直很不喜欢这套,但是我又使用这套,因为我没有信心去考虑更好的,只因为在写Batch架构的时候多看了它一眼,让我无法让我忘却。简单,稳定,成熟,有成功案例,就是这么简单的道理,但是当我们在慢慢的使用的时候发现可扩展性很差,无法监控内存,无法监控当前Batch执行情况,无法并行处理等等问题。
对于Batch应该支持的场景,我们到底支持了哪些?除了定时或者手动重启以及完整的批处理事务,我们没有任何优势,性能更别提了,我们可以测试测试百万条数据的性能。
回归正题----Spring Batch
Spring Batch是一个轻量级的,完善的批处理架构,旨在帮助企业建立健壮,高效的批处理应用,Spring Batch是Spring的一个子项目,使用Java基于Spring架构为基础开发。
Spring Batch提供了大量可以重用的组件,包括日志,追踪,事务,任务作业统计,任务重启,跳过,重复,资源管理,对于大数据量和高性能的批处理任务,Spring Batch同时提供了高级功能和特性支持,比如分区功能,远程功能。总之,通过Spring Batch能够支持简单的,复杂的和大数据的批处理作业。
Spring Batch是一个批处理应用框架,不是一个调度框架,但是需要和调度框架合作来构建完整批处理任务。它只关注批处理任务相关问题,例如事务,并发,监控,执行等,但是不提供相应的调度功能。如果需要使用调用框架(Quartz,Tivoli,Control-M,Cron等)。
为什么选择Spring Batch
1)利用Spring编程模型,使开发者专注于业务处理,让Spring架构管理流程
2)明确分离批处理的执行环境和应用
3)将通用的核心的服务以接口形式提供
4)提供“开箱即用”的简单默认的核心执行接口
5)提供Spring架构中配置,自定义和扩展服务
6)所有默认实现的核心服务能够容易地被扩展与替换,不会影响底层
7)提供一个简单的部署模式,使用Maven进行编译。
黑夜漫眠,无法入眠,本来还想写一个Demo,想想还是下次。为了项目可以很好的使用Spring Batch和Spring Boot进行整合,接下来一段时间会每晚更新成果。