文章目录
幂等性设计
任意多次执行所产生的影响均与一次执行的影响相同。按照这个含义,最终的含义就是对数据库的影响只能是一次性的,不能重复处理。
在我们编程中中一些常见的操作,数据库和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秒。此时间内,重复请求则会提示失败