常见的幂等方案

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. 状态覆盖(用户资料) → 状态幂等

相关推荐
GetcharZp3 小时前
玩转 Linux 机器视觉:手把手带你搞定 Ubuntu 下海康工业相机 C++ SDK
后端
星星在线7 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒7 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x8 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
袋鱼不重9 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
用户8356290780519 小时前
使用 Python 操作 Word 内容控件
后端·python
像我这样帅的人丶你还9 小时前
啥? 前端也要会干Java?🛵🛵🛵
后端
Hommy889 小时前
【剪映小助手】添加贴纸接口(Add Sticker)
后端·github·剪映小助手·视频剪辑自动化·剪映api
CaffeinePro10 小时前
FastAPI响应处理:返回值、状态码、响应头与异常标准化与案例解析
后端
HuanYu10 小时前
PageHelper分页的原理
后端