分布式任务调度中心XXL—JOB
结束了前几节课的SpringCloudAlibaba的基础课程,我们现在开始来真正的去谈谈一些微服务所带来的问题以及一些成熟的解决方案。任务调度相信大家都做过,就是说在特定的时间点执行相应的代码片段,底层原理其实就是相当于一个线程一直再循环的去监听。下面就是一个简单的小Demo,供大家参考一下原理。
public void testJob(int param)
{
new Thread(()->{
while (true)
{
try {
System.out.println("定时任务没过"+param+"秒执行");
Thread.sleep(param);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
通过上述的代码,我们会发现几个非常严重的问题:
1.任务调度本质上实际是一个死循环监听的过程,非常占用服务器资源。所以这必须单独抽取出来,成为任务调度服务,以保证业务逻辑服务的正常执行和充足的内存资源。
2.必须做高可用。如果说我们把任务调度单独抽取出来,那么我们怎么去做集群化的管理,不然仅有的任务调度服务宕机那就废了。怎么保证我们任务调度服务集群的情况下执行幂等性的问题。可能有的同学会想,可以指定一个开关啊,A任务器为true,B任务器为false,这样只有A会执行啊。但是如果A宕机了,那岂不是要修改B的开关为true再重新打包
3.如果说我们现在几千万条数据,怎么让各个调度服务均摊的去执行。
4.任务调度中心宕机了,如何做补偿?
XXL—JOB使用
1.去官网下载xxl-job工程 https://github.com/xuxueli/xxl-job
2.执行xxl-job工程doc目录下的sql文件。
3.修改admin工程下的配置文件并启动访问/xxl-job-admin,可以看到如下界面
4.新建一个Springboot项目,引入xxl-job的依赖jar包
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.1.2</version>
</dependency>
5.复制xxl-job中springbootdemo的两个配置到我们的资源目录下,复制demo下的config类到我们的项目中
6.编写一个service类,加上@xxljob,自定义被调用名称
@XxlJob("testjob")
public ReturnT<String> demoJobHandler(String param) throws Exception {
System.out.println("执行"+param);
return ReturnT.SUCCESS;
}
7.启动我们的项目,自动注册我们的任务调度项目到xxl注册中心
appName为你上面配置的appname
名称可以自定义
排序表示优先执行
8.点击任务管理,新增一个任务
执行器为你上面定义的名称
jobHandler为你代码xxljob里面定义的名称
点击保存并执行可以看到
XXL—JOB原理
1.首先我们的每个执行器需要注册到xxl-job的注册中心。
2.你在xxl-job调度中心新建了一个任务规则,调度中心会根据名称找你的执行器,并根据你配置的jobhandler发起一个远程RPC调用,去调用你的指定接口。
我们了解了xxl-job的原理,接下来我们试着解决上面的一些问题
1.xxl-job的实现原理是统一管理执行器,通过调度中心去调度指定任务,可以保证集群下任务的幂等性问题。
2.xxl-job支持分片模式,即给集群的执行器每个分配一个index值,通过不同的index值可以编写自己的算法,以解决分摊任务数量的问题,而且支持动态拓展
3.xxl-job自带任务检测,失败的会自动补偿
XXL—JOB总结
XXL-JOB是一个轻量级分布式任务调度平台,web界面式的开发容易上手,支持集群下的分摊任务,可以动态的启停任务并且弹性的扩容和缩容。与此同时,它还兼备任务超时控制,任务失败重试等等一系列功能,具体详见官网,这绝对是分布式任务调度的不二之选。