分布式任务调度
先介绍下:Spring&SpringBoot任务调度工具
相信@Scheduled(cron = “0/5 * * * * ?”)这个注解大家都用过
实现原理:触发器 + 线程池 ==== 任务调度
下面例出几个式子
CRON表达式 含义
“0 0 12 * * ?” 每天中午十二点触发
“0 15 10 ? * *” 每天早上10:15触发
“0 15 10 * * ?” 每天早上10:15触发
“0 15 10 * * ? *” 每天早上10:15触发
“0 15 10 * * ? 2005” 2005年的每天早上10:15触发
“0 * 14 * * ?” 每天从下午2点开始到2点59分每分钟一次触发
“0 0/5 14 * * ?” 每天从下午2点开始到2:55分结束每5分钟一次触发
“0 0/5 14,18 * * ?” 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
“0 0-5 14 * * ?” 每天14:00至14:05每分钟一次触发
“0 10,44 14 ? 3 WED” 三月的每周三的14:10和14:44触发
“0 15 10 ? * MON-FRI” 每个周一、周二、周三、周四、周五的10:15触发
传统定时任务存在的问题
1.业务耦合
如果需要修改定时任务时间,就需要重新部署整个应用,将会导致整个应用停滞一段时间
2.单点风险
所有调度任务都在单台服务器上执行,当任务执行节点出现问题时,整个定时任务全部终止
3.资源分配不均衡
随着业务越来越多,相应的定时任务也会增多,单台服务器执行任务的压力会越来越大
分布式环境里, 任务调度的困难及解决思想
对集群机器中配置的任务,只能运行一个(排它处理)
方法1. 锁:
当集群中所有机器都触发时,只有第一个得到锁,可以运行,后面的机器发现任务已运行,则自动取消运行当集群中所有机器都触发时,只有第一个得到锁,可以运行,后面的机器发现任务已运行,则自动取消运行
实现套路:触发器被布置多份,重复触发 ,再用锁只放一个触发出去
方法2. 选举:
触发器被布置多份 ,选举出一个leader有效,其它暂置为无效–zk选举
高可用任务调度原理
特性
1.某节点处理任务其他节点必须阻塞
2.某个节点失败,另外节点顶替
业界的流行的方案框架:
e-job ----- 直接把任务 分摊出去 ---- 每台机器负责哪些任务,分配好
xxl-job— 调度器(任务触发)是中心化部署(管理台),而执行器与业务系统集成(集群)
这里主要介绍下:xxl调度配置
支持 BEAN模式以及GLUE模式
支持 分片广播 & 动态分片(分片:将一个任务分配给不同的机器做)
官方文档:http://www.xuxueli.com/xxl-job/#/
(1)、调度器(控制台)的部署配置:
可以上github去下载源码:https://github.com/xuxueli/xxl-job
a、运行建库脚本
b、项目中配置mysql
c、打包项目jar包,发布
maven打包后,得到admin.jar,上传到服务器,启动:
nohub java -jar admin.jar > log.xxx 2>&1 &
d、打开控制台,登陆后,可查看项目调度情况
(2)、执行器(自己的代码)的配置部署
a、执行器pom引入:
b、配置控制台地址、执行器名称、通信端口等
c、在控制台添加执行器,必须:AppName == 上一步中的appname配置
d、添加完毕后,可发现控制台中,执行器列表中,显示出online机器地址(ip:port),代理控制台已检测到执行器启动了
e、执行器中编写调度任务
f、控制台中添加任务调度:JobHandle,就是上一步中的@JobHandle标签指定的名字
g、可以点击执行,立即运行此任务,测试正确性。后续各增删改操作完全随你心意