xxl-job一致性
xxl-job一致性
xxl-job调度中心为了高可用是分布式部署,即中心化,那么如何保证调度的一致性,不会出现多台机器 同时触发某一个任务同时执行
请尊重作者劳动成果,转载请标明原文链接:
https://www.cnblogs.com/wanghongsen/p/12504490.html
一 如何保证xxl-job一致性
什么是一致性问题:“调度中心”通过DB锁保证集群分布式调度的一致性, 一次任务调度只会触发一次执行
为了避免多个服务器同时调度任务, 通过mysql悲观锁实现分布式锁(for update语句)
二 具体过程:
(可以参看JobScheduleHelper类代码,关键代码截图如下)
如上图所示
1 setAutoCommit(false)关闭隐式自动提交事务,
2 启动事务select lock for update(显式排他锁)
3 读db任务信息 -> 拉任务到内存时间轮 -> 更新db任务信息
4 commit提交事务,同时会释放for update的排他锁(悲观锁)
当任务处理完毕后,释放 悲观锁,准备等待下一次循环。