什么是幂等性?
- 幂等性:f(f(x)) = f(x)
- 幂等元素运行多次,还等于它原来的运算结果
- 在系统中,一个接口运行多次,与运行一次的效果是一致的
什么情况下需要把接口设计为幂等性?
重复提交、接口重试、前段操作抖动等
业务场景:用户多次点击提交订单,后台应只生成一个订单
业务场景:支付时,由于网络问题重发,应该只扣一次钱
并不是所有的接口都要求幂等性,要根据业务而定
保证幂等性的策略有哪些?
幂等性的核心思想:通过唯一的业务单号保证幂等,
如果有唯一的业务单号,可以使用分布式锁,
如果没有唯一的业务单号,可以通过Token保证幂等。
常见的两种实现方案:
通过代码逻辑判断实现:只能针对一些满足判断的逻辑实现,具有一定局限性
使用token机制实现:通用型较强
token机制实现步骤:
- 生成全局唯一的token,token放到redis或jvm内存,token会在页面跳转时获取.存放到pageScope中,支付请求提交先获取token
- 提交后后台校验token,执行提交逻辑,提交成功同时删除token,生成新的token更新redis ,这样当第一次提交后token更新了,页面再次提交携带的token是已删除的token后台验证会失败不让提交
**token特点**: 要申请,一次有效性,可以限流
注意: redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用