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

【设计】接口幂等性设计

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;

参考:草捏子

相关文章:

  • SQLite 是什么?
  • 28、.NET 中元数据是什么?
  • maxscript根据音频创建动画表情
  • 闻性与空性:从耳根圆通到究竟解脱的禅修路径
  • Django【应用 01】django-plotly-dash安装及使用
  • 学硕热度下降,25西电数学与统计学院(考研录取情况)
  • Electron Forge【实战】阿里百炼大模型 —— AI 聊天
  • Flink checkpoint问题排查指南
  • 如何修复宝可梦时时刻刻冒险无法正常工作
  • CuML + Cudf (RAPIDS) 加速python数据分析脚本
  • 26考研 | 王道 | 数据结构笔记博客总结
  • Flink TaskManager详解
  • 力扣DAY68 | 热100 | 寻找两个正序数组的中位数
  • 使用npm install或cnpm install报错解决
  • 从 “制造” 到 “品牌”:官网建设助力中国企业突围东南亚
  • netcore8.0项目发布到centos,利用nginx反向代理(宝塔面板篇)
  • 【服务器操作指南】从 Hugging Face 上下载文件 | 从某一个网址上下载文件到 Linux 服务器的指定目录
  • STM32F103C8T6信息
  • 数据可视化平台产品介绍及功能特色
  • C 语言内存分配方法及优缺点
  • 第二部以“法典”命名的法律!生态环境法典编纂迈出“关键步”
  • 著名统计学家、北京工业大学应用数理学院首任院长王松桂逝世
  • ​王毅会见塔吉克斯坦外长穆赫里丁
  • 交警不在就闯红灯?上海公安用科技手段查处非机动车违法
  • 全国首例!上市公司董监高未履行公开增持承诺,投资者起诉获赔
  • 往事|学者罗继祖王贵忱仅有的一次相见及往来函札