官方文档:https://www.xuxueli.com/xxl-job/
今天想要跟大家分享一下对xxl-job的浅显理解,他是一个在分布式环境下,解决多机定时任务如何调度执行的分布式任务调度平台 xxl-job,它有着简单易用,开包即食等特点。在此之前先说一下,在开发中使用定时任务可能会遇到的问题和一些简单的解决方案。
在日常开发中,经常会用定时任务执行某些不紧急又非常重要的事情,例如批量结算,计算当日的订单量,当日的成本收入等,如果是单机,那毫无问题,往往我们是多机器部署,那么一个定时任务只应该被一台机器所执行,这个时候我们可以采用分布式锁控制某一个任务执行,特点是所有任务都会执行,某一个机器真正执行,其他机器也会同时一起执行,用某种方式将其终止掉,可以采用表的形式,这种方式比较不保险,执行的机器由于某种原因,没有回写DB表中记录,就会造成任务无法再次执行,所以请慎用;还有用redis或者zookeeper实现分布式锁来控制,多机定时任务的执行,这种也是比较常用的。但是不管是那种分布式锁的方式都会存在这任务提醒、失败重试等问题,更为甚着当存在大量定时任务的时候,任务的管理也会成为一个比较头痛的问题,今天跟大家分享一下xxl-job,就是一个比较成熟的分布式任务调度平台。
xxl-job有着诸多的特点,精简了以下几条:
(1)支持通过Web页面对任务进行CRUD操作,可动态启动/停止任务,操作非常简单
(2)任务分布式执行,任务”执行器”支持集群部署,支持弹性扩容缩容;
(3)丰富的路由策略,包括:第一个、最后一个、轮询、随机、故障转移、忙碌转移等;
(4)完善的调度过期策略、任务超时控制、任务失败重试、任务失败告警等
(5)支持动态分配,分片广播任务以执行器为维度进行分片;并且分片广播任务:执行器集群部署时,任务路由策略选择”分片广播”情况下,一次任务调度将会广播触发集群中所有执行器执行一次任务
(6)有着完善的故障转移、任务进度监控、邮件报警等保护机制,
(7)有着运行报表,和Rolling实时日志方便对正规任务进行实时的数据监控
设计思想:
将调度行为抽象形成“调度中心”公共平台,而平台自身并不承担业务逻辑,“调度中心”负责发起调度请求。将任务抽象成分散的JobHandler,交由“执行器”统一管理,“执行器”负责接收调度请求并执行对应的JobHandler中业务逻辑。因此,“调度”和“任务”两部分可以相互解耦,提高系统整体稳定性和扩展性;
架构图:
系统组成:
调度模块(调度中心):负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统与任务解耦,提高了系统可用性和稳定性,同时调度系统性能不再受限于任务模块;支持可视化、简单且动态的管理调度信息,包括任务新建,更新,删除,GLUE开发和任务报警等,所有上述操作都会实时生效,同时支持监控调度结果以及执行日志,支持执行器Failover。
执行模块(执行器):负责接收调度请求并执行任务逻辑。任务模块专注于任务的执行等操作,开发和维护更加简单和高效;
接收“调度中心”的执行请求、终止请求和日志请求等。
注册中心模块:
XXL-RPC的注册中心,是可选组件,支持服务注册并动态发现,可选择不启用,直接指定服务提供方机器地址通讯,选择启用时,内置可选方案:“XXL-RPC-ADMIN 轻量级服务注册中心”(推荐)、“ZK注册中心”、“Local注册中心”等
执行器模块:
执行器方面是基于数据库的集群方案,数据库选用Mysql;集群分布式并发环境中进行定时任务调度时,会在各个节点会上报任务,存到数据库中,执行时会从数据库中取出触发器来执行,如果触发器的名称和执行时间相同,则只有一个节点去执行此任务。
服务通讯模块:
XXL-RPC提供多中通讯方案:支持 TCP 和 HTTP 两种通讯方式进行服务调用;其中 TCP 提供可选方案 NETTY ,HTTP 提供可选方案 NETTY_HTTP (新版本移除了Mina和Jetty通讯方案,主推Netty;如果有需要可以参考旧版本)。
高可用:
调度中心高可用,调度中心支持多节点部署,基于数据库行锁保证同时只有一个调度中心节点触发任务调度。
任务调度高可用,调度中心基于路由策略路由选择一个执行器节点执行任务,XXL-JOB提供了诸多“忙碌转移策略”和“故障转移策略”的路由策略保证任务调度高可用。
分区容错:
服务提供方集群注册时,某个服务节点不可用时将会自动摘除,同时消费方将会移除失效节点将流量分发到其余节点,提高系统容错能力。
一致性:
“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行;
工作原理:
执行流程:
a、执行器根据配置的调度中心的地址,自动注册到调度中心
b、达到任务触发条件,调度中心下发任务
c、执行器基于线程池执行任务,并把执行结果放入内存队列中、把执行日志写入日志文件中
d、执行器的回调线程消费内存队列中的执行结果,主动上报给调度中心
e、当用户在调度中心查看任务日志,调度中心请求任务执行器,任务执行器读取任务日志文件并返回日志详情
个人总结:
xxl-job是一个易上手, 支持多种通讯协议多种注册中心,可自由灵活配置,完善的日志系统,清晰简洁的可视化页面,多执行策略,支持分片和分片广播,完整的补偿机制,重试重发熔断等。组件也存在一定的不租,一定的入侵性,对数据库高度依赖,需要java环境等。总体来说xxl-job依然是一个非常不错的“分布式任务调度平台”。
横向对比:
特性quartzelastic-job-litexxl-jobLTS
依赖MySQL、jdkjdk、zookeepermysql、jdkjdk、zookeeper、maven
高可用多节点部署,通过竞争数据库锁来保证只有一个节点执行任务通过zookeeper的注册与发现,可以动态的添加服务器基于竞争数据库锁保证只有一个节点执行任务,支持水平扩容。可以手动增加定时任务,启动和暂停任务,有监控集群部署,可以动态的添加服务器。可以手动增加定时任务,启动和暂停任务。有监控
任务分片×√√√
管理界面×√√√
难易程度简单简单简单略复杂
高级功能-弹性扩容,多种作业模式,失效转移,运行状态收集,多线程处理数据,幂等性,容错处理,spring命名空间支持弹性扩容,分片广播,故障转移,Rolling实时日志,GLUE(支持在线编辑代码,免发布),任务进度监控,任务依赖,数据加密,邮件报警,运行报表,国际化支持spring,spring boot,业务日志记录器,SPI扩展支持,故障转移,节点监控,多样化任务执行结果支持,FailStore容错,动态扩容。