在应用开发中,经常会用到各种各样的定时任务,尤其是在金融科技领域中使用场景更加广泛,例如清分报表、机构对账、商户结算等等。
一般情况下,对于单机定时任务我们可以直接采用Spring的@Scheduled、Quartz、Linux的Crontab等框架处理即可。然而,这些框架关注的是任务本身,而非任务中数据的处理流程。所以任务开发者要根据任务中的数据制定处理流程, 例如:数据量小的时候,就可以采取单机单线程处理,随着业务量增长,数据量的不断增加,可以采取单机多线程进行处理。
由于我们大部分应用都是采用集群部署的时候,为了避免多台服务器同时执行定时任务发生错误,要求集群中一台服务器单独执行,这时候可以考虑使用分布式锁的手段,这样保证了在同一时间点只有一台服务器执行了任务,并且保证了任务的高可用性,当有服务器发生宕机也不会影响到任务的正常执行。
但是,随着业务量不断的增长,单机应用效率问题就会凸显出来,这时候就要采用“分而治之”的思想解决单机性能问题,将大任务拆分成几个子任务多台服务器并行调度,并且要保证各个子任务的高可用性,减少人工干预的成本。
综上所述,针对这些特性我们对开源市场上现有的一些分布式定时任务的中间件进行了筛选,最终选择了Elastic-Job。Elastic-Job是一款具有分布式、并行调度、弹性扩容缩容、集中管理、定制化流程型任务等功能的分布式定时任务中间件,其它还有TBSchedule、Quartz的高可用方案等,感兴趣的同学可以自行研究一下。
Elastic-Job简介
Elastic-Job是什么?
Elastic-Job是一个分布式定时任务框架,Elastic-Job-Lite定位轻量级无中心化的方案,使用jar包的方式提供分布式任务的协调服务。
Elastic-Job有何特点?
任务分片:整体任务拆分成多个任务,弹性伸缩,任务上下线全自动发现。
多任务类型:普通定时任务、数据流任务、脚本任务。
容错性:分片唯一性,支持失效转移和错过任务重新触发。
易用性:完善的运维平台,任务监控,参数调整。
Elastic-Job快速入门
下面是Elastic-Job针对三种不同使用场景的快速入门,其中Springboot Starter版本是我们内部自定义的组件。
Elastic-Job Quick Start之Java原生API
1、引入jar包
2、作业开发
3、作业配置与启动
Elastic-Job Quick Start之spring-xml
1、引入jar包
2、作业开发
3、Spring配置
Elastic-Job Quick Start之springboot
1、Starter引入
2、Yml配置注册中心
3、使用@Elasticjob开发作业
Elastic-Job 架构浅析
Elastic-Job采用无中心化架构,各个作业节点都是平等,部署成本低。
节点角色说明
Elastic-Job: 作业执行器。
Registry : 作业的上下线自动发现注册中心。
Monitor: 作业执行情况收集的监控中心。
Console: 作业管理、查询、统计的控制台中心。
Elastic-Job 架构Overview
Elastic-Job常用配置
下面是针对Elastic-Job中几个常用参数的介绍,更多参数信息请查看官网:http://elasticjob.io/
shardingItemParameters
1、用法说明:分片序列号和参数用等号分隔,多个键值对用逗号分隔,配合shardingTotalCount(分片总数)参数使用,分片序列号从0开始,不可大于或等于作业分片总数,如:0=北京,1=上海,2=深圳,3=杭州,4=成都,5=武汉。
2、弹性扩容机制:框架弹性扩容,Elastic-Job会按照默认的分片策略,即平均分片算法,将各个分片分配到每台服务器上。如果分片不能整除,则不能整除的多余分片将依次追加到序号小的服务器。
3、故障转移:任当集群中有服务器宕机,有集群中其它的服务器接管该服务器上的分片,接管方式是抢占式的。
failover
用法说明:任务执行失效转移属性,缺省值false。开启表示如果作业在一次任务执行中途宕机,允许将该次未完成的任务在另一作业节点上补偿执行。
misfire
用法说明:是否开启错过任务重新执行,缺省值false。
建议:用于处理间隔时间长的作业,或者业务有局限的作业。
elasticJobListener
用法说明:每台作业节点均执行的监听。需要实现ElasticJobListener接口。
distributeOnceElasticJobListener
用法说明:分布式场景中仅单一节点执行的监听。需要继承
AbstractDistributeOnceElasticJobListener
monitorPort
使用说明:作业监控端口,缺省值-1。
建议:配置作业监控端口, 方便开发者dump作业息。
使用方法:
echo“dump” | nc127.0.0.1 9888
eventTraceRdbDataSource
使用说明:作业事件追踪的数据源Bean的名称,跟踪作业的执行轨迹和执行状态,并入库。框架会在该数据源中自动创建两张表。
建议:作业间隔时间长且重要的任务添加此配置。
Elastic-job管理工具
手动触发
正常情况下,定时任务都是有corn表达式定时触发的,但是有时候有些任务周期比较长,我们需要等很长时间。这时,我们可以利用手动触发功能进行功能测试或者任务补偿。
disable
作业维度:作业重启后恢复默认配置
服务器维度:作业重启后恢复默认配置
分片维度:作业重启后不恢复
修改作业
通过管理平台我们可以对任务的参数进行实时调整,立即生效,不需要进行应用重启。
本文简单概述了Elastic-Job的使用方法和基础架构,希望能够给大家带来一些帮助。目前Elastic-Job在随行付内部逐渐得到推广,在实际使用过程中,我们也会定制一些适用于自身业务场景的机制,如果有好的想法和特性也会及时回馈到社区。
写在最后:
关于随行付的开源Porter项目,你有什么问题或看法,欢迎留言告诉我们,大家一起讨论交流!
领取专属 10元无门槛券
私享最新 技术干货