0%

分布式调度系统选型

为什么需要调度系统

我们可能有这样的需求:

  1. 在某个指定的时间点执行一个任务, 比如凌晨对前一天的数据进行汇总;
  2. 在某个操作后的指定时刻执行某一操作,比如:电商下单后一小时没有支付的订单需要被取消;
  3. 微服务失败后补偿操作;

类似的需求我们都可以通过定时任务去完成。当然对于需求2,我们也可以利用MQ的延时投递功能去实现;但是,与外部系统交互只能用定时任务。

Java领域主要分布式调度系统

  1. xxl-job:是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展 。
  2. Elastic-Job: 当当开源的分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成;Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务;Elastic-Job-Cloud采用自研Mesos Framework的解决方案,额外提供资源治理、应用分发以及进程隔离等功能;
  3. Saturn:是唯品会开源的一个分布式任务调度平台,在当当开源的Elastic Job基础上,取代传统的Linux Cron/Spring Batch Job的方式,做到全域统一配置,统一监控,任务高可用以及分片并发处理;
  4. light-task-scheduler:阿里员工开源的个人项目,主要用于解决分布式任务调度问题,支持实时任务,定时任务和Cron任务。有较好的伸缩性,扩展性,健壮稳定性
  5. Quartz: Java定时任务的标配。利用数据库的锁机制实现集群调度,业务代码需要考虑调度的逻辑,对业务代码有入侵。

可能还有一些其它的系统个人不太了解,或者长期不在维护,它不在我们讨论的范畴。在这些系统中以xxl-job和Elastic-Job影响力最大,所以在调研的过程中以这两个系统为主.

系统架构

  1. xxl-job架构

    xxl-job架构

  2. Elastic-Job-Lite架构

    Elastic-Job-Lite架构

从两个系统的架构上可以看出最大的区别是xxl-job有中心化的调度中心,所有的job由调度中心统一调度。而Elastic-Job-Lite没有统一调度中心,由每个Job各自任务节点通过选举算法选出调度节点,确切的说各个job之间没有统一的调度中心 ;Elastic-Job-Cloud依赖Mesos完成调度,资源隔离等工作。

主要功能特性

xxl-job Elastic-Job
调度中心HA Y Y
执行器HA Y Y
弹性扩容缩容 Y Y
失效转移 Y Y
任务失败重试 Y Y
作业分片一致性 Y Y
资源隔离 Y Y
多语言 Y N
权限管理 N N

从主要功能看上去两者都能提供很好的支持;在多语言支持方面,xxl-job提供通用HTTP任务Handler,业务方只需要提供HTTP链接即可,不限制语言。Elastic-Job目前只能支持Java,其它语言支持需要自行扩展。

社区支持

对于开源项目的选择,社区支持是非常重要的因素;强大的社区意味着,在遇到问题的时候可以得到社区资源的支持,否则只能自己解决了;社区支持我们以github的数据为准:

xxl-job Elastic-Job
Star 7408 4707
Fork 3121 2216
Contributers 17 17
Open Issues 82 115
Close Issues 602 384
Latest Updated 24天前 一年前
已登记使用的公司 163 63

从以上数据可以看出来,xxl-job在社区支持方面有更大优势 。

学习成本

  • xxl-job可以做到开箱即用,配置信息在管理控制台有UI统一配置,更容易上手 ; 包括监控,报警都可以在管理控制台完成。
  • Elastic-Job配置信息在执行器的spring xml文件完成,监控,报警需要自己定制 。

性能

从两者的架构可以发现,在大任务量的情况下,Elastic-Job性能要高于xxl-job 。

结论

如果对于技术实力比较强大的团队,而且对性能要求比较搞的情况下,建议选择Elastic-Job,在该基础上进行定制开发,可以取得更好效果;对于技术实力不足,性能能要求不是很高,而且希望快速开发,快速上线建议选择了xxl-job 。

参考资料

http://www.xuxueli.com/xxl-job
http://elasticjob.io
https://vipshop.github.io/Saturn
https://github.com/ltsopensource/light-task-scheduler