幂等性设计

文章介绍了幂等性设计的概念及其在数据库操作中的应用,分析了造成多次请求的原因,并提出了前端预防和数据库唯一约束等解决方案。文章重点阐述了一种基于AOP的幂等性实现方法,通过请求URL、参数和头信息进行预校验,并在缓存中设置过期时间,以防止重复提交,确保系统的稳定性和数据一致性。此外,指出了哪些类型的接口(如新增、用户注册、设备注册)应实施幂等性,而查询、更新和删除操作因其天然幂等性无需额外处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

幂等性设计

任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义,最终的含义就是对数据库的影响只能是一次性的,不能重复处理。
在我们编程中中一些常见的操作,数据库和redis 的增删改查.
1、select查询天然幂等.
2、delete删除也是幂等,删除同一个多次效果一样.
3、update直接更新某个值的,幂等.
4、update更新累加操作的,非幂等.
5、insert非幂等操作,每次新增一条.

造成多次请求的原因:

1、点击提交按钮两次;
2、点击刷新按钮;
3、使用浏览器后退按钮重复之前的操作,导致重复提交表单;
4、使用浏览器历史记录重复提交表单;
5、浏览器重复的HTTP请;
6、APP与端终设备重试多次,或重复提交等。

经常使用解决方案:

1、前端js处理,没有获取到返回值时候,防止客户重复提交。
2、对于部分要求唯一的字段做唯一约束。
3、对于部分数据先查询再进行插入更新。
4、在提交之前生成唯一 traceid/MessageID作为标识,请求一次获取traceid删除缓存,防止反复提交,这里通过本地缓存+redis缓存和拦截器/过滤器来做。

2.幂等方案实施

背景

主要针对设备配网,用户注册,设备注册等功能进行幂等设计,防止重复请求和提交。

原理

使用aop对接口请求进行预校验,通过requesUrl+param+header param进行请求验证。
第一次请求,请求成功后,设置此请求的key(requesUrl+param+header param)的缓存,指定过期时间。
在此缓存过期时间内,继续重试,则会触发缓存查询机制,接口请求不成功,系统会提示请求过于频繁。
设置幂等,可以提高系统的稳定性,避免了重复数据的产生。

改造目标

含【设备配网功能】的微服务项目中,POST请求的接口要加上幂等
含【用户注册功能】的微服务项目中,POST请求的接口要加上幂等
含【设备注册】的微服务项目中,POST请求的接口要加上幂等
其余项目中,【新增】请求的功能加上幂等
【查询】、【更新】、【删除】请求无需增加幂等,天然幂等
【控制请求】请求无需增加幂等,可能会出现用户连续点击这个情况

演示效果

在这里插入图片描述

实施

pom文件中引入basic-service-governance依赖

<dependency>
    <groupId>com.irobotics</groupId>
    <artifactId>basic-service-governance</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

controller中加入@Idempotent注解


@Controller
public class TestController {
    @GetMapping("test-md")
    @Idempotent
    public ResponseMessage testMd(Integer taskId) {
        return ResponseMessage.buildSuccess("ok");
    }
}

配置文件YML幂等设置

idempotent:
  enable: true      ##是否开启幂等 默认:关闭
  expireTime: 3     ##幂等过期时间,单元:秒,默认:3秒。此时间内,重复请求则会提示失败

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值