接口幂等性设计(5 大方案罗列)

结合案例、列举场景的接口幂等性设计方案。

方案 1. 状态机

业务场景,数据审核成功后进行短信通知,或者是订单状态变成已支付后,短信通知用户订单生成的详细信息,等等和状态有关的操作。
假设 status:0(待审核)、1(已审核)、2(已退回)。

批量审核场景幂等性代码设计
在这里插入图片描述
shtz 方法 中的 sql 语句如下:update tab_dzzzhz set status = 1 where (status = 0 or status = 2) and id = #{id}

生效原理:用的是Mysql,Mysql 中的 update 原理,先是对查询条件中命中的数据进行上锁,然后接着修改这条数据。因此当有多个请求打过来,对指定 id、status 的这条数据的更新时,其实是一个串行化操作。第一个请求更新好数据后,数据的 status 变为了 1,第二个请求过来,发现没有符合条件的数据要更新了,直接 return 0(影响的行数为 0)。此时代码中就可以认为此次更新操作是多余的。就避免了重复短信通知的问题

方案 2. redis 分布式锁

这个没啥好说的,就是利用 lua 脚本,保证对应 查询、更新操作 的业务逻辑是原子性的。至于 lua 脚本锁的 key 根据各位的业务逻辑来。

在Spring Cloud项目中,保证接口幂等性是非常要的,尤其是在微服务架构下。下面将介绍几种常见的策略和技术手段来确保接口幂等性。 ### 1. **使用全局唯一ID(UUID)** 每条请求都应带上一个全球唯一的标识符(UUID),以此作为去的关键依据。我们可以在过滤器或拦截器处对该UUID进行校验,避免复处理相同的请求。 #### 实现步骤: - 客户端生成并传递`requestId` - 服务器接收到请求后将其存入Redis或其他缓存工具里 - 当再次接到相同`requestId`时,直接返回之前的响应结果 ```java public class IdempotentFilter extends OncePerRequestFilter { @Autowired private RedisTemplate<String, String> redisTemplate; @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 获取 requestId 参数值 String requestId = request.getParameter("idempotencyKey"); if (redisTemplate.opsForValue().get(requestId) != null) { // 已经有该键表示已经执行过了 直接结束掉本次调用 return; } try { // 执行正常链路逻辑... filterChain.doFilter(request, response); // 设置到缓存中止下次再进入业务层逻辑里面去了 止并发场景导致的问题 redisTemplate.opsForValue().set(requestId, "executed", Duration.ofMinutes(5)); } catch (Exception e){ throw new RuntimeException(e.getMessage()); } } } ``` ### 2. **乐观锁机制** 对于一些涉及数据变更的操作,我们可以利用数据库表中的版本号字段(`version`)来进行判断。当发生更新操作时,除了指定要修改的数据外还要附加当前记录对应的版本信息。SQL语句会添加额外条件限制只能作用于特定版本的数据行上;如果实际影响行数不符合预期说明其他地方抢先一步进行了改动那么此时应当告知用户尝试刷新页面获取最新的状态后再试一次即可。 ```sql UPDATE orders SET status='PAID', version=version+1 WHERE order_id=? AND version=? ``` **注:** `order_id` 和 `version` 分别对应订单编号及版本计数。 ### 3. **基于消息队列的幂等消费** 考虑到异步任务的存在情况,如RabbitMQ/Kafka这类的消息中间件可能会因为网络抖动等原因造成消费者复接收同一条消息的情形。因此我们需要在消费方建立一套针对主题/分区偏移量映射关系的记忆库,从而杜绝此类现象的发生几率。 --- 以上就是在Spring Cloud环境下常用的几种保证接口幂等性的做法。当然根据具体的业务需求还可以有更多的解决方案可供选择。总之核心思想就是尽量减少不必要的资源竞争以及引入合适的协调组件共同协作达成目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小咸鱼的技术窝

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值