分布式任务调度平台研究(总)

分布式任务调度平台研究(总)


1. LTS 淘宝个人开源的(推荐)

https://github.com/ltsopensource/light-task-scheduler



LTS(light-task-scheduler)主要用于解决分布式任务调度问题,支持实时任务,定时任务和Cron任务。有较好的伸缩性,扩展性,健壮稳定性而被多家公司使用,同时也希望开源爱好者一起贡献。

项目地址

github地址: https://github.com/ltsopensource/light-task-scheduler

oschina地址: http://git.oschina.net/hugui/light-task-scheduler

例子: https://github.com/ltsopensource/lts-examples

文档地址(正在更新中,后面以这个为准): https://www.gitbook.com/book/qq254963746/lts/details

这两个地址都会同步更新。感兴趣,请加QQ群:109500214 一起探讨、完善。越多人支持,就越有动力去更新,喜欢记得右上角star哈。

1.7.0-SNAPSHOT(master)变更主要点

  1. 增加手动触发任务按钮
  2. 优化PreLoader

框架概况

LTS 有主要有以下四种节点:

  • JobClient:主要负责提交任务, 并接收任务执行反馈结果。
  • JobTracker:负责接收并分配任务,任务调度。
  • TaskTracker:负责执行任务,执行完反馈给JobTracker。
  • LTS-Admin:(管理后台)主要负责节点管理,任务队列管理,监控管理等。

其中JobClient,JobTracker,TaskTracker节点都是无状态的。 可以部署多个并动态的进行删减,来实现负载均衡,实现更大的负载量, 并且框架采用FailStore策略使LTS具有很好的容错能力。

LTS注册中心提供多种实现(Zookeeper,redis等),注册中心进行节点信息暴露,master选举。(Mongo or Mysql)存储任务队列和任务执行日志, netty or mina做底层通信, 并提供多种序列化方式fastjson, hessian2, java等。

LTS支持任务类型:

  • 实时任务:提交了之后立即就要执行的任务。
  • 定时任务:在指定时间点执行的任务,譬如 今天3点执行(单次)。
  • Cron任务:CronExpression,和quartz类似(但是不是使用quartz实现的)譬如 0 0/1 * * * ?

支持动态修改任务参数,任务执行时间等设置,支持后台动态添加任务,支持Cron任务暂停,支持手动停止正在执行的任务(有条件),支持任务的监控统计,支持各个节点的任务执行监控,JVM监控等等.

架构图

LTS architecture

概念说明

节点组

  1. 英文名称 NodeGroup,一个节点组等同于一个小的集群,同一个节点组中的各个节点是对等的,等效的,对外提供相同的服务。
  2. 每个节点组中都有一个master节点,这个master节点是由LTS动态选出来的,当一个master节点挂掉之后,LTS会立马选出另外一个master节点,框架提供API监听接口给用户。

FailStore

  1. 顾名思义,这个主要是用于失败了存储的,主要用于节点容错,当远程数据交互失败之后,存储在本地,等待远程通信恢复的时候,再将数据提交。
  2. FailStore主要用户JobClient的任务提交,TaskTracker的任务反馈,TaskTracker的业务日志传输的场景下。
  3. FailStore目前提供几种实现:leveldb,rocksdb,berkeleydb,mapdb,ltsdb,用于可以自由选择使用哪种,用户也可以采用SPI扩展使用自己的实现。

流程图

下图是一个标准的实时任务执行流程。

LTS progress

LTS-Admin新版界面预览

LTS Admin目前后台带有由ztajy提供的一个简易的认证功能. 用户名密码在auth.cfg中,用户自行修改.

特性

1、Spring支持

LTS可以完全不用Spring框架,但是考虑到很用用户项目中都是用了Spring框架,所以LTS也提供了对Spring的支持,包括Xml和注解,引入lts-spring.jar即可。

2、业务日志记录器

在TaskTracker端提供了业务日志记录器,供应用程序使用,通过这个业务日志器,可以将业务日志提交到JobTracker,这些业务日志可以通过任务ID串联起来,可以在LTS-Admin中实时查看任务的执行进度。

3、SPI扩展支持

SPI扩展可以达到零侵入,只需要实现相应的接口,并实现即可被LTS使用,目前开放出来的扩展接口有

  1. 对任务队列的扩展,用户可以不选择使用mysql或者mongo作为队列存储,也可以自己实现。
  2. 对业务日志记录器的扩展,目前主要支持console,mysql,mongo,用户也可以通过扩展选择往其他地方输送日志。

4、故障转移

当正在执行任务的TaskTracker宕机之后,JobTracker会立马将分配在宕机的TaskTracker的所有任务再分配给其他正常的TaskTracker节点执行。

5、节点监控

可以对JobTracker,TaskTracker节点进行资源监控,任务监控等,可以实时的在LTS-Admin管理后台查看,进而进行合理的资源调配。

6、多样化任务执行结果支持

