XXL-JOB 中的故障转移和失败重试

一、背景

通过实例演示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收到了执行指令。

调度日志如下图所示。

断网2

这个过程中先发生了失败重试,然后在断网后发生了故障转移。

三、小结

官方文档 5.11所述,

1.一次完整的任务流程包括:调度 + 执行 两个阶段
2.故障转移发生在调度阶段
3.失败重试发生在调度和执行阶段

问题 2.1 中,

执行器B执行到断点,调度中心认为调度过程已经成功,不会进行故障转移。

问题 2.2 中,

调度中心认为调度B无法发生,于是仅发送了调度A指令,此时为故障转移。

问题 2.3 中,

执行器B失败后,如果任务中设置了重试次数,则会向B持续发送执行指令,此时为失败重试;

执行器B断网后,调度中心认为调度B无法发生,于是发送A执行指令,此时为故障转移。