当前位置: 首页 > news >正文

孤舟笔记 分布式与微服务篇九 什么是幂等性?为什么面试总问它?解决思路一次讲透

文章目录

    • 先说结论
    • 哪些场景会重复执行
    • 方案一:唯一 ID + 去重表
    • 方案二:乐观锁(版本号)
    • 方案三:Token 机制
    • 方案四:状态机
    • 回答技巧与点评
      • 加分回答
      • 面试官点评

个人网站

用户点了一次"支付",网络超时了,又点了一次——会不会扣两次钱?这就是幂等性问题。在分布式环境下,网络抖动、超时重试、消息重复消费都可能导致同一操作被执行多次。面试官问这题,他想听的是:你能不能讲清幂等的概念、产生重复的场景、以及具体的解决方案?

先说结论

维度说明
定义同一操作执行一次和多次,结果完全一致
核心问题防止重复提交/重复消费导致数据不一致
产生原因网络重试、MQ 重复消费、用户双击
解决方案唯一ID + 去重表、乐观锁、Token 机制、状态机
关键原则天然幂等优先,改造幂等其次

|一句话记住:幂等就像"盖章"——同一章盖十次,纸上还是一个印"

哪些场景会重复执行

场景1:用户双击 用户点"提交" → 网络慢 → 以为没反应 → 又点一次 → 两次请求 场景2:超时重试 支付请求发出 → 网络超时 → 框架自动重试 → 请求到达两次 👈 场景3:MQ 重复消费 消费者处理完消息 → 准备确认ACK → 挂了 → MQ重新投递 → 消费两次 场景4:微服务重试 服务A调服务B → 超时 → 服务A重试 → 服务B实际已处理 → 处理两次

天然幂等的操作不用管:

天然幂等举例
查询SELECT * FROM user WHERE id = 1
绝对值设置UPDATE user SET name = ‘张三’ WHERE id = 1
删除DELETE FROM temp WHERE id = 1

非幂等的操作才需要处理:

非幂等举例
新增INSERT INTO order VALUES (…)
相对值更新UPDATE account SET balance = balance - 100 👈
状态流转UPDATE order SET status = ‘PAID’ WHERE status = ‘UNPAID’

方案一:唯一 ID + 去重表

每个请求带一个唯一 ID,处理前先查去重表:

// 幂等控制publicResultprocessOrder(OrderRequestreq){StringreqId=req.getRequestId();// 👈 客户端生成的唯一ID// 1. 查去重表,是否已处理if(dedupMapper.exists(reqId)){returnResult.success("已处理");// 👈 直接返回,不重复执行}// 2. 插入去重表(利用唯一索引保证原子性)dedupMapper.insert(reqId);// 3. 执行业务逻辑orderService.createOrder(req);returnResult.success();}

去重表设计:idempotent_log (request_id PK, result, created_at)

就像医院的"挂号系统"——同一个挂号号只能看一次病,来了第二次直接告诉你"已经看过了"。

方案二:乐观锁(版本号)

更新数据时带上版本号,版本号不对就拒绝:

// 扣款——乐观锁UPDATEaccountSETbalance=balance-100,version=version+1WHEREid=1ANDversion=5;// 👈 版本号必须匹配// 影响行数 = 0 → 说明已被其他人/重试修改过,不重复扣款

乐观锁适合"更新"场景,保证同一版本只更新一次。

方案三:Token 机制

服务端先发 Token,提交时带上 Token,服务端验证并删除:

1. 进入页面 → GET /api/token → 服务端生成 Token 存 Redis 2. 提交表单 → POST /api/order?token=xxx → 服务端删除 Token 3. 重复提交 → POST /api/order?token=xxx → Token 已不存在 → 拒绝 👈
// 提交时校验 TokenBooleandeleted=redis.delete(token);// 👈 原子操作,删除成功才处理if(!deleted){returnResult.fail("请勿重复提交");}// 执行业务逻辑

就像电影票——一张票只能检一次,撕了就不能再用。

方案四:状态机

业务本身有状态流转,利用状态约束保证幂等:

// 支付——只有"待支付"才能变"已支付"introws=orderMapper.updateStatus(orderId,"UNPAID","PAID");// UPDATE order SET status='PAID' WHERE id=? AND status='UNPAID' 👈if(rows==0){// 状态已经不是UNPAID,可能已支付,直接返回成功returnResult.success("已支付");}
幂等性全景 重复原因 ├── 用户双击 ├── 网络重试 ├── MQ重复消费 └── 微服务重试 天然幂等 ├── 查询、绝对值设置、删除 └── 不需要额外处理 解决方案 ├── 唯一ID+去重表 → 通用,适合新增场景 ├── 乐观锁 → 适合更新场景 ├── Token机制 → 适合前端防重复提交 └── 状态机 → 适合有状态流转的业务 口诀:同一操作多次行,结果一致叫幂等; 去重表查唯一ID,乐观锁靠版本号; Token一次就作废,状态机控流转方向; 天然幂等不用管,非幂等才要防范

回答技巧与点评

标准回答:幂等性指同一操作执行一次和多次结果一致。分布式环境下,网络重试、MQ 重复消费、用户双击都可能导致重复执行。解决方案:1)唯一 ID + 去重表——请求带唯一 ID,处理前查表判断;2)乐观锁——更新时校验版本号;3)Token 机制——服务端发 Token,提交时验证并删除;4)状态机——利用业务状态约束防止重复流转。原则:天然幂等的操作无需处理,非幂等操作根据场景选方案。

加分回答

  1. 去重表要和业务表在同一个事务中:否则去重记录插入了但业务失败了,下次请求被拦截就永远无法处理。正确做法是去重记录和业务操作在同一个数据库事务中
  2. MQ 消费幂等:RocketMQ 和 Kafka 都可能重复投递消息。最佳实践是消费端用"消息 ID + 去重表"保证幂等,而不是依赖 MQ 的 exactly-once 语义
  3. HTTP 幂等性规范:GET/PUT/DELETE 天然幂等,POST 非幂等。RESTful 设计中,创建资源用 POST(非幂等),更新用 PUT(幂等),这是一个重要的设计原则

面试官点评

这道题考的是你对分布式可靠性的理解。最忌讳的回答是只知道"防止重复提交"——面试官想听的是具体场景和解决方案的对应关系:扣款用什么方案?订单状态流转用什么方案?能根据场景选方案,再讲清实现细节,就是高分回答。

原文阅读


内容有帮助?点赞、收藏、关注三连!评论区等你 💪

http://www.gsyq.cn/news/1455539.html

相关文章:

  • AI动态简报之算力基建篇(2026.06.03)
  • STM32F103C8T6正交编码器角度采集工程:AB相计数+Z相归零,支持360°整圈映射与多线数适配
  • 2026海南高新技术企业认定代办机构排名|靠谱高企注册流程代办公司推荐 - GrowthUME
  • Arduino与DS18B20温度传感器实战:从单总线协议到多点监测
  • mg3680,mg3650,ts3440,g3800,ts3800,ts9020,ts8180报错5B00,P07,E08,5b02,1704,1700,5b04佳能V6.200,亲测有用。
  • 【ESP32-S3 从入门到精通-06】2026 最新 Wi-Fi 网络开发与配网技术全实战(Station/AP/TCP/UDP/SmartConfig)
  • Nintendo Switch Cleaner and Builder:Switch游戏文件管理的专业一站式解决方案
  • 国产之光 DeepSeek 把 AI 大佬全炸出来了,对 AI 行业竞争格局有何影响?
  • MATLAB脑网络分析专用BCT工具包,支持功能/结构连接矩阵全流程计算
  • 魔兽争霸3终极优化指南:如何让经典游戏在现代电脑上完美运行
  • virtio-win:让Windows虚拟机在KVM/QEMU上实现原生级性能的驱动套件
  • PS去掉图片白色背景的5种方法,PS如何去白底变透明?
  • OpenVoiceV2实战指南:5分钟掌握开源语音克隆核心技术
  • 别再买AI采购SaaS了!真正降本增效的路径是这6种混合部署模式(含成本对比热力图与实施周期甘特图)
  • ESP32太阳能气象站:低功耗设计、云端同步与HomeKit接入全攻略
  • 终极Windows任务栏美化指南:3分钟让你的桌面焕然一新
  • 如何快速掌握云端数据库管理:CloudBeaver完全指南
  • 从“70%搭架子”到一键生成:飞算JavaAI如何重构上下文工程
  • 多智能体强化学习如何实现配电网主动电压控制的终极解决方案:MAPDN深度解析
  • 2026年6月线上一天完工的采暖供应商哪家可靠,暗装暖气片/暖气/地暖管/居家采暖/装修采暖/全屋采暖,采暖公司怎么选择 - 品牌推荐师
  • 【AI面试临阵磨枪-89】Skill 幻觉、参数缺失、格式错误、业务异常如何处理?
  • 深度解析Wine:突破性跨平台兼容技术实战指南
  • 在银河麒麟高级服务器上同步官网软件源并配置内网软件源的保姆级教程
  • 美团:去相关奖励优化多目标学习
  • 【AI面试临阵磨枪-90】Skill 之间如何调用、依赖、组合、编排?
  • 2026 武汉翡翠回收实测,原石玉器回收挑选靠谱商家 - 合扬奢侈品交易中心
  • PaperFlow项目进展记录:MinerU 全文精析与 Editor Pro 进展记录
  • KDiff3文件对比与合并工具:7个技巧让你成为版本管理高手
  • GetQzonehistory终极指南:3分钟学会QQ空间历史说说完整备份
  • 基于ESP32与Ubidots的远程温湿度监测系统实战指南