0%

接口幂等性

什么是幂等性?

  • 幂等性:f(f(x)) = f(x)
  • 幂等元素运行多次,还等于它原来的运算结果
  • 在系统中,一个接口运行多次,与运行一次的效果是一致的

什么情况下需要把接口设计为幂等性?

  • 重复提交、接口重试、前段操作抖动等

  • 业务场景:用户多次点击提交订单,后台应只生成一个订单

  • 业务场景:支付时,由于网络问题重发,应该只扣一次钱

  • 并不是所有的接口都要求幂等性,要根据业务而定

保证幂等性的策略有哪些?

  • 幂等性的核心思想:通过唯一的业务单号保证幂等,

    如果有唯一的业务单号,可以使用分布式锁,

    如果没有唯一的业务单号,可以通过Token保证幂等。

  • 常见的两种实现方案:

    1. 通过代码逻辑判断实现:只能针对一些满足判断的逻辑实现,具有一定局限性

    2. 使用token机制实现:通用型较强

      token机制实现步骤:

      1. 生成全局唯一的token,token放到redis或jvm内存,token会在页面跳转时获取.存放到pageScope中,支付请求提交先获取token
      2. 提交后后台校验token,执行提交逻辑,提交成功同时删除token,生成新的token更新redis ,这样当第一次提交后token更新了,页面再次提交携带的token是已删除的token后台验证会失败不让提交

      **token特点**: 要申请,一次有效性,可以限流

      注意: redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用