注:图中的水印是我之前微信公众号的截图,我直接贴过来了
摘要:
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 控制搭建 最新版参考官网
作者实力有限,若有问题,请指出,如有雷同,请联系作者,及时删除,写作不易,转载请注明出处,如对您工作有帮助,烦劳高台贵手,请点赞+收藏+关注,未完待续.......