LTS框架提供四种执行结果支持,EXECUTE_SUCCESS,EXECUTE_FAILED,EXECUTE_LATER,EXECUTE_EXCEPTION,并对每种结果采取相应的处理机制,譬如重试。

  • EXECUTE_SUCCESS: 执行成功,这种情况,直接反馈客户端(如果任务被设置了要反馈给客户端)。
  • EXECUTE_FAILED:执行失败,这种情况,直接反馈给客户端,不进行重试。
  • EXECUTE_LATER:稍后执行(需要重试),这种情况,不反馈客户端,重试策略采用1min,2min,3min的策略,默认最大重试次数为10次,用户可以通过参数设置修改这个重试次数。
  • EXECUTE_EXCEPTION:执行异常, 这中情况也会重试(重试策略,同上)

7、FailStore容错

采用FailStore机制来进行节点容错,Fail And Store,不会因为远程通信的不稳定性而影响当前应用的运行。具体FailStore说明,请参考概念说明中的FailStore说明。


2. XXL-JOB分布式任务调度平台

https://github.com/xuxueli/xxl-job

XXL-JOB是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。

1.2 特性

  • 1、简单:支持通过Web页面对任务进行CRUD操作,操作简单,一分钟上手;
  • 2、动态:支持动态修改任务状态、暂停/恢复任务,以及终止运行中任务,即时生效;
  • 3、调度HA:“调度中心”基于集群Quartz实现,可保证调度中心HA;
  • 4、任务HA:任务"执行器"支持集群部署,可保证任务执行HA;
  • 5、任务Failover:执行器集群部署时,调度失败时将会平滑切换执行器进行Failover;
  • 6、一致性:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;
  • 7、自定义任务参数:支持在线配置调度任务入参,即时生效;
  • 8、调度线程池:调度系统多线程触发调度运行,确保调度精确执行,不被堵塞;
  • 9、执行日志:支持在线查看调度结果,并且查看完整的执行日志;
  • 10、邮件报警:任务失败时支持邮件报警,支持配置多邮件地址群发报警邮件;
  • 11、支持登录验证;
  • 12、GLUE:提供Web IDE,支持在线开发任务逻辑代码,动态发布,实时编译生效,省略部署上线的过程。支持30个版本的历史版本回溯。
  • 13、数据加密:调度中心和执行器之间的通讯进行数据加密,提升调度信息安全性;
  • 14、任务依赖:支持配置子任务依赖,当父任务执行结束且执行成功后将会主动触发一次子任务的执行, 多个子任务用逗号分隔;
  • 15、推送maven中央仓库: 将会把最新稳定版推送到maven中央仓库, 方便用户接入和使用;
  • 16、任务注册: 执行器会周期性自动注册任务, 调度中心将会自动发现注册的任务并触发执行。

1.3 发展

于2015年中,我在github上创建XXL-JOB项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……

于2015-11月,XXL-JOB终于REALEASE了第一个大版本V1.0, 随后我将之发布到OSCHINA,XXL-JOB在OSCHINA上获得了@红薯的热门推荐,同期分别达到了OSCHINA的“热门动弹”排行第一和git.oschina的开源软件月热度排行第一,在此特别感谢红薯,感谢大家的关注和支持。

于2015-12月,我将XXL-JOB发表到我司内部知识库,并且得到内部同事认可。

于2016-01月我司展开XXL-JOB的内部接入和定制工作,在此感谢袁某和尹某两位同事的贡献,同时也感谢内部其他给与关注与支持的同事。

部署项目:如果已经正确进行上述配置,可将项目编译打war包并部署到tomcat中。

访问链接:http://localhost:8080/xxl-job-admin/ ,登陆界面如下图所示

输入图片说明

 

  • 登陆调度中心,点击下图所示“新建任务”按钮,新建示例任务。然后,参考下面截图中任务的参数配置,点击保存。

输入图片说明

输入图片说明

  • 步骤二(GLUE任务开发)
    请点击下图中所示“GLUE入口按钮”,进入“GLUE编辑器开发界面”,见下图。GLUE任务默认已经初始化了示例任务代码,即打印Hello World。 (GLUE实际上是一段继承自IJobHandler的Java类代码,它在执行器项目中运行,可使用@Resource/@Autowire注入执行器里中的其他服务,详细介绍请查看第三章节)

输入图片说明

输入图片说明

  • 步骤三(触发执行)
    点击下图所示“执行”按钮,可手动触发一次任务执行(通常情况下,通过配置Cron表达式进行任务调度出发)。

输入图片说明

  • 步骤四(查看日志)
    点击图2.5F所示“日志”按钮,可前往任务日志界面查看任务日志。 在如图2.5G的任务日志界面中,可查看任务调度状态,执行器接收到调度请求后的执行状态。 同时,点击如图2.5G中的“执行日志”按钮,可以查看本此调度在执行器端的完整执行日志,完整执行日志如图2.5H。

输入图片说明

(图2.5F:“调度中心”管理管理界面,任务日志入口)

输入图片说明

(图2.5G:“调度中心”管理管理界面,任务日志入口)


3.elastic-job 当当开源


当当近期开源了分布式作业调度框架 elastic-job 项目。

elastic-job 是当当内部应用框架 ddframe 中 dd-job 的作业模块中分离出来的分布式弹性作业框架。去掉了 dd-job 中监控和 ddframe 接入规范部分。ddframe 其他模块也有可独立开源的部分,之前当当曾开源过 dd-soa 的基石模块 DubboX。

elastic-job 和 ddframe 关系见下图:查看大图

当当开源elastic-job,分布式作业调度框架

Elastic-job 的主要包括以下功能。

  1. 定时任务:基于成熟的定时任务作业框架 Quartz cron 表达式执行定时任务。
  2. 作业注册中心:基于 Zookeeper 和其客户端 Curator 实现的全局作业注册控制中心。用于注册,控制和协调分布式作业执行。
  3. 作业分片:将一个任务分片成为多个小任务项在多服务器上同时执行。
  4. 弹性扩容缩容:运行中的作业服务器崩溃,或新增加n台作业服务器,作业框架将在下次作业执行前重新分片,不影响当前作业执行。
  5. 支持多种作业执行模式:支持 OneOff(类似 Quartz 原生作业),Perpetual(类似 TbSchedule 作业)和 SequencePerpetual(类似 TbSchedule 和 kafka 的合并,但处理时维持分片顺序)三种作业模式。
  6. 失效转移:运行中的作业服务器崩溃不会导致重新分片,只会在下次作业启动时分片。启用失效转移功能可以在本次作业执行过程中,监测其他作业服务器空闲,抓取未完成的孤儿分片项执行。
  7. 运行时状态收集:监控作业运行时状态,统计最近一段时间处理的数据成功和失败数量,记录作业上次运行开始时间,结束时间和下次运行时间。
  8. 作业停止,恢复和禁用:用于操作作业启停,并可以禁止某作业运行(上线时常用)。
  9. 被错过执行的作业重触发:自动记录错过执行的作业,并在上次作业完成后自动触发。可参考 Quartz 的 misfire。
  10. 多线程快速处理数据:使用多线程处理抓取到的数据,提升吞吐量。
  11. 幂等性:重复作业任务项判定,不重复执行已运行的作业任务项。由于开启幂等性需要监听作业运行状态,对瞬时反复运行的作业对性能有较大影响。
  12. 容错处理:作业服务器与 Zookeeper 服务器通信失败则立即停止作业运行,防止作业注册中心将失效的分片分项配给其他作业服务器,而当前作业服务器仍在执行任务,导致重复执行。
  13. Spring 支持:支持 spring 容器,自定义命名空间,支持占位符。
  14. 运维平台:提供运维界面,可以管理作业和注册中心。

上面列出的功能已在当当内部稳定使用,现在开源,供大家参考和指正。也希望感兴趣的朋友也来为 elastic-job 贡献更多的改进。未来也将会开源更多的 ddframe 子模块。

注:elastic-job 严格遵循 Apache 2.0 许可证的要求。

附:ddframe 简介

ddframe 是针对技术部 Java 体系提供的统一应用开发框架。目的:

  1. 分离技术和业务,封装技术细节,将应用开发人员的精力集中在业务开发上;
  2. 可快速配置启动,降低新项目搭建框架的成本;
  3. 统一框架,将项目分为业务+框架+云平台+治理;
  4. 提供统一的编码,配置,监控,日志的标准和规范;
  5. 组件可插拔,不强制业务开发人员使用框架的全部内容;
  6. 灵活的提供定制化功能,框架不限制引入其他技术组件;
  7. 模板代码自动化生成,降低书写难度;
  8. 提供独立的工具箱和分布式技术组件产品;
  9. 推动 SOA 以及微服务进程。


4.songwie job 作者 从零开始开源的极简版调度任务

统一定时任务调度管理


代码地址:https://github.com/songwie/task

下载地址:http://songwie.com/attached/task/task-web.war


任务管理系统是一个java 实现的,spring 集成quartz的动态任务管理系统, 通过该应用可以动态管理任务的调用,无需重启服务。

      任务既可以通过http 的方式调用统一RES 的方式调用其它项目任务,也可以在task 中管理执行自己任务,部署task 新任务,通过 虚拟机class reload,无需重启。

技术架构:

            spring boot + spring-data-jpa + jquery



截图:




启动方式:

spring boot启动:

java -jar C:\Users\sw\Desktop\task-web.war 


或者运行根目录下的start.sh

具体参数为:

nohup java -Xms500m -Xmx500m -Xmn100m -XX:PermSize=64m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=0 -XX:CMSInitiatingOccupancyFraction=70 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1986 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar task-web.war --spring.profiles.active=test --datasource.druid.url=jdbc:mysql://127.0.0.1:3306/task --datasource.druid.username=root --datasource.druid.password=root &  

以上根据实际情况修改数据库地址、用户名、密码