当当分布式调度框架elastic-job-lite总结

官方文档 http://elasticjob.io/docs/elastic-job-lite/00-overview/

产品介绍

elastic-job是当当开源的一款非常好用的作业框架,在这之前,我们开发定时任务一般都是使用quartz或者spring-task(ScheduledExecutorService),无论是使用quartz还是spring-task,我们都会至少遇到两个痛点:

  1. 不敢轻易跟着应用服务多节点部署,可能会重复多次执行而引发系统逻辑的错误。
  2. quartz的集群仅仅只是用来HA,节点数量的增加并不能给我们的每次执行效率带来提升,即不能实现水平扩展。

Elastic job是当当网架构师张亮,曹昊和江树建基于Zookepper、Quartz开发并开源的一个Java分布式定时任务,解决了Quartz不支持分布式的弊端。Elastic job主要的功能有支持弹性扩容,通过Zookepper集中管理和监控job,支持失效转移等。项目由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。


当当分布式调度框架elastic-job-lite总结_第1张图片
Elastic-Job-Lite

当当分布式调度框架elastic-job-lite总结_第2张图片
Elastic-Job-Cloud

运行效果演示

拉取官方example项目在本地改造( 修改zookeeper服务器地址和mysql数据库设置)。任务分片数量为3,分别部署在3个不同端口里。通过任务打印出来的参数,来判断任务运行情况。


当当分布式调度框架elastic-job-lite总结_第3张图片
image.png

当把其中一个节点停止掉(模拟宕机),可以发现任务成功转移到另外一个实例里面运行(失效转移功能)。


当当分布式调度框架elastic-job-lite总结_第4张图片
image.png

搭建

要实现任务分片最重要的是数据分片,可以在任务中根据传入的【分片参数shardingContext.getShardingParameter()】动态查询出分片后的数据
(可以根据主键取模: select * from xx where mod(id,5) = 传入参数, 如果主键因为调用函数而导致全表查询的话可以再附加一个索引条件查询。)
 System.out.println(String.format("Item: %s | Para: %s| Time: %s | Thread: %s ",
                shardingContext.getShardingItem(), "SIMPLE_" + shardingContext.getShardingParameter(),
 new SimpleDateFormat("HH:mm:ss").format(new Date()), Thread.currentThread().getId()));

优化

(使用注解调度job)集成elastic-job-spring-boot-starter介绍: https://www.jianshu.com/p/dd3c5b7d7694

一些疑问

elastic-job-spring-console: 2.1.4 不能加载出springboot 发布的任务,不知道是不是bug。
打包elastic-job-spring-console 官方版本时报错:

[WARNING] The POM for io.elasticjob:elastic-job-lite-lifecycle:jar:3.0.0.M1-SNAPSHOT
 is missing, no dependency information available

你可能感兴趣的:(当当分布式调度框架elastic-job-lite总结)