接口幂等性怎么设计?

后端开发第 3 / 13 题答题框架
参考思路:为什么需要(重试/重复提交)→方案对比(唯一索引/token 预取/状态机/分布式锁)→适用场景。体现方案选型能力。

五个经典回答示范

回答一 · 校招应届版

幂等就是同样的请求执行多次效果和一次相同。需要它的场景是重试和重复提交:网络超时客户端重发、用户双击支付按钮。实现上我了解四种:唯一索引兜底防重、提交前先取 token 服务端校验、状态机限制非法流转、分布式锁串行化。下单场景我会在订单表用业务唯一键做最终防线。

回答二 · 1-3年经验版

我在支付回调上落地过幂等:回调可能重复通知。方案是通知表唯一约束先插记录,插入成功才执行业务,业务处理与状态变更放同一事务;对外部重试语义我们返回成功但不再重复入账。另外接口层做了 token 预取防表单重复提交,双端配合后重复订单投诉清零。

回答三 · 资深版

幂等我按读写语义分别设计:写操作的幂等靠服务端凭据——唯一键是空间幂等,版本号是时序幂等,状态机是业务幂等;读天然幂等不用处理。工程要点:幂等键的生成规范(谁生成、时效多长)、存储选型(DB 唯一约束强于 Redis 的先查后写)、以及重试风暴下的幂等键过期策略。幂等是分布式重试语义的前提。

回答四 · 追问应对

追问『token 方案流程』:进入页面取一次性 token,提交带上,服务端原子删除校验,删成功才放行;『唯一索引冲突怎么处理』:捕获冲突后查询已有结果返回成功,对外表现为幂等成功而非报错;『MQ 消费幂等』:消息带业务 ID,消费记录表去重,与业务同一事务落库。

回答五 · 反面示范

『前端把按钮置灰防重复点击就行了,后端不用管,用户不会绕过前端的。』——点评:超时重试、网络重发、恶意调用都绕过前端;幂等必须在服务端闭环。另一个极端是全接口加锁串行化,牺牲并发换正确性,说明不会按语义分级设计。

怎么练这道题
  1. 打开 模拟练习,选择「后端开发」方向,限时 3 分钟作答本题。
  2. 对照上方答题框架,逐点检查:哪些要素没覆盖、哪里表达啰嗦。
  3. 用自己项目的真实经历替换框架中的占位内容,重讲一遍并录音回听。

这类题在真实面试中常被追问细节,
建议进入限时模式练一遍。

开始限时演练