跳到正文

幂等

Idempotency

高级通用

幂等(Idempotency)是指同一个操作执行多次,最终产生的业务效果与执行一次相同。它解决网络超时、用户重复点击或任务重试带来的重复处理问题,比如创建订单时避免生成两笔订单。

你可能会说:「用户付款后网络卡住又点了一次,帮我保证不会因此创建两笔订单。」

读之前建议先了解(这是一个高级概念)

动手看看

请求号客户端订单接口订单记录
1

用户点击提交订单,客户端带上这次提交的唯一请求号。订单接口会用它识别后续是不是同一次操作。

要点

  1. 1

    看业务结果,不只看返回值

    你把同一次请求发两遍,如果最终只创建了一笔订单,就达到了这个操作想要的幂等效果。两次返回的状态或提示可以不同;关键是第二次没有再产生一笔订单。

  2. 2

    先确定什么算同一次操作

    创建订单时,可以让客户端为一次提交生成幂等键,重试时沿用它;用户确实要再买一单,就换一个键。因为参数相同不代表意图相同,不能只靠比较请求内容判断重复。

  3. 3

    并发重试也要守住结果

    两个相同请求可能几乎同时到达。如果它们都先查到“尚未处理”,再各自创建订单,仍会重复。服务端需要让识别请求和记录处理结果的流程能抵挡并发,并约定同一个键传来不同参数时如何处理。

容易混淆的地方

幂等关注的是同一次操作重复执行后,业务结果会不会增加或改变;原子性关注的是一次操作内部要么完成、要么不完成。一笔订单可以在事务中原子地创建,但两次重试仍可能各创建一笔。它也不等于“所有相同内容都去重”:用户连续发送两条相同消息,可能本来就是两次独立操作。

什么时候用

适合用

  • 支付或创建订单接口可能因超时被重试时,用同一个幂等键标记同一次提交,避免重复扣款或下单。
  • 消息队列可能再次投递同一条任务时,让消费者重复处理也不会重复发放权益。
  • AI Agent 调用有副作用的工具后没收到结果、准备重试时,防止重复创建工单或重复提交表单。

不适合用

  • 用户每点一次“生成新方案”都想得到一次新结果时,不把多次点击当成同一次操作;用独立任务 ID 跟踪各次生成。
  • 页面只是读取商品详情时,通常不需要额外设计幂等键;用普通查询,并按需要处理缓存与刷新。
  • 用户连续发送两条内容相同的聊天消息且希望都保留时,不按文本内容去重;给每条消息独立编号。

练一练

用户提交订单后页面超时,客户端自动重试;第一次请求可能已经成功。你会怎样设计创建订单接口?

让 AI 帮你做

请把创建订单接口设计为幂等:客户端为每次提交生成幂等键,超时重试沿用原键,新订单使用新键。服务端处理并发的同键请求,避免重复创建;同键但参数不同时返回明确错误,并补上相关测试。

接下来学什么