1. 什么是幂等性

  • 数学中:幂等元素运行多次,还等于它原来的计算结果,即 f(f(x)) = f(x)
  • 系统中:同样的请求被执行一次与执行多次的效果是一样的

2. 什么时候需要幂等性

  • 重复提交、接口重试、重复消费
  • 业务场景

3. HTTP 方法的幂等

3.1 GET

查询一次或者查询多次对数据不会有影响,是天然幂等的

3.2 DELETE

删除一次和删除多次的结果是一致的(在不考虑返回结果的情况下),也是幂等的

3.3 PUT

更新操作分为两种情况,直接更新数据是幂等的,对数据做累加操作不是幂等的

3.4 POST

每次调用接口都会创建数据,不是幂等的

4. 如何保证幂等性

4.1 token
  1. 请求幂等接口前,调用获取 token 接口,获取 token 接口里主要做三件事,创建 toekn、缓存 token、返回 token
  2. 页面将数据和 token 一起传给幂等接口,此接口判断 token 如果在缓存中,则删除 token 并执行业务,否则提示重复调用接口

后删除 token 带来的问题:业务已经执行成功,token 删除失败,有可能发生重复调用问题
先删除 token 带来的问题:token 删除成功,业务出现异常,这时候就需要前端配合重新获取新的 token

4.2 乐观锁

业务表添加额外字段版本号,调用更新接口的时候将该值带上,更新接口通过判断版本号来确定是否已经被更新过

4.2 分布式锁

将当前业务唯一标识做为 key 进行加锁,确保同一时间只有一个流程执行成功

4.3 状态机

在类似订单的业务中,通常会有多个状态的流转,在进行某些接口操作时,我们可以判断状态来确定订单是否重复操作

Q.E.D.


盛年不重来,一日难再晨。