1:概述
xxl-job是一个分布式任务调度平台,其核心设计目标是开发迅速,学习简单,轻量级,易扩展,现已开放源代码并接入多家公司线上产品线,开箱即用。很多公司也在xxl-job上做了二次开发。
1.1:单体任务调度框架
项目中比如对账单,日结,月结,放单短信,营销类短信,等场景都需要任务调度,单体系统中有许多任务调度的方式:比如多线程方式:在多线程中对时间的控制,间隔的去触发任务。Timer类,SpringBoot:SpringTasks(通过@EnableScheduling+@Scheduled的注解可以自定义定时任务等).
但是,在集群服务下,如果还是使用每台机器按照单体系统的任务调度实现方式实现的话,会出现下面的问题:
①、怎么做到对任务的控制(如何避免任务的重复的执行,单体项目集群部署,会重复执行)。
②、如果某台机器宕机了,会不会任务丢失。
③、如果要增加服务实例,怎么做到弹性扩容。
④、如何做到对任务调度的执行情况统一监控。
⑤、如何做到高可用。
⑥、如何做到动态配置。
⑦、如何实现任务分片执行。
1.2、分布式任务调度框架
分布式任务调度的框架可以选择有:quartz,elastic-job,xxl-job
功能 | quartz |
elastic-job |
xxl-job |
HA(高可用) | 多节点部署,通过数据库锁来保证只有一个节点来执行任务 |
通过zookeeper的注册和发现,可以动态实现添加服务器,支持水平扩展 |
集群部署 |
任务分片 |
不支持 |
支持 |
支持 |
文档完善 |
完善 |
完善 | 完善 |
管理界面 | 没有 |
有 |
有 |
难易程度 | 简单 |
较复杂 |
简单 |
公司 |
OpenSymphony |
当当网 |
个人 |
缺点 |
没有管理界面;不支持分片;不适用于分布式场景 |
需要引入zookeeper;增加系统复杂度;通过获取zk分布式锁的方式 |
通过获取数据库锁的方式,保证集群中执行的任务的唯一性,性能不好。 |
quartz和xxl-job的对比
①、quartz采用api的方式调用任务,quartz不方便,但是xxl-job使用的是管理界面。
②、quartz比xxl-job代码侵入更强。
③、quartz调度逻辑和QuartzJobBean耦合在一个项目中,当任务增多,逻辑复杂的时候,性能会受到影响。
④、quartz底层以抢占式获取db锁并且抢占成功的节点运行,导致节点负载悬殊非常大;xxl-job通过执行器实现协同分配式运行任务,各个节点比较均衡。