xxl-job、snail-job选型对比个人总结
- 前述
- xxl-job与snail-job对比
- 其他补充
- 重试服务模块
- xxl-job调度中心
- snail-job调度中心
- 扩展-任务调度算法
- 结语
前述
为啥需要集成其他第三方定时任务框架,选择spring自带的不好吗?
- 解决spring自身调度任务不可灵活在线调整定时执行规则(启动、停用、cron修改等)
- 业务服务多副本集群部署还得手动加锁,以防止同时重复调度执行
- 调度情况不直观,执行状态、结果、日志信息等信息无法直观体现。
因此,选择集成其他第三方调度框架。
集成第三方定时任务框架xxl-job or snail-job,调度服务单独部署,业务服务模块直接引入依赖、整合定时任务逻辑作为执行器即可
xxl-job与snail-job对比
进行主要的核心差异来进行选型对比(详细的对比,见snail-job官方文档):
- xxl-job 调度中心虽可集群,但只可任一节点加锁后进行集中式调度任务,其他节点空闲且无法操作,可能造成单个调度节点压力、负载过大;无流程编排;无重试服务模块
- snail-job 调度中心集群通过分桶各自调度所属桶的任务给执行器执行,节点变化,中心节点桶分配可再平衡;有流程编排;另有重试服务模块
其他补充
这里主要从代码层面简单说明下调度中心节点集群下调度分配任务的不同,以及补充下snail-job的重试服务模块说明。
重试服务模块
重试模块主要是针对接口调用失败后的重试配置,非定时任务执行的重试配置。
单纯就是定时任务的话,重试模块可能不需要,按需集成即可。
xxl-job调度中心
即使集群部署多节点调度中心,任一时刻只能由一个节点加锁并集中去检查、需要调度的全部任务
snail-job调度中心
调度中心集群可以通过各自拥有的分桶buckets,获取各自分桶下的任务来进行调度给执行器来执行。
如果调度中心集群中节点增加或减少,再平衡各调度节点的分桶buckets即可。
其中,定时任务添加的时候,桶索引下标会根据哈希算法生成。
附调度中心再平衡代码:
// 详见类方法ServerNodeBalance.doBalance()
// 和接口ServerLoadBalance.allocate()的实现类
附任务生成桶索引下标代码:
job.setBucketIndex(HashUtil.bkdrHash(jobRequestVO.getGroupName() + jobRequestVO.getJobName())
% systemProperties.getBucketTotal());
扩展-任务调度算法
时间轮算法,多级分层时间轮算法…
调度中心任务调度的核心
结语
没有哪个最好,只有合适,按需选择即可。