Elastic-Job分布式定时任务框架实战

1,342 阅读5分钟

注:图中的水印是我之前微信公众号的截图,我直接贴过来了

摘要:

Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架。去掉了和dd-job中的监控和ddframe接入规范部分。该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发。 ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX,已成为Apache顶级项目。

Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架。去掉了和dd-job中的监控和ddframe接入规范部分。该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发。

Elastic-Job主要功能:

参考官网:elasticjob.io/

定时任务: 基于成熟的定时任务作业框架Quartz cron表达式执行定时任务。

作业注册中心: 基于Zookeeper和其客户端Curator实现的全局作业注册控制中心。用于注册,控制和协调分布式作业执行。

作业分片: 将一个任务分片成为多个小任务项在多服务器上同时执行。

弹性扩容缩容: 运行中的作业服务器崩溃,或新增加n台作业服务器,作业框架将在下次作业执行前重新分片,不影响当前作业执行。

支持多种作业执行模式: 支持OneOff,Perpetual和SequencePerpetual三种作业模式 失效转移: 运行中的作业服务器崩溃不会导致重新分片,只会在下次作业启动时分片。启用失效转移功能可以在本次作业执行过程中,监测其他作业服务器空闲,抓取未完成的孤儿分片项执行。

运行时状态收集: 监控作业运行时状态,统计最近一段时间处理的数据成功和失败数量,记录作业上次运行开始时间,结束时间和下次运行时间。

作业停止,恢复和禁用: 用于操作作业启停,并可以禁止某作业运行(上线时常用)。

被错过执行的作业重触发: 自动记录错过执行的作业,并在上次作业完成后自动触发。可参考Quartz的misfire。

多线程快速处理数据: 使用多线程处理抓取到的数据,提升吞吐量。

幂等性: 重复作业任务项判定,不重复执行已运行的作业任务项。由于开启幂等性需要监听作业运行状态,对瞬时反复运行的作业对性能有较大影响。

容错处理: 作业服务器与Zookeeper服务器通信失败则立即停止作业运行,防止作业注册中心将失效的分片分项配给其他作业服务器,而当前作业服务器仍在执行任务,导致重复执行。

Spring支持: 支持spring容器,自定义命名空间,支持占位符。

运维平台: 提供运维界面,可以管理作业和注册中心。

下面进行实战案例:

本案例是SpringBoot+Jpa+Zookeeper+Elastic-job进行讲解。案例代码已经放到本人GitHub上面,地址为:github.com/huran111/el… 可自行下载运行。

项目准备

1.1. 新建三个一样的spring boot项目,在实际生产中 分别部署在三台服务器上。

1.2 安装zookeeper

安装非常简单,可百度, 实际生产可部署三台zookeeper集群做高可用,本项目安装一台作为讲解用。

1.3 引入相关jar包 具体最新jar文件参考官网

1.4 参数配置

1.5 spring-job配置

1.6 数据准备

定义一个实体类User:


模拟100条数据,实际场景可能有百万,千万级别

运行测试用例可以看到数据已经插入成功,其中random字段作为随机数,不是业务字段,只来后序的分片处理。


1.7 验证

启动服务器server-01,指定10秒后执行

​ 可以看到分片数量:0,1,2,3,4,5,6,7,8 分了9片


启动服务器server-02,同样指定10秒后执行。

​ 可以看到分片数量:0,1,2,3,8


而此时server-01的分片数量自动变为:4,5,6,7


下面我们在启动第三台服务器server-03:

​ 可以看到分片数量:6,7,8


而此时server-01和server-02有什么变化呢?

可以看到server-01变成了3,4,5,server-02变成了 0,1,2 程序自动进行了分片操作,当有一台机器挂了或者有新机器加入了会自动分配数量。从而实现分布式调度以及处理大数据量的数据


1.8 企业实战:

还记得刚才模拟的100条数据吧 ,注意还有一个random字段 。正常企业中可能会有几百万或者千万的数据,这里来模拟100条数据怎么分布式处理。

Job类编写如下:实现SimpleJob接口

具体的分片算法需要自己来实现,最简单的是通过每台机器分到的分片数量进行取模。

分别启动三台服务:查看处理数据情况, 为0的随机数没生产好,生产环境尽量用好的随机数算法,尽量生成均匀,防止数据倾斜


​ ------------------------------------- server01 -------------------------------------------------------


​ ------------------------------------- server02 -------------------------------------------------------


​ ------------------------------------- server03 -------------------------------------------------------


可以看到 三台服务分别处理了这100条数据,这就是分布式调度的意思。在大数据处理中,可以结合该框架,将同一个项目部署在多台机器上,同属处理大数据量的数据,再结合多线程技术,大大增加了效率。

如果数据多达千万级,此时对mysql的性能影响会很大,此时建议使用ElasticSearch分布式搜索引擎存储读写频率高的数据。主要定时业务可使用Redis作为分布式锁避免重复执行。


1.9 控制搭建 最新版参考官网

作者实力有限,若有问题,请指出,如有雷同,请联系作者,及时删除,写作不易,转载请注明出处,如对您工作有帮助,烦劳高台贵手,请点赞+收藏+关注,未完待续.......