【17 > 分布式接口幂等性】1. 概述与接口重试的问题
一、本章概述
- 什么是幂等性
- 幂等性设计的 核心思想
- select、updates、delete、insert 和 混合操作 的接口幂等性
二、接口幂等性
- 提交订单按钮 如何防止重复提交?
- 表单录入页 如何防止重复提交?
- 微服务接口,客户端重试时,会对业务数据产生影响吗?
2.1 定义
- 幂等性: f(f(x)) = f(x)
- 幂等元素运行多次,还等于它原来的运算结果
- 在系统中,一个接口运行多次,与运行一次的效果是一致 的
2.2 运用场景
- 什么情况下需要幂等性
- 重复提交、接口重试、前端操作抖动 等
- 业务场景 : 用户多次点击提交订单,后台应只生成一个订单
- 业务场景 : 支付时,由于网络问题重发,应该只扣一次钱
并不是所有的接口都要求幂等性,要根据业务而定
2.3 保证幂等性的策略有哪些?
幂等性的核心思想:通过唯一的业务单号保证幂等
2.4 如何实现
- 非并发情况下,查询业务单号有没有操作过,没有则执行操作
- 并发的情况下,整个操作过程加锁 (分布式锁)
2.5 如何操作
CRUD | 描述 | 操作 |
Select | 不会对业务数据有影响,天然幂等 | 无 |
Delete | 第一次已经删除,第二次也不会有影响 | 无 |
Update | 更新操作传入数据版本号(唯一业务单号) | 通过乐观锁实现幂等性 |
Insert | 此时没有唯一业务单号 | 使用Token保证寡等 |
混合 | 找到操作的 唯一业务单号 | 有:则可使用分布式锁 没有:可以通过Token保证幂等 |