如何保证接口幂等性

接口幂等性:发生一次接口调用与发生多次接口调用的接口消息都能得到与预期相符的结果


问题提出:为了提高通讯可靠性,通信框架/MQ可能会向数据服务推送多次相同的消息

//PUT https://xxx.com/employee/salary
//{"id":"1","add_salary":1000}
//查询员工1的信息
Employee employee = dao.selectById("1");
//更新员工薪水信息
employee.setSalary(employee.getSalary()+1000);
//更新员工信息
dao.putdate(employee);

存在问题:上面接口逻辑,每重发一次员工1的薪水就会加1000,破坏了接口的幂等性


解决方案

  • 代码增加前置判断(可根据调薪时间判断是否调薪)

      if(!员工已调薪){
      调薪
      }
    

    不足:需要保证幂等性的接口过多,增加开发人员开发难度。无法保证开发人员都能考虑的设计接口的幂等性。
    优点:接口个性定制化高。

  • 幂等表


    幂等.png
  • token+redis
    1.1 获取全局唯一token
    接口处理生成唯一标识(token) 存储到redis中,并返回给调用客户端。
    1.2 发起调薪操作并附带token
    接口处理:
    1.2.1 获得分布式锁(处理并发情况)
    1.2.2 判断redis中是否存在token(使用删判断)
    1.2.3 存在 执行业务逻辑,否则返回已经调薪
    1.2.4 释放分布式锁

  • CAS

     update employee set salary = #{salary} ,status = 1 where status =0 and id = “1”
    //status = 0 待调薪 status = 1 已调薪  
    

    对于需要可逆场景 如调薪场景,需要额外设计定时任务获取前端接口进行status转变
    如果是不可逆场景,如支付后订单状态。不许要额外处理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容