19.任务调度之xxl-job原理
课程目标
1、掌握xxl-job的部署、开发方法
2、掌握xxl-job的特性和架构设计
3、掌握xxl-job的运行原理
内容定位
适合已经掌握Quartz的同学学习。
Quartz这节课是大家必须去看的,因为E-job的底层就是Quartz, xxljob 最开始也是用Quartz实现的。
1.xxl-job基本介绍
1.1.Quartz体系结构
Quartz中最重要的三个对象: Job、Trigger、 Scheduler。
xxl-job的调度原理:调度线程在一个while循环中不断地获取一定数量的即将触发的Trigger,拿到绑定的Job,包装成工作线程执行。
当然,不管在任何调度系统中,底层都是线程模型。如果要自己写一个调度系统,一定要对多线程并发这一块有比较深入的学习,比如线程怎么启动怎么wait怎么notify怎么加锁等等。
1.2. Quartz 的不足
前面的课程我们讲过,Quartz 有差不多20年的历史,调度模型已经非常成熟了,而且很容易集成到Spring中去,用来执行业务任务是一个很好的选择。
但是还是会有一-些问题,比如:
- 1、调度逻辑(Scheduler) 和任务类耦合在同一个项目中,随着调度任务数量逐渐增多,同时调度任务逻辑逐渐加重,调度系统的整体性能会受到很大的影响;
- 2、Quartz 集群的节点之间负载结果是随机的,谁抢到了数据库锁就由谁去执行任务,这就有可能出现旱的旱死,涝的涝死的情况,发挥不了机器的性能。
- 3、Quartz 本身没有提供动态调度和管理界面的功能,需要自己根据API进行开发。
- 4、Quartz 的日志记录、数据统计、监控不是特别完善。
xxl-job和Elastic-Job都是对Quartz进行了封装,让我们用起来更简单,功能更强大。在是否需要重新造轮子这一-件事情上面,大家的看法是一致的。
1.3. xxl-job发展历史
源码地址: https://github.com/xuxueli/xxIljob
中文文档: https://www.xuxueli.com/xxl-job/
2015年开源,一个大众点评的程序员的业余之作。众所周知,大众点评因为被美团收购了,现在是美团点评。
xxI是作者名字许雪里的首字母简写,除了xxl-job之外,作者还开源了很多其他组件,现在一共有11个开源项目,组成了xxl家族。
到目前为止登记使用xxl-job的公司有几百家,算上那些没有登记的公司,实际上应该有几千家不止。
在xxl-job早期的版本中,直接使用了Quartz的调度模型,直到2019年7月7日发布的7.27版本才移除Quartz依赖。.
实际上即使重构代码移除了Quartz的依赖,xxIjob 中也到处是Quartz的影子。比如任务、调度器、触发器的三个维度设计,是非常经典的。
xxl-job弱化了触发器的概念,统一用 cron触发,获取任务的流程给Quartz是类似的。
最新发布版本是: 2.2.0。
1.4 xxl-job特性
跟老牌Quartz相比,xxl-job拥有更丰富的功能
总体上可以分成三类:
1、性能的提升:可以调度更多的任务。
2、可靠性的提升:任务超时、失败、故障转移的处理。
3、运维更加便捷:提供操作界面、有用户权限、详细的日志、提供通知配置、自动生成报表等等。
2. xxl-job快速上手
2.1 下载源码
2.1.1 release页面下载
- https://github.com/xuxueli/xxl-job/releases
- https://gitee.com/xuxueli0323/xxl-job
注意不要直接clone最新的master代码(2.2.1-SNAPSHOT),master是正在开发的,从发布界面下载稳定版本(2.2.0)。
2.1.2 在IDEA中打开
- /doc :文档资料,包括”调度数据库”建表脚本
- /xxl-job-core :公共Jar依赖
- /xxl-job-admin :调度中心,项目源码,Spring Boot工程,可以直接启动
- /xxl-job-executor-samples :执行器,Sample 示例项目,其中的Spring Boot工程,可以直接启动。可以在该项目上进行开发,也可以将现有项目改造生成执行器项目。
2.2 始化数据库
数据库脚本在doc/db目录下:
生成8张表(本地创建xxl-job数据库)
表初始化好以后,就可以配置代码工程了。
这里我们先说一下总体概念。
admin和executor的项目可以单独复制出来(两个Spring Boot工程),修改一下pom文件。实际上开发、运行的时候肯定也是独立的工程。
这个执行器也不一定是单独运行的,可能会集成在业务项目里面(多启动一个端口),所以还有一个名字叫业务实例。
xxl-job的调度器和业务执行是独立的。调度器决定任务的调度,并且通过HTTP的方式调用执行器接口执行任务。
所以在这里我们需要先配置至少一个调度中心,运行起来,也可以集群部署。
然后再配置至少一个执行器,运行起来,同样可以集群部署。
启动顺序是先启动调度器,再启动执行器。