如何设计一个幂等接口,新人只会说‘加Token’,老炮这样答直接过……#后端 #后端面试 #java面试 #程序员 #计算机

已完成

任务ID: 1917

30秒速读

核心摘要

90
秒读完
该题是美团三面高频考题,去年淘汰70%候选人,考察分布式一致性理解深度,仅答加Token属于初中级水平
三类场景对应专属解法:插入场景用业务标识+数据库唯一索引,更新场景用带版本号的乐观锁,异步回调用状态机+唯一键
幂等设计不能脱离场景空谈方案,优先依赖数据库特性做并发控制,比代码层的判断逻辑更可靠

可执行建议

  • 后端求职者面试前梳理三类幂等场景的完整实现逻辑,避免仅给出加Token的浅度回答
  • 自查自身负责系统的核心业务接口,结合实际场景优化现有幂等防重机制

高价值评论洞察

  • 大量开发者对幂等方案的生产落地局限性有质疑,认为很多网传方案是脱离实际的八股,未覆盖异常场景
  • 部分用户存在认知偏差,认为无需做幂等校验、出问题手动处理数据即可,对分布式一致性的风险认知不足
  • 有求职者关心除了常规后端岗,面试agent开发等其他相关岗位是否也会考察幂等类面试题

用户关注点

  • 幂等方案的异常兜底逻辑,比如Redis宕机后的降级处理、大促高并发下业务唯一键生成方案
  • 幂等设计的落地细节,包括和前端拦截、分布式锁等其他方案的结合方式
  • 后端相关岗位的面试考点覆盖范围

可复用选题/回应建议

  • 新增幂等方案异常兜底专题内容,讲解Redis挂掉后的数据库降级策略,回应用户对方案可靠性的质疑
  • 补充幂等设计全链路落地实操内容,纠正用户“无需做幂等校验”的错误认知,覆盖高并发场景的防重处理
  • 整理后端高频八股考点答疑合集,明确不同开发岗的考察范围

代表性评论

  1. 评论“这redis挂了不也一样。净搞这些八股”,代表大量开发者对纯理论幂等方案缺乏生产异常兜底的质疑,是高共鸣的真实痛点
  2. 评论“业务唯一键怎么生成,大促期间后台压力较大客户点了几次提交和刷新怎么办”,点出高并发场景下幂等落地的核心实操疑问

基本信息

2026/6/18 17:36:46

标签与备注

标签

幂等接口设计后端面试Java面试分布式一致性乐观锁方案接口防重程序员面试

备注

暂无备注

转录文本

你们的转账接口被用户重复点击了,钱被扣了两次,怎么解?我给接口加个token,提交后把token置为已用。token存在哪儿?Redis?还是数据库?万一服务重启,token丢了怎么办?你总不能要求每家都带着同一个token吧?你又答不出来了。 这道题是美团三面的高频题,去年就刷掉百分之七十的候选人。为什么这么难?因为它考的是你对分布式一致性的理解深度。点赞、收藏这篇,下次面试别再卡在这道题上。 我给你还原两个真实面试场景,看看你能达到哪个水平。怎么设计幂等接口?加个唯一请求ID,提交时验证,验证通过就处理。唯一ID存哪?存Redis。Redis挂了怎么办?那就先不处理?用户转一百万,Redis挂了你们就不处理了? 怎么设计幂等接口,分两个维度。第一是插入场景,用业务唯一键防重,比如订单号加用户ID加时间戳。第二是更新场景,用乐观锁和悲观锁。插入场景我详细说说:前端生成一个唯一token,这个token不是接口级别的,而是业务级别的,跟业务数据绑定存在数据库。接口进来先查这个token状态,是处理中就返回重复提交,是成功就返回已处理,只有未处理才执行业务,执行完后状态变更为成功,这是原子操作,要么全成功,要么全失败。 不错。那你用什么保证原子性?用数据库唯一索引,比如转账表有唯一约束:用户ID加业务ID加token,只有第一个请求能插入成功,后续请求会报duplicate exception,我捕获这个异常就知道是重复请求。那分布式环境下呢?两台机器同时拿到token,状态是未处理,怎么保证只有一个执行?用分布式锁,但分布式锁本身也要考虑原子性,所以最优方案是直接依赖数据库唯一约束,而不是先查后写。 看到差距了吗?一年经验只会说加token,老炮从业务场景说到技术选型,从单点说到分布式,从Redis说到数据库唯一索引,层层递进。想知道老炮怎么做到的吗?我来逐步给你拆解:幂等性不是加个字段那么简单,它涉及到并发控制、分布式、一致性、数据库原理等多个知识点。说白了,幂等性就是做一次和做一百次效果一样。 三种场景,每种场景一个解法。场景一:插入防重,比如创建订单、注册用户。这种场景的解法是业务标识加数据库唯一索引。用户下单时带上订单号,这个订单号在数据库有唯一索引约束,只有第一个请求能插入成功,后续请求会触发唯一键冲突,数据库直接拒绝。这就是让数据库替你做并发控制,比你在代码里写if判断靠谱一万倍。 场景二:更新防重复,比如扣款、扣库存。这种场景的解法是乐观锁。你在SQL里加个版本号条件:update count set balance = balance - 100 where ID = 1 and version = 1,只有版本号匹配时才能更新成功,更新后版本号加一。第二个请求来的时候,版本号已经变成2了,where条件不满足,更新失败,你捕获这个更新失败的返回值,就知道是重复操作。 场景三:异步回调防重,比如第三方支付回调。这种场景的解法是状态机加唯一键。第三方回调会带一个唯一的transaction ID,你在数据库建一张回调记录表,用transaction ID做唯一索引。回调来的时候先插入,插入成功才处理,插入失败说明已经处理过了,幂等就解决了。但还有个问题:第一个请求处理到一半,第三方又回调了一次怎么办?这就需要状态机控制,只有状态是待处理才能处理,处理中加锁,防止并发重复处理。 换个说法就是,幂等性不是一道填空题,是一道场景设计题。你得先问清楚业务场景:插入还是更新?同步还是异步?并发量多大?然后再给方案,脱离场景谈方案都是耍流氓。这题考的不是你知不知道幂等,是考你能不能根据不同场景给出不同方案。只会加token是初中级水平,能针对插入、更新、异步三种场景给出完整方案的才是高级水平。下次面试前想一想,你们系统的核心接口有没有做幂等?做了的话是怎么做的?抖音。

任务状态

当前状态 已完成
重试次数0
创建时间2026/8/12 06:11:14
更新时间2026/8/12 06:14:27
完成时间2026/8/12 06:14:27

技术信息

任务IDtask_1786486274865485647_lJ9R9zD7
字幕文件已生成
重新分析

想分析自己的视频?

注册可获赠体验积分,具体额度和各功能单价以价格页为准。

免费注册
返回任务列表
如何设计一个幂等接口,新人只会说‘加Token’,老炮这样答直接过……#后端 #后端 - AI视频分析案例