系统幂等性设计与实践
一、幂等性的定义
就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了错误。
二、确定需要幂等性的范围
2.1. 确定大范围
1.请求层面:读请求、写请求
其中读请求没有影响数据变化不需要做幂等性
2.微服务层面:负载均衡、api网关、业务逻辑层、数据访问层
其中负载均衡、api网关、业务逻辑层没有影响数据变化不需要做幂等性
2.2. 数据访问层-写请求
1.Insert
需要做幂等性
2.Update
直接更新某个值的:不需要做幂等性
累加操作等计算式的更新:需要做幂等性
3.Delete
重复删除结果是一样:不需要做幂等性
三、幂等性解决方案
没有最优的方案只有最适合的
3.1. Insert幂等方案
1.数据字段增加唯一索引
优点:实现简单方便
缺点:影响数据库性能不适合该字段会被频繁更新的场景,唯一索引比普通索引在写操作上开销会大很多
2.insert时使用临时表查询判断
优点:不需要创建唯一索引,语法相对通用(mysql和oracle)
缺点:写操作会增加一次select子查询开销,增加sql语法的复杂度可读性较差
3.2. Update计算操作幂等方案
这个需要结合具体业务来设计方案,常用的场景可通过版本号的方式来控制
在表里面添加version字段
然后更新的时候通过这个version来判断是否为过期无效操作,这是乐观锁的一种思路