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

【设计】接口幂等性设计

1. 幂等性定义

接口幂等性: 无论调用次数多少,对系统状态的影响与单次调用相同。
比如用户支付接口因网络延迟重复提交了三次。
导致原因:

  • 用户不可靠(手抖多点)
  • 网络不可靠(超时重传)
  • 系统不可靠(服务重试)

2. 解决方案?

  1. 使用token机制防抖
    token存在Redis中,删除token执行任务,否则就直接返回重复请求。

  2. 唯一索引
    创建类操作。

  3. 乐观锁(更新操作首选)
    通过版本号机制控制数据更新。

  4. 分布式锁(高并发场景)

  5. 状态机(业务流程控制)

  6. 请求序列号(复杂业务流)
    金融交易系统中常用,使用业务序列号,该序列号被处理,则返回缓存中的数据,否则直接处理相应的业务。

3. 案例

3.1 电商秒杀

10万QPS下如何保证库存扣减的幂等性?

  1. 预扣库存:Redis缓存库存数
  2. 请求序列号:用户Id+秒杀场次生成唯一Id
  3. 异步落库:MQ消费报保证最终一致性
public Result seckill(String userId, String activityId) {String bizId = userId + ":" + activityId;if(redis.setnx(bizId, "1") == 0 ) {return Result.error("重复请求");}redis.expire(bizId, 30);Long stock = redis.decr("stock:" + activityId);if(stock<0) {return Result.error("已售罄");}mq.send(new OrderMessage(userId, activityId));return Result.success("排队中");
}

3.2 银行转账系统

  1. 全局交易流水号(支付系统生成)
  2. 事务表唯一索引
  3. 账号余额变更使用CAS操作
update account
set balance = balance-100,version=version+1
where user_id = 123
and version = 5;

参考:草捏子

http://www.xdnf.cn/news/1898.html

相关文章:

  • Docker Macvlan网络配置实战:解决“network already exists“错误
  • ECMAScript 1(ES1):JavaScript 的开端
  • Nginx解决跨域问题
  • 信创时代开发工具选择指南:国产替代背景下的技术生态与实践路径
  • GPT-4.1模型引发独立测试中的严重对齐性问题担忧
  • Git 核心命令学习总结
  • Java后端MySQL动态语句编写
  • 淘宝店如何实现7*16小时高效运营?
  • ArkTS中的空安全:全面解析与实践
  • C++[类和对象][3]
  • websheet 之 table表格
  • 详解 LeetCode 第 242 题 - 有效的字母组
  • 游戏引擎学习第244天: 完成异步纹理下载
  • day49—双指针+贪心—验证回文串(LeetCode-680)
  • 面试常问问题:Java基础篇
  • 【金仓数据库征文】- 深耕国产数据库优化,筑牢用户体验新高度
  • 【编译原理】 第四章 自上而下语法分析
  • 【速写】钩子与计算图
  • B 树失败结点个数计算好题分享
  • 【黑马 微服务面试篇】
  • 多模态深度学习: 从基础到实践
  • 星火燎原:大数据时代的Spark技术革命在数字化浪潮席卷全球的今天,海量数据如同奔涌不息的洪流,传统的数据处理方式已难以满足实时、高效的需求。
  • windows编程字符串处理
  • 【QQMusic项目界面开发复习笔记】第二章
  • 工业相机——镜头篇【机器视觉,图像采集系统,成像原理,光学系统,成像光路,镜头光圈,镜头景深,远心镜头,分辨率,MTF曲线,焦距计算 ,子午弧矢】
  • 【TS入门笔记2---基础语法】
  • python_BeautifulSoup提取html中的信息
  • 1GB与1MB的数值换算关系
  • DeepSeek本地部署保姆级教程
  • tkinter的文件对话框:filedialog