ElasticJob幂等机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ElasticJob幂等机制相关的知识,希望对你有一定的参考价值。

参考技术A      ElasticJob的幂等机制,是指作业分片执行的幂等,他需要做到以下两点:

1、如何保证同一个分片在当前作业实例上不会被重复执行?
    分片任务执行一次没有执行完成,第二次又调度执行这种情况,导致分片数据会被重复执行。在ElasticJob中,通过开启misfire机制,任务执行前会在内存中设置任务为running状态,如果开启了monitor机制,同时会在zookeeper中创建/sharding/item/running临时节点,在下次任务调度到来时,会查看是否存在分片正在执行中running临时节点,如果前面有分片任务在执行,这个时候就会设置任务分片错过misfire,创建/sharding/item/misfire节点,待上次作业执行完成的时候,查看是否有错过执行的分片任务,重新补偿执行分片任务。

2、如何保证一个分片不会被下发给多个作业实例执行?
    一个分片在执行的时候,突然宕机退出作业集群了,这个时候会导致重新分片,然后宕机的分片被重新指派给新机器,这个时候就会导致分片数据的重复执行。在ElasticJob中,重新分片的时候,需要等待这个作业实例的所有分片作业执行完成才行。所以正在执行的分片任务不会被重复分配给其他作业实例。但是/sharding/item/running节点是一个临时节点,在机器宕机的时候,这个节点就被删除了,重新分片等待所有分片任务完成的时候,是没法感知到对应的分片数据是否完成,这里是存在幂等问题的,还是需要靠业务自己去控制幂等。

    可以看到ElasticJob的幂等控制其实做的还不是完善,依然会存在任务分片数据会被重复执行,在以下场景仍然会被重复执行:

以上是关于ElasticJob幂等机制的主要内容,如果未能解决你的问题,请参考以下文章

ElasticJob分片机制

SpringBoot定时任务 - 什么是ElasticJob?如何集成ElasticJob实现分布式任务调度?

ElasticJob简单使用

elasticjob学习二:封装elasticjob-spring-boot-starter

ElasticJob简单使用

elasticjob