最近在做一个业务流系统,部署在分布式环境下,使用到分布式调度系统,一是为了在系统宕机,系统发布的时候任务能够在可用的机器上重启重新;二是任务需要重试,等接口执行失败之后需要设置调度系统的间隔时间在业务集群上重启启动任务(业务的线程和进程都可能发生变化),因为业务流中的业务接口都是有影响或者不幂等比如关闭应用,这条命令就不能重复执行。
这就要求每个重试/重启单元是幂等,我的思路是能够记录每个外部接口的执行过程,要是某个接口已经执行过某个步骤之后跳过这个阶段,保证命令不会重复下达。
每个业务接口我把它分成3个阶段,命令下达(下达成功、下达失败),命令执行成功(执行承成功、执行失败),命令结果入库成功(入库成功、入库失败),基本模型
public class IdempotentFlag { private Boolean commandSendDown = false; // 2 未知(对于异步任务,命令下达成功,此状态下需要不停检测) 0 失败 1 成功 private int commandSuccess = 2; private Boolean commandResultInDB = false; // 任务的附加信息,比如异步任务返回的TaskID private String attachInfo; }
每个幂等对象都有一个Key,在整个流程是唯一的,幂等对象的入库,我使用的是Enhance动态代理,这样代理对象的获得:若数据库存在从数据库查取数据初始化对象,若是数据库不存在构造默认对象。
public class IdempotentFlagFroxyFactory implements MethodInterceptor { private String contextKey; public IdempotentFlagFroxyFactory(String contextKey) { this.contextKey = contextKey; } public IdempotentFlag getProxy() { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(IdempotentFlag.class); enhancer.setCallback(this); IdempotentFlag clearObject = (IdempotentFlag) enhancer.create(); String IdempotentFlagString = getFromDB(contextKey); if (StringUtils.isNotBlank(IdempotentFlagString)) { IdempotentFlag dbObject = IdempotentFlag.toObject(IdempotentFlagString); try { BeanUtils.copyProperties(clearObject, dbObject); } catch (Exception e) { e.printStackTrace(); } } return clearObject; } @Override public Object intercept(Object target, Method method, Object[] args, MethodProxy proxy) throws Throwable { Object result = proxy.invokeSuper(target, args); if (method.getName().contains("set")) { IdempotentFlag flag = (IdempotentFlag) target; context.putPersistentString(contextKey, flag.toString()); } return result; } }
在外部接口周围保存阶段再做一个状态机就可以,保证任务的幂等,不会重复下发,并且失败之后还可以重试。
相关推荐
**2.2 集群环境下的定时任务幂等性** 在分布式环境中,特别是在集群环境下,定时任务或者异步处理也可能出现重复执行的问题。为了解决这个问题,可以通过以下几个方面来确保幂等性: - **状态检查**:在执行任务前...
9. **任务幂等性**:设计任务时,应确保任务是幂等的,即使多次执行也不会产生副作用。这样即使任务偶尔重复执行,也不会对系统造成严重问题。 综上所述,解决Spring Quartz在负载均衡环境下的重复执行问题,需要...
消息队列延迟定时任务是软件开发中一种常见且重要的技术,它主要用于处理那些需要在特定时间点执行的任务...在实际应用中,还需要考虑任务幂等性、异常处理、任务回退策略等其他关键因素,以确保系统的稳定性和可靠性。
在IT行业中,接口幂等性是一项重要的设计原则,特别是在分布式系统和微服务架构中。它确保了对同一接口的多次请求不会导致额外的副作用。在本文中,我们将深入探讨接口幂等性的概念、应用场景以及实现策略。 一、...
3. **任务幂等性**:对于可能出现重复执行的任务,开发者应确保任务逻辑具有幂等性,即多次执行同一任务对系统的影响与执行一次相同。 在实际部署过程中,还需要注意监控调度中心和执行器的状态,确保所有组件的...
8. select + insert:并发不高的后台系统,或者一些任务 JOB,为了支持幂等,支持重复执行,简单的处理方法是,先查询下一些关键数据,判断是否已经执行过,在进行业务处理。 9. 状态机幂等:在设计单据相关的业务,...
4. **任务幂等性设计**:即使任务被多个实例执行,也应设计为幂等的,即多次执行结果相同,不会对系统造成影响。例如,更新数据库操作可以通过唯一标识来避免重复插入或更新。 5. **Quartz集群配置**:Quartz自身...
标题“大数据量幂计算 可以计算例如2的24次幂等天文数字”揭示了我们讨论的主题是关于如何有效地执行大规模的幂运算,尤其是那些可能导致极大结果的计算。描述中提到的“大数据量的乘法运算”是实现这一目标的基础,...
9. 状态机幂等 在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机(状态变更图),就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于...
在数值线性代数中,求解矩阵的特征值问题是一项基础而重要的任务。对于大型稀疏矩阵而言,直接求解所有特征值可能非常耗时且计算成本高。为此,发展出了多种专门用于寻找特定特征值(如最大或最小模特征值)的有效...
在计算机科学中,大数运算是一项基础且重要的任务,特别是在密码学、数学计算以及高性能计算等领域。本主题聚焦于大数的幂运算和幂模运算的优化,通过结合加法链和蒙哥马利算法来提升计算效率。下面将详细阐述这两种...
在Python编程环境中,曲线拟合是一项常见的数据分析任务,它能够帮助我们从一组数据中找到一个最佳的数学模型来描述这些数据。在这个名为"Py3_曲线拟合_幂函数.rar"的压缩包中,包含了一个名为"Py3_曲线拟合_幂函数....
总的来说,保证分布式系统中接口的幂等性是一个综合性的任务,涉及到请求标识、状态管理、并发控制等多个方面。理解这些策略并结合实际应用场景选择合适的方案,是构建可靠分布式系统的关键步骤。在设计和实现过程中...
标题中的“基于SpringBoot幂等性框架”是指一个利用SpringBoot构建的软件系统,其中实现了幂等性设计原则。幂等性是分布式系统中的一个重要概念,意味着一个操作无论执行多少次,其结果始终一致,不会因为重复调用而...
在数值分析领域,寻找矩阵的特征值是一项核心任务,特别是在解决线性代数问题、稳定性分析、模式识别以及信号处理等领域有着广泛的应用。其中,**幂法**(Power Method)与**反幂法**(Inverse Power Method)作为两...
3. **幂等性设计**:任务执行必须是幂等的,即使同一个任务被多个节点执行多次,结果也应保持一致。 **三、定时任务持久化** 为了在集群环境下保证任务的连续性和一致性,我们需要将定时任务的定义持久化到数据库...
标签中的“2的次幂”、“次幂”和“数的拆分”进一步强调了这个任务的核心内容。2的次幂指的是2的任意正整数次方,如2^0、2^1、2^2等。次幂运算在计算机科学中无处不在,尤其是在计算和数据结构中。数的拆分则是指将...
Quartz支持 cron表达式,可以创建复杂的时间调度规则,并且具有集群功能,当在一个集群中运行时,能确保任务的幂等性和一致性。 在实现分布式定时任务时,有几个关键点需要注意: 1. **任务分发**:系统需要有策略...
在IT领域,数值计算是不可或缺的一部分,特别是在解决线性代数问题时。本文将深入探讨“powermethd_Aitken幂法加速_...通过对幂法的加速,我们可以更高效地处理这些计算任务,从而提高整体的计算效率和结果的准确性。