幂等
Idempotency
高级通用幂等(Idempotency)是指同一个操作执行多次,最终产生的业务效果与执行一次相同。它解决网络超时、用户重复点击或任务重试带来的重复处理问题,比如创建订单时避免生成两笔订单。
你可能会说:「用户付款后网络卡住又点了一次,帮我保证不会因此创建两笔订单。」
动手看看重复点击提交订单
1
用户点击提交订单,客户端带上这次提交的唯一请求号。订单接口会用它识别后续是不是同一次操作。
要点怎样判断一个操作是否幂等?
- 1
看业务结果,不只看返回值
你把同一次请求发两遍,如果最终只创建了一笔订单,就达到了这个操作想要的幂等效果。两次返回的状态或提示可以不同;关键是第二次没有再产生一笔订单。
- 2
先确定什么算同一次操作
创建订单时,可以让客户端为一次提交生成幂等键,重试时沿用它;用户确实要再买一单,就换一个键。因为参数相同不代表意图相同,不能只靠比较请求内容判断重复。
- 3
并发重试也要守住结果
两个相同请求可能几乎同时到达。如果它们都先查到“尚未处理”,再各自创建订单,仍会重复。服务端需要让识别请求和记录处理结果的流程能抵挡并发,并约定同一个键传来不同参数时如何处理。
容易混淆的地方
幂等关注的是同一次操作重复执行后,业务结果会不会增加或改变;原子性关注的是一次操作内部要么完成、要么不完成。一笔订单可以在事务中原子地创建,但两次重试仍可能各创建一笔。它也不等于“所有相同内容都去重”:用户连续发送两条相同消息,可能本来就是两次独立操作。
什么时候用
适合用
- 支付或创建订单接口可能因超时被重试时,用同一个幂等键标记同一次提交,避免重复扣款或下单。
- 消息队列可能再次投递同一条任务时,让消费者重复处理也不会重复发放权益。
- AI Agent 调用有副作用的工具后没收到结果、准备重试时,防止重复创建工单或重复提交表单。
不适合用
- 用户每点一次“生成新方案”都想得到一次新结果时,不把多次点击当成同一次操作;用独立任务 ID 跟踪各次生成。
- 页面只是读取商品详情时,通常不需要额外设计幂等键;用普通查询,并按需要处理缓存与刷新。
- 用户连续发送两条内容相同的聊天消息且希望都保留时,不按文本内容去重;给每条消息独立编号。
练一练选一个答案,看看解释
用户提交订单后页面超时,客户端自动重试;第一次请求可能已经成功。你会怎样设计创建订单接口?
让 AI 帮你做复制给 AI Agent 直接用
请把创建订单接口设计为幂等:客户端为每次提交生成幂等键,超时重试沿用原键,新订单使用新键。服务端处理并发的同键请求,避免重复创建;同键但参数不同时返回明确错误,并补上相关测试。