分布式定时任务

把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式。

常见开源方案

elastic-job , xxl-job ,quartz , saturn,  opencron , antares

elastic-job

当当网基于quartz 二次开发之后的分布式调度解决方案 , 由两个相对独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成 ,是分布式任务调度框架的推荐选择。

Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。

Elastic-Job-Cloud使用Mesos + Docker(TBD)的解决方案,额外提供资源治理、应用分发以及进程隔离等服务

优势

  • 基于quartz 定时任务框架为基础的,因此具备quartz的大部分功能
  • 使用zookeeper做协调,调度中心,更加轻量级
  • 支持任务的分片
  • 支持弹性扩容 , 可以水平扩展 , 当任务再次运行时,会检查当前的服务器数量,重新分片,分片结束之后才会继续执行任务
  • 失效转移,容错处理,当一台调度服务器宕机或者跟zookeeper断开连接之后,会立即停止作业,然后再去寻找其他空闲的调度服务器,来运行剩余的任务
  • 提供运维界面,可以管理作业和注册中心。
  • elastic-job结合了quartz非常优秀的时间调度功能,并且利用ZooKeeper实现了灵活的分片策略。除此之外,还加入了大量实用的监控和管理功能
  • 开源社区活跃、文档齐全、代码优雅。

xxl-job

由个人开源的一个轻量级分布式任务调度框架 ,一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

主要分为调度中心和执行器两部分 ,调度中心在启动初始化的时候,会默认生成执行器的RPC代理。执行器项目启动之后, 调度中心在触发定时器之后通过jobHandle 来调用执行器项目里面的代码,核心功能和elastic-job差不多,同时技术文档比较完善。

quartz

通过在数据库中配置定时器信息, 以数据库悲观锁的方式达到同一个任务始终只有一个节点在运行,

优势

  • 保证节点高可用 (HA), 如果某一个几点挂了, 其他节点可以顶上

劣势

  • 同一个任务只能有一个节点运行,其他节点将不执行任务,性能低,资源浪费。
  • 当碰到大量短任务时,各个节点频繁的竞争数据库锁,节点越多这种情况越严重,性能会很低下。
  • quartz 的分布式仅解决了集群高可用的问题,并没有解决任务分片的问题,不能实现水平扩展。

比较

 

quartz

elastic-job

xxl-job

依赖

mysql

jdk1.7+, zookeeper 3.4.6+ ,maven3.0.4+ ,mesos

mysql ,jdk1.7+ , maven3.0+

HA

多节点部署,通过竞争数据库锁来保证只有一个节点执行任务

通过zookeeper的注册与发现,可以动态的添加服务器。 支持水平扩容

集群部署

任务分片


支持

支持

管理界面


支持

支持

高级功能


弹性扩容,多种作业模式,失效转移,运行状态收集,多线程处理数据,幂等性,容错处理,spring命名空间支持

弹性扩容,分片广播,故障转移,Rolling实时日志,GLUE(支持在线编辑代码,免发布),任务进度监控,任务依赖,数据加密,邮件报警,运行报表,国际化

缺点

没有管理界面,以及不支持任务分片等。不适用于分布式场景

需要引入zookeeper , mesos, 增加系统复杂度, 学习成本较高

调度中心通过获取 DB锁来保证集群中执行任务的唯一性, 如果短任务很多,随着调度中心集群数量增加,那么数据库的锁竞争会比较厉害,性能不好。

使用企业

大众化产品,对分布式调度要求不高的公司大面积使用

36氪,当当网,国美,金柚网,联想,唯品会,亚信,平安,猪八戒

大众点评,运满满,优信二手车,拍拍贷

总结

elastic-job设计的初衷就是面对高并发复杂业务的,其核心功能在于分片和弹性扩容。在服务器数量多,业务量大的时候也能非常好的调度,压榨服务器的性能,使用zookeeper使他具有高可用和一致性的同时有很好的可扩展性。

elastic-job本身没有中心的概念,通过zookeeper的选举机制选举出主服务器,任何一台服务器都可以作为主服务器,即使主服务器挂了也可以重新选举。因此elastic-job的优势在于它具有更好的可扩展性和可用性,但是这也使得他的使用和配置上比起xxl-job更复杂一些。

xxl-job通过一个中心式集群"调度中心”来调度多个执行器执行任务的,调度中心集群可以通过增加机器来实现高可用(HA)实际会造成一定程度上的资源浪费,调度中心通过DB锁保证集群分布式调度的一致性,这样扩展执行器会增大DB的压力,但是如果实际上这里数据库只是负责任务的调度执行。

在没有那么多数量的执行器和任务的情况下是完全没问题的。执行器可以支持分布式部署,这实际上就足以满足大多数场景了。关键是原理简单实现也非常简洁,用起来也很轻便,与springboot也非常好集成。而且他的监控界面直接集成到调度中心里面,可以在监控界面直接新增任务。

在业务量没那么大的时候xxl-job是一个更好的选择。