一、背景
通过实例演示xxl-job中的故障转移和失败重试概念。
演示环境:
xxl-job 2.2.0,bean模式,ip不同的两台机器。
二、实例
2.1如果执行器执行到一半断网了,此时调度中心会如何操作?
1.1开启两个执行器实例A和B,在执行器中设置断点
1.2将对应任务的路由策略设置为故障转移(重试次数0,超时0)。
1.3手动执行一次任务
1.4将断点响应的执行器所在机器(假设为A)断网,然后取消断点,执行完成后,等待几秒钟,然后恢复联网。
调度中心会等待执行器给到结果,再将执行结果写入调度日志。
在此过程中,B没有被执行。
如果设置了重试次数,则在A的执行结果为FAIL的情况下会让A继续重试,不会让B执行。
也就是说,这个过程没有故障转移,但是可以存在失败重试。
2.2如果执行器在执行前断网了,此时调度中心会如何操作?
由于执行器与调度中心通讯的周期大约是30s,在调度中心以为执行器B还在时,向B发送执行指令,此时,将B断网。
调度中心会在连接失败后转而向A发送指令。
在此过程中,B的断点不会被触发,因为B没有收到执行指令,恢复联网也没有收到。
这个过程发生了故障转移。
2.3如果执行器在失败重试时断网,此时调度中心会如何操作?
1.设置任务为故障转移,重试次数6
2.在执行器B中固定返回FAIL
3.在重试4次后,将B断网,此时A收到了执行指令。
调度日志如下图所示。
这个过程中先发生了失败重试,然后在断网后发生了故障转移。
三、小结
如官方文档 5.11所述,
1.一次完整的任务流程包括:调度 + 执行 两个阶段
2.故障转移发生在调度阶段
3.失败重试发生在调度和执行阶段
问题 2.1 中,
执行器B执行到断点,调度中心认为调度过程已经成功,不会进行故障转移。
问题 2.2 中,
调度中心认为调度B无法发生,于是仅发送了调度A指令,此时为故障转移。
问题 2.3 中,
执行器B失败后,如果任务中设置了重试次数,则会向B持续发送执行指令,此时为失败重试;
执行器B断网后,调度中心认为调度B无法发生,于是发送A执行指令,此时为故障转移。