上一篇对Java层面提供的以及和Spring提供的任务调度方式有了一定的了解,也分析出了它们的弊端,不过学习它们还是很有必要的,因为任务调度机制的思想和这些类差不多,只不过一个功能强大的任务调度工具会额外添加很多功能,使其更加灵活,更加全面,更加可控,比如Timer类会使用TaskQueue来存储任务,TimerThread获取到的TimerTask总是最先执行的任务,是因为TimerQueue是一个最小堆,它会将最先执行的任务放在堆顶,然后按照时间顺序进行排序,而在xxl-job中,会有一个守护线程去扫描数据库,获取可执行的任务,然后根据此任务的一些配置去解析出此任务的调度方式。
xxl-job是一个简单,开源的轻量级分布式任务调度系统,提供web界面进行任务的CRUD,并能对任务的触发策略,负载均衡策略,重试策略,等等进行动态配置,xxl-job支持调度中心和触发器分布式部署,提高了系统的高可用性,xxl-job的特性比较多,就不一一列举,有兴趣的可以去官网看看。
在学习它之前,我们需要了解它的几个概念。
顾名思义,就是执行任务的东西,执行器就是我们写的代码,需要执行的任务,一般我们会将执行器独立为一个服务,多个执行器就是多个服务,将业务代码和执行器分离开来,通过rpc接口进行通信,这样做方便进行统一的管理。
调度中心就是负责对任务进行管理,调度,监控任务状态等等,调度中心并不负责具体业务的实现,调度中心就是xxl-job的内核。
对于使用xxl-job,我们只需要了解执行器和调度中心即可,下面我们从xxl-job的可视化界面去逐步说明各个选项的作用。
如下是执行器列表,可见我们有两个执行器,其中一个执行器liu-job有两个实例,OnLine机器地址为2,在xxl-job中,执行器叫做AppName,这就相当于我们微服务中的服务名称,我们可以在执行器项目的properties文件中指明,此处注册执行器,其实和我们使用Nacos,Zookeeper,Eureka作为注册中心是一样的,只是xxl-job使用MySQL作为注册中心。
如下是任务列表,它通过执行器来隔离,每个执行器下面的任务和其他执行器下的任务是隔离的。
如下是新增任务,我们挑选一些选项来说明。
调度类型分为两种,一种是基于CRON表达式
,一种是固定速度
,CRON表达式能够更加灵活的配置任务的执行时间,比如可以指定每天晚上的10点,11点,11点半执行任务,而固定速度则是以时间间隔为单位,然后反复地执行。
运行模式分为两种,一种是BEAN
,一种是GLUE
。
BEAN模式
BEAN就是需要我们在执行器中写代码,以JobHandler的形式存在,所以BEAN模式我们会使用@XxlJob
注解标注在任务上,xxl-job依赖于Spring管理这些Bean。
GLUE模式
而GLUE模式不需要我们在执行器里面写代码,也就是说我们不需要在执行器里面编码实现任务,但是不代表不用写代码,依然需要写代码,这样做的好处是不需要更新代码,就能实现任务的动态添加,比如我们需要临时加一个任务去更新去更新数据,但是服务现在正在运行,不能停掉,那么我们就可以在本地调试好代码,然后再Web IDE上输入代码,需要继承IJobHandler
,那么任务就能在不更新代码的情况下执行,其原理是使用groovy
来对代码进行解析,然后调用。
路由策略属于高级模式,只有我们的执行器是多实例部署时,才会使用到此配置,实际上就是负载均衡策略,只是叫法不一样,xxl-job的路由策略有很多种。
第一个:无论有多少机器,固定选择第一个机器
最后一个:固定选择最后一个机器
轮询:每个机器都能得到公平的执行,所得到的份额都一样
随机:随机选择在线的一个机器
一致性HASH:每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上。
最不经常使用:使用频率最低的机器优先被选举
最近最久未使用:最久未使用的机器优先被选举
故障转移:按照顺序依次进行心跳检测,第一个心跳检测成功的机器选定为目标执行器并发起调度,如果此机器故障,那么就会切换到正常的机器上。
忙碌转移:按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度
分片广播:广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数,可根据分片参数开发分片任务
还有其他的选项,如子任务,子任务会在主任务执行成功后执行,任务超时时间,任务在指定的时间内没完成,那么就会中断任务,失败重试次数,如果任务执行失败,那么会根据其失败重试次数对任务进行重新执行,其他选项就不一一说了。
xxl-job会对任务次数,执行日志进行统计,我们能够直观地进行查看。
今天只对xxl-job的使用和一些配置选项进行说明,只有清楚其框架的组成部分,使用起来才能够得心应手,如果连基本的组件都不清楚,就想去看源码,那么就是“为了看源码而去看源码”,看源码的目的是理解设计者的匠心,思想,如果连调度中心是干什么的都不清楚,执行器是什么角色都不清楚,那么度源码的意义何在。
xxl-job使用起来还是很简单的,其设计也是大道至简,只依赖MySQL,并没有依赖其他中间件,所以称得上是轻量级的分布式任务调度框架。
今天的分享就到这里,感谢你的观看,我们下期见!