欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > 【设计】接口幂等性设计

【设计】接口幂等性设计

2025/4/27 3:25:18 来源:https://blog.csdn.net/qq_45722630/article/details/147521914  浏览:    关键词:【设计】接口幂等性设计

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;

参考:草捏子

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词