常见的幂等方案

1. 过滤-去重型(显式挡回重复包)

思路:在业务逻辑之前,先检查"这条请求 / 这条消息是不是第一次见到"。

常见实现

• 数据库唯一索引:INSERT ... ON CONFLICT DO NOTHING

• 去重表 / Redis SET:SADD msgId 看返回值 0/1

• 带 TTL 的布隆过滤器:高 QPS 场景减小内存

优点

• 对已有系统侵入小,只要给消息加 msgId

• 过滤失败后可以"啥也不做"直接 ACK,不会二次执行。

缺点

• 需要额外存储去重键,热点写压力大。

• 强制把"是否重复"与"业务逻辑"分离,代码路径分叉。

• 时间窗口过长会造成键无限增长;过短又可能误判"新老交叉"。

适用

支付、扣款、库存扣减等"不能多扣一分钱/一件货"的硬幂等场景。


2. 状态幂等型(让同一操作幂次方 = 1)

思路:业务本身就是一棵状态机,外部多发同一个动作不再产生新副作用。

实现方式

• 不可变资源:PUT /users/42/address 多次覆盖写,最终状态一致。

• CAS / 乐观锁:只在 version=N 时成功;失败说明已经处理过。

• 状态字段:订单 status = PAID 再收到支付回调直接忽略。

优点

• 内部数据结构最简,复用现成行记录。

• 不依赖额外键值表,天然水平扩展。

• 重放/回溯也安全。

缺点

• 并非所有业务都能"覆盖写"------扣减库存、累计积分就不是幂等操作。

• 状态设计稍有不慎会出现"订单半付款"之类边界态。

适用

资源更新(配置中心、用户资料)、软删除标记、流式统计覆盖写。

怎样选

  1. 一次性副作用(扣钱 / 发货) → 过滤-去重 +/or 事务-原子
  2. 状态覆盖(用户资料) → 状态幂等

相关推荐
短剑重铸之日9 分钟前
《设计模式》第十一篇:总结
java·后端·设计模式·总结
Dragon Wu1 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
一个有梦有戏的人1 小时前
Python3基础:进阶基础,筑牢编程底层能力
后端·python
爬山算法2 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
独断万古他化2 小时前
【Spring 原理】Bean 的作用域与生命周期
java·后端·spring
我爱加班、、2 小时前
Websocket能携带token过去后端吗
前端·后端·websocket
一 乐3 小时前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
80530单词突击赢3 小时前
SpringBoot整合SpringMVC全解析
java·spring boot·后端
hdsoft_huge3 小时前
1panel面板中部署SpringBoot和Vue前后端分离系统 【图文教程】
vue.js·spring boot·后端
lekami_兰3 小时前
RabbitMQ 延迟队列实现指南:两种方案手把手教你搞定
后端·rabbitmq·延迟队列