分布式调度引擎 elastic-job3 源码分析 (三) - 作业执行

本文深入分析了 elastic-job3 中的作业执行逻辑,包括分片执行、重叠执行检查和错过重调度。elastic-job 的作业执行基于 quartz 调度器,采用 ListJob 作为桥接,通过 ElasticJobExecutor 执行分片任务。文章还探讨了错过重调度的处理机制,以及如何避免作业重叠执行。
摘要由CSDN通过智能技术生成

分布式调度引擎 elastic-job3 源码分析 (一) 概述

分布式调度引擎 elastic-job3 源码分析 (二) 作业模型和注册

分布式调度引擎elastic-job3源码分析(四)-核心服务 I

分布式调度引擎elastic-job3源码分析(五)-核心服务 II(vip)

分布式调度引擎elastic-job3源码分析(六)-失效转移(vip​​​​​​)

elastic-job 作业执行是分片执行,支持错过重调度,重叠执行转错过重调度,作业运行节点下线的失效转移,服务节点/运行实例变更的重分片

作业执行逻辑

作业触发两个来源,quartz 调度触发和失效转移触发,分片分为失效转移和常规调度两部分

*作业和分片应该按两种来源分支,逻辑比较清晰

作业执行类图

ListJob/JobItemExecutor/ElasticJob elastic-job 可以看作分布式 quartz,分片作业由 quartz 调度器调起

ListJob 实现了 quartz 的 job 接口作为 quartz 与 elastic-job 作业的桥接,用 quartz 的参数机制注入 ElasticJobExecutor

这样静悄悄地桥接到 elastic-job 的领地

ElasticJobExecutor elastic-job 作业执行代码

分 5 步:

作业分片重叠执行检查执行作业分片执行错过(missfired)分片失效转移

其中,作业分片参看分片服务, 失效转移参看失效转移

a.重叠执行检查

quartz 可使用 @DisallowConcurrentExecution 配置不允许作业重叠执行,即当前作业未执行完,下一个作业不触发,elastic-job 的 quartz 作业实现 LiteJob 并没有该注解,但 elastic-job 设置执行线程池为 1,org.quartz.jobStore.misfireThreshold = 1(毫秒),实际不重叠执行,因此, elastic-job 是自己管理重叠执行逻辑,是否重叠执行依据是作业分片执行前检查是否有分片执行(running),如果有就设置 missfired,通过重调错过执行补偿执行

写入 missfired,后面通过错过重调度处理

*依赖 monitorExecution 配置,missfired 是调度的业务功能,怎么会依赖是否监控

*不支持 2 次及以上的错过重调度

*建议:增加一个/leader/overlap 设置是否需要重叠执行

b. 常规执行作业

JobFacade.registerJobBegin 作业分片执行前,写入 zk 分片项 running 状态,znode /{itemNum}/running

JobFacade.registerJobCompleted 作业执行结束,删除 zk 分片项 znode running,删除失效转移 znode

updateFailoverComplete 移除失效转移分片,这里要跳到分片的处理逻辑回顾一下

失效转移是触发(trigger)执行,处理失效转移分片, 名字 update,实际上操作是移除/failover 和/failovering

接着分析分片执行代码

作业执行是分片执行,每个运行实例(instance)可能分到多个分片,需要线程池并行执行作业分片,线程池实现 Reloadable 接口,支持 spi 载入和热配置

分片执行代码,使用 JobItemExecutor,elasic-job 不同的执行器逻辑,如 script,dataflow,http

c. 错过重调度

错过作业重调度(missfired),elastic-job 来说,missfired 来源于常规执行和失效转移分片执行并行中发生

elastic-job 使用 quartz 机制,TriggerListener 的 triggerMisfired 处理触发错失,设置 znode /misfired 节点,使用 elastic-job 的错过重调度机制补偿执行

正常作业执行后,重执行错过的作业,与正常执行逻辑一致

Misfired 分片与当前分片的交集

看一下分片逻辑

两个场景,失效转移触发的作业,常规触发的作业

*分片应加上错过重调度的考虑,目前分片只考虑正常分片和 failover

Ø 依赖核心服务:

- 分片服务 作业分配,获取分片信息

- 调度服务

- 失效转移

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中间件XL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值