官网
https://www.xuxueli.com/xxl-job/
概述与问题
XXL-JOB是一个分布式任务调度平台。
那我们怎样可以设计一个分布式任务呢?
https://www.cnblogs.com/rongdi/p/10548613.html 可参考这个
任务db库单点问题怎样解决?
单个节点执行到一半突然失联了,这个任务怎么办?
- 解决这个问题可以用最终一致系统常见的方法,异常恢复线程。在这种场景下只需要检测一下指定心跳超时时间(比如默认3个心跳周期)下没有更新心跳时间的节点所属的未完成任务,将这些任务状态重新恢复成待执行,并且下次执行时间改成当前就可以了。
- 为了避免每个节点的异常恢复线程对同一个任务做无谓的竞争,每个异常任务只能被任务所属节点ID的下一个正常节点去恢复。
多个节点去抢一个任务怎么避免冲突呢?
- 首先先明确一个任务的几种状态:待执行,执行中,有异常,已完成
- 每个节点起一个线程一直去查很快就要开始执行的待执行任务,然后遍历这些任务,使用乐观锁的方式先更新这个任务的版本号(版本号+1)和状态(变成执行中),如果更新成功就放入节点自己的延时队列中等待执行
- 由于每个节点的线程都是去数据库查待执行的任务,很明显变成执行中的任务下次就不会被其他节点再查询到了,至于对于那些在本节点更新状态之前就查到的待执行任务也会经过乐观锁尝试后更新失败从而跳过这个任务,这样就可以避免一个任务同时被多个节点重复执行
任务到底该不该自己执行我们也可以出一个这种规则,明确哪些任务那些应该是哪些节点可以执行,从而避免无谓的锁竞争。这里可以借鉴负载均衡的那些策略:
- id_hash : 按照任务自增id的对节点个数取余,余数值和当前节点的实时序号匹配,可以匹配就可以拿走执行,否则请自觉忽略掉这个任务
- least_count:最少执行任务的节点优先去取任务
- weight:按照节点权重去取任务
- default: 默认先到先得,没有其它规则