Skip to content

api接口幂等

什么是幂等

多次调用同一方法或者接口不会改变业务状态,可以保证重复调用的结果和单次调用的结果一致。

接口幂等能解决什么问题

  • 前端重复提交
  • 接口超时重试
  • 消息重复消费

解决方案

  • token机制:
    • 客户端从服务端获取token,然后发送指定请求,服务端将生成的token放入redis
    • 客户端携带token去做业务请求,服务端判断token是否在redis中,不在则拒绝,在则删除token(或者给打个标识),并进行业务处理
    • 该token是全局唯一的,可以使用一个全局的id生成服务来生成(snowflake算法的一个变种)
  • 基于mysql的实现
    • 利用mysql的唯一索引,只有在负载比较小的情况下,才合适
    • mysql的悲观锁 `select * from xxx where id = ‘xx’ for update; 需要注意使用主键或者唯一索引,否则锁表。
    • mysql的乐观锁 ,基于版本号,如update xxx set xx=xxxx, version=version+1 where version=#version#;或者条件,如update table_xx set x = xxx+a where x = xxx;
  • 基于redis的setnx
    • 如果设置成功,说明是第一次设置,如果失败,说明已经设置过了,直接返回相关信息。
  • 状态机幂等
    • 订单号绑定状态,放redis中,状态只能有序地向下个状态走;
  • 对外暴露的接口
    • 来源source+ 来源唯一序列号,每次处理前先查询下是否处理过该笔业务。可以是redis,也可以是数据库。数据库做唯一索引,多一层保障。

Published inapi

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *