接口幂等性
以支付业务为例,如何保证业务幂等性。
并发破坏幂等性,破坏了幂等性,所以要做的是:将查询和更改状态操作加锁,将并行操作更改为串行操作
- 乐观锁:通过版本号version进行判断
- 防重表:使用订单号 orderNo 做为去重表的唯一索引
- 分布式锁:setnx
- token机制:这种方式分成两个阶段:申请 Token 阶段和支付阶段。
- 第一阶段,在进入到提交订单页面之前,需要订单系统根据用户信息向支付系统发起一次申请 Token 的请求,支付系统将 Token 保存到 Redis 缓存中,为第二阶段支付使用。
- 第二阶段,订单系统拿着申请到的 Token 发起支付请求,支付系统会检查 Redis 中是否存在该 Token ,如果存在,表示第一次发起支付请求,删除缓存中 Token 后开始支付逻辑处理;如果缓存中不存在,表示非法请求。
- 消息队列异步执行:将订单的支付请求全部发送到消息队列中,然后使用异步任务处理队列中的数据,过滤掉重复的待支付订单,再进行支付流程。