什么是幂等性?
- 在数学中:
某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。例如,高斯符号便是幂等的,即f(f(x)) = f(x)。 - http:
HTTP的幂等性指的是一次和多次请求某一个资源应该具有相同的副作用。
HTTP中支持幂等的接口:
在HTTP规范中定义GET、PUT和DELETE方法应该具有幂等性。
- GET:GET方法是向服务器查询,不会对系统产生副作用,具有幂等性(不代表每次请求都是相同的结果)。
- PUT:PUT方法首先判断系统中是否有相关的记录,如果有记录则更新该记录,如果没有则新增记录。
- DELETE:删除服务器上的相关记录。
分布式系统下接口的幂等性
请求重复的原因:
一般是由于重复点击、网络重发、nginx重发等导致数据重复提交。
分布式锁:
在执行某段流程之前,根据某个标志(如:id等)获取分布式锁,保证了同一时间该流程只有一个能被执行。
token机制:
- 客户端在请求接口之前先向服务端申请token,token存放到redis中(单次有效),并设置有效时间。
- 客户端带着token去请求接口,后端对token进行校验。
- 服务端对token需要使用 delete 操作进行校验,使用 select + delete 会存在并发问题。
唯一索引:
在数据库层面,对相应字段加唯一索引,防止数据重复插入。