高并发下我们如何去保证接口的幂等性?
首先普及下幂等的概念
“在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数”
那么在我们的实际业务场景中幂等是一个非常高频的场景,比如:
- 电商场景中用户因网络问题多次点击导致重复下单问题
- MQ消息队列的重复消费
- RPC中的超时重试机制
- 等等
那么我们有那些方案可以解决我们的幂等性问题呢?
- 数据库唯一主键实现幂等性
-
- 其实现方式是使用分布式ID充当主键,不使用MySQL中的自增主键
- 乐观锁实现幂等性
-
- 在表中增加版本号标识,只有版本号标识一直才更新成功
- 分布式锁
-
- 简单来说就是分布式的排他锁,但是我们可以控制锁的粒度以提高程序的执行性能
- 获取token
-
- 服务端提供获取 Token 的接口,请求前客户端调用接口获取 Token
- 然后将该串存入 redis 数据库中,以该 Token 作为 Redis 的键(注意设置过期时间)。
- 将 Token 返回到客户端,在执行业务请求带上该 Token
- 服务端接收到请求后根据 Token 到 Redis 中查找该 key 是否存在(注意原子性),
- 如果存在就将该 key 删除,然后正常执行业务逻辑。如果不存在就抛异常,返回重复提交的错误信息。