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

分布式接口幂等性设计:唯一索引、Token 与分布式锁

接口幂等性解决的是“同一个请求被执行多次会不会造成重复业务效果”的问题。用户重复点击、网络重试、MQ 重复消费都可能让同一业务被重复执行。一句话概括幂等就是多次调用和一次调用的业务结果一致查询和按唯一值删除天然幂等新增、支付、转账、发券这类写操作必须额外设计幂等。GET 查询DELETE 按唯一值删除POST 新增或支付PUT 增量更新请求进入业务接口是否天然幂等直接处理需要幂等设计数据库唯一索引Token Redis分布式锁什么是幂等幂等的定义是多次调用方法或接口不会改变业务状态重复调用结果和单次调用结果一致。常见需要幂等的场景用户重复点击提交按钮。网络波动导致前端或网关重试。MQ 消息重复投递。应用超时后触发重试机制。支付、转账、下单、发券等写操作。从 RESTful 看幂等性请求方式是否幂等说明GET幂等查询操作不改变状态POST通常不幂等新增请求执行多次会插入多条数据PUT看写法绝对值更新幂等增量更新不幂等DELETE通常幂等按唯一 ID 删除多次删除结果一致比如updatet_itemsetmoney500whereid1;这是幂等的因为执行多次结果都是 500。updatet_itemsetmoneymoney500whereid1;这不是幂等的因为执行多次会一直累加。数据库唯一索引新增类业务可以通过唯一索引防重复。比如订单表有业务订单号order_no给它加唯一索引createuniqueindexuk_order_noont_order(order_no);同一个订单号重复插入时数据库会拒绝第二次插入。适合场景创建订单。创建支付流水。MQ 消费记录。发券记录。唯一索引是最硬的兜底优先级很高。Token RedisToken 方案适合提交订单、转账、支付这类“前端先申请令牌再带令牌提交”的场景。存在不存在客户端请求 token服务端生成唯一 tokentoken 存入 Redis返回 token 给客户端客户端携带 token请求业务接口Redis 中 token 是否存在删除 token执行业务重复请求直接返回关键点是验证 token 和删除 token 必须是原子操作。否则两个重复请求同时进来都可能判断 token 存在。实际项目里可以用 Redis Lua 脚本完成“判断 删除”。示例脚本localtokenKeyKEYS[1]localexistsredis.call(exists,tokenKey)ifexists1thenredis.call(del,tokenKey)return1elsereturn0endJava 侧伪代码可以这样理解LongresultredisTemplate.execute(script,List.of(submit:token:token));if(result1){// token 存在且已删除可以执行业务createOrder();}else{// token 不存在说明是重复提交或非法请求return;}为什么要用 Lua因为 Redis 执行 Lua 脚本是原子的exists和del不会被其他请求插队。这样两个重复请求同时到达时只有一个请求能删除成功并继续执行业务。分布式锁分布式锁也能控制重复执行。典型写法是用业务唯一值作为锁 keyRLocklockredissonClient.getLock(order:orderNo);booleanlockedlock.tryLock(10,TimeUnit.SECONDS);try{if(!locked){thrownewRuntimeException(重复提交);}// 执行业务}finally{if(locked){lock.unlock();}}使用分布式锁要注意锁粒度要小最好按业务单号加锁。抢不到锁要快速失败。要保证 finally 释放锁。高并发场景下性能比 Token 或唯一索引更重。方案怎么选方案适合场景优点注意点唯一索引新增、流水、消费记录简单可靠数据库兜底需要设计业务唯一键Token Redis表单提交、支付、转账性能好体验清晰校验和删除要原子分布式锁新增或修改都要串行控制范围灵活性能较低锁粒度要小面试回答模板可以这样答幂等是指多次调用接口不会改变业务状态重复调用和单次调用的结果一致。查询接口天然幂等POST 新增、支付、转账、MQ 消费这类场景需要额外设计。新增数据可以用数据库唯一索引比如订单号或消息 ID 做唯一约束。提交订单、支付等场景可以用 Token Redis第一次请求生成 token 存入 Redis第二次提交时携带 token服务端验证 token 存在后删除并执行业务不存在就认为是重复请求。新增或修改也可以用分布式锁但性能相对低要控制锁粒度。小结幂等设计的核心不是“防重复提交”一句话而是识别业务唯一性。能用唯一索引兜底就先兜底需要前置防重复就用 Token需要串行化处理再考虑分布式锁。
http://www.zskr.cn/news/1369769.html

相关文章:

  • 分布式事务方案:Seata XA、AT、TCC 与 MQ
  • Taotoken审计日志功能在团队协作与安全排查中的作用
  • Taotoken 的 Token Plan 套餐如何帮助项目更精准地控制预算
  • 终极OBS计时器插件指南:7个技巧让直播时间管理变得简单
  • ZetaChain 是一条内置跨链托管与消息传递的 Layer 1
  • 渗透测试入门真相:不是黑进系统,而是验证风险
  • 2026浙江成人教育机构大盘点:谁才是真正的卷王? - 奔跑123
  • 告别城市喧嚣!隔音窗选购全攻略,静华轩隔音窗打造安静居家环境 - 维小达科技
  • Cursor Pro破解工具完整指南:5步实现机器标识重置与永久Pro功能解锁
  • 如何用嘎嘎降AI处理新闻学论文:新闻学毕业论文降AI4.8元完整操作教程
  • 使用 Node.js 和 Taotoken 快速构建一个聊天应用后端
  • 分布鲁棒与风险感知优化:在不确定性中制定对抗性决策
  • 明日方舟MAA助手:5分钟快速上手的智能自动化工具终极指南
  • 2026年4月合肥GEO优化公司排名:口碑服务五家对比评测推荐 - 行业深度观察C
  • 完整实战指南:高效配置Realtek RTL8125网卡ESXi驱动的专业方法
  • macOS百度网盘高速下载破解:3步实现SVIP级别下载体验
  • C51变量固定内存地址定位的3种方法与实践
  • DVWA靶场搭建超详细教程:Linux服务栈深度配置指南
  • OBS高级计时器插件:7种专业模式让你的直播时间管理精准无忧
  • 洛谷 P3366 【模板】最小生成树 题解 1
  • 2026 南京品牌手表回收老店对比:添价收精准评估占据竞争优势 - 薛定谔的梨花猫
  • 3步解决微信缓存膨胀:CleanMyWechat实战指南
  • 5分钟掌握unrpa:解锁Ren‘Py游戏资源的全能提取工具
  • Maccy:macOS剪贴板管理的终极解决方案,重新定义你的复制粘贴效率
  • Loop:优雅的Mac窗口管理工具,让你告别杂乱桌面
  • 洗牌与重构:合肥“科技之都”背景下的AI营销服务商竞速赛 - 行业深度观察C
  • 2026年便携式荧光法溶解氧仪品牌排行榜:国产十强专业评测与选型指南 - 仪表品牌排行榜
  • 2026年,这家专业做料浆泵的公司有何独特之处?快来一探究竟! - 资讯纵览
  • 为Hermes Agent自定义模型供应商并接入Taotoken服务
  • TestDisk与PhotoRec:数据丢失救星的终极恢复指南