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收到了执行指令。

调度日志如下图所示。

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

三、小结

官方文档 5.11所述,

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

问题 2.1 中,

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

问题 2.2 中,

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

问题 2.3 中,

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

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

### XXL-JOB分片广播模式工作原理 在XXL-JOB框架中,分片广播模式允许执行器集群中的每一个节点都接收到调度指令并独立执行任务。这种模式适用于需要多个实例并发处理同一类任务的情况[^1]。 当采用分片广播策略时,每个执行器会根据预先设定好的规则计算出自己负责的数据范围(即分片项),从而实现数据层面的负载均衡。例如,在一个有三个执行器组成的集群里,它们可能会分别被分配到不同的用户ID区间去处理相应的业务逻辑操作[^2]。 ```java // Java伪代码展示如何获取当前执行器所对应的分片参数 int shardIndex = XxlJobHelper.getShardIndex(); // 获取本机分片索引 int shardTotal = XxlJobHelper.getShardTotal(); // 获取总分片数量 ``` ### 故障转移模式工作原理 对于故障转移机制而言,其核心在于提高系统的可用性可靠性。一旦某个执行器发生异常无法正常完成既定的任务,则该次未成功运行的任务将会自动转移到其他健康的执行器上继续尝试执行直至最终成功或者达到最大重试次数为止[^3]。 具体来说,如果A机器正在执行某一项作业但是突然宕机了,那么B/C/D...等其余在线状态良好的服务器就会接管这部分失败后的遗留下来的工作量,并按照预设条件决定是否立即重新触发一次新的调用流程来补偿之前中断的部分[^4]。 ### 配置方法 为了启用这两种特性,可以在`jobhandler`函数内部通过API接口访问的方式取得有关于此次请求的具体信息比如说是哪一个实例应该做什么事情等等;与此同时还需要调整全局配置文件内的相应选项以开启支持多副本以及错误恢复等功能[^5]: #### 开启分片广播功能 编辑application.properties或同等作用的应用程序设置文档加入如下几行命令即可轻松搞定: ```properties xxl.job.executor.sharding.core.threadCount=50 # 设置线程池大小用于支撑高并发场景下的性能需求 xxl.job.trigger.sharding.count.enable=true # 启动动态划分片区的能力使得可以灵活应对不同规模的数据集 ``` #### 实现故障转移保障措施 同样是在上述提到过的属性列表里面增加下面这些条目就可以让系统具备自我修复能力了: ```properties xxl.job.fail.retry.count=3 # 定义最多能够容忍几次连续性的失误之后才会放弃努力不再做额外的动作 xxl.job.fail.retry.interval=1 # 设定相邻两次之间相隔多久再发起下一轮补救行动(单位为分钟) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值