幂等性
幂等性
什么是幂等性
- 数学中:幂等元素运行多次,还等于它原来的计算结果
- 系统中:同样的请求被执行一次与执行多次的效果是一样的
什么时候需要幂等性
- 重复提交、接口重试、重复消费
- 业务场景
HTTP 方法的幂等
GET
查询一次或者查询多次对数据不会有影响,是天然幂等的
DELETE
删除一次和删除多次的结果是一致的(在不考虑返回结果的情况下),也是幂等的
PUT
更新操作分为两种情况,直接更新数据是幂等的,对数据做累加操作不是幂等的
POST
每次调用接口都会创建数据,不是幂等的
如何保证幂等性
token
- 请求幂等接口前,调用获取 token 接口,获取 token 接口里主要做三件事(创建 token、缓存 token、返回 token)
- 页面将数据和 token 一起传给幂等接口,此接口判断 token 如果在缓存中,则删除 token 并执行业务,否则提示重复调用接口
后删除 token 带来的问题:业务已经执行成功,token 删除失败,有可能发生重复调用问题
先删除 token 带来的问题:token 删除成功,业务出现异常,这时候就需要前端配合重新获取新的 token
乐观锁
业务表添加额外字段版本号,调用更新接口的时候将该值带上,更新接口通过判断版本号来确定是否已经被更新过
分布式锁
将当前业务唯一标识做为 key 进行加锁(setNX),确保同一时间只有一个流程执行成功
状态机
在类似订单的业务中,通常会有多个状态的流转,在进行某些接口操作时,我们可以判断状态来确定订单是否重复操作