Elastic-Job任务错过机制(misfire)与幂等机制(monitorExecution)

简介: Elastic-Job任务错过机制(misfire)与幂等机制(monitorExecution)

Elastic-Job的分片任务在调度执行中,由于某种原因未执行完毕,下一次调度任务触发后,如果在同一个Job实例中出现两个线程处理同一个分片上的数据,这样就会造成两个线程处理到相同的数据。


为了避免上述问题,Elastic-Job引入任务错过机制(misfire)与幂等机制(monitorExecution),来确保同一条数据不会被多个Job同时处理,避免同一条数据被同一个Job实例的多个线程处理。


重申一次Elastci-Job的分布式是数据的分布式,一个任务在多个Job实例上运行,每个Job实例处理该Job的部分数据(数据分片)。


1、Elastic-Job如何确保同一个Job实例的多个线程不会处理相同的数据。


场景:任务调度周期为每5s执行一次,正常每次调度任务处理需要耗时2s,如果在某一段时间由于数据库压力变大,导致原本只需要2s就能处理完成的任务,现在需要16s才能完成。


在这个数据处理的过程中,每5s又会触发一次调度(任务处理),如果不加以控制的话,在同一个实例上根据分片条件去查询数据库,查询到的数据有可能相同(部分相同),这样同一条任务数据将被多次运行。


如果这个任务是处理转账业务,如果在业务方法不实现幂等,则会引发非常严重的问题,那ElasticJob是否可以避免这个问题呢?


答案是肯定。elastic-Job提供了一个配置参数:monitorExecution=true,开启幂等性。

幂等机制开启后的工作流程:


(1)Elastic-Job在开启monitorExecution(true)【幂等机制】机制的情况下,在分片任务开始时会在注册中心zookeeper上创建

${namespace}/jobname/sharding/{item}/running临时节点,在任务结束后会删除该目录。


(2)在判断是否有分片正在运行时,只需判断是否存在上述节点即可。如果存在,调用setMisfire方法,将分片状态设置为mirefire,表示错失了一次任务执行。如果该分片被设置为mirefire并开启了事件跟踪,将事件跟踪保存在数据库中。


(3)设置misfire的方法会为分配给该实例下的所有分片创建持久节点${namespace}/jobname/shading/{item}/misfire节点。


(4)注意,只要分配给该实例的任何一分片未执行完毕,则在该实例下的所有分片都增加misfire节点,然后忽略本次任务触发执行,等待任务结束后再执行其他未忽略的任务。


(5)在任务执行完成后检查是否存在${namespace}/jobname/sharding/{item}/misfire节点,如果存在,则首先清除misfie相关的文件,然后执行任务。


Elastic-Job的misfire实现方案总结:

在下一个调度周期到达之后,只要发现这个分片的任何一个分片正在执行,则为该实例分片的所有分片都设置为misfire,等任务执行完毕后,再统一执行下一次任务调度。

技术原理其实很简单,就是通过zookeeper来实现分布式锁来完成幂等性。


2、Elastic-Job如何确保数据不会被多个Job实例处理?


Elastic-Job基于数据分片,不同分片根据分片参数(人为配置),从数据库中查询各自数据(任务数据分片),如果当节点宕机,数据会重新分片,如果任务未执行完成,然后执行分片,数据是否会被不同的任务同时处理呢?


答案是不会,因为当节点宕机(作业执行节点)后,是否需要重新分片事件监听器会监听到Job实例代表的节点删除,设置重新分片。在任务被调度执行具体处理逻辑之前,需要重新分片,重新分片的前提就是要所有的分片任务全部执行完毕,这也依赖是否开启幂等控制(monitorExecution)。


如果开启幂等机制,Elastic-Job能感知正在执行处理逻辑的分片,重新分片需要等待当前所有分片任务全部运行完毕后才会触发,故不会存在不同节点处理相同数据的问题。

场景:一个任务JOB的调度频率为每10s一次,在某个时间,该job执行耗时用了33s(平时只需执行5s),按照正常调度,应该后续会触发3次调度,那该job后执行完,会连续执行3次调度吗?


答案:在33s这次任务执行完成后,如果后面的任务执行在10s内执行完毕的话,只会触发一次,不会补偿3次,因为ElasticJob记录任务错失执行,只是创建了misfire节点,并不会记录错失的次数,因为也没这个必要。


参考文章:https://blog.csdn.net/prestigeding/article/details/80140777

相关文章
|
26天前
|
消息中间件 分布式计算 Java
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
27 2
|
3月前
|
监控 算法 定位技术
GTS自动补偿机制的工作原理
【8月更文挑战第25天】
46 4
|
3月前
|
机器学习/深度学习 传感器 算法
GTS自动补偿机制的作用
【8月更文挑战第25天】
39 2
|
3月前
|
负载均衡
异步任务处理系统问题之任务去重机制工作的问题如何解决
异步任务处理系统问题之任务去重机制工作的问题如何解决
|
4月前
|
SQL API 数据处理
实时计算 Flink版产品使用问题之如何避免集群重启后job信息和运行状态丢失
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
4月前
|
Oracle Java 数据库连接
实时计算 Flink版操作报错合集之在向协调器发送请求时出现报错,该如何解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6月前
|
传感器 SQL Java
Flink撤回机制问题之撤回机制不起作用如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
|
6月前
|
XML 负载均衡 Dubbo
了解Dubbo配置:优先级、重试和容错机制的秘密【五】
了解Dubbo配置:优先级、重试和容错机制的秘密【五】
309 0
|
消息中间件 存储 NoSQL
【2021年遇到最头疼的Bug】【Alibaba中间件技术系列】「RocketMQ技术专题」Broker配置介绍及发送流程、异常(XX Busy)问题分析总结
【2021年遇到最头疼的Bug】【Alibaba中间件技术系列】「RocketMQ技术专题」Broker配置介绍及发送流程、异常(XX Busy)问题分析总结
666 8
【2021年遇到最头疼的Bug】【Alibaba中间件技术系列】「RocketMQ技术专题」Broker配置介绍及发送流程、异常(XX Busy)问题分析总结
|
流计算
从Flink 重启策略机制能学习到什么?
最近在学习Flink ,在看到Flink的重启策略机制时感觉这个设计很好。
110 0