一、什么是幂等性
幂等是一个数学与计算机概念,在数学中某一元预算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。
在计算机中,一个幂等操作的特点是其任意执行多次执行产生的影响均与执行一次产生的影响相同。幂等函数或者幂等方法是指可以使用相同的参数重复执行,并能获得相同结果的函数和方法。
二、接口幂等性
在HTTP/1.1中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外),即第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。
三、为什么需要实现幂等性
1.防止客户端表单重提交:客户填写表单信息提交后,可能由于网络延迟等原因,未及时给客户提出成功响应,导致客户认为没有提交成功,然后一直点提交按钮,这时就会产生重复提交表单请求。
2.用户恶意刷单:如投票,明确一人一天只能投1票,若不做幂等校验,可能会收到客户重复提交的投票信息。
3.接口超时重试:现在大多数后台都是基于springcloud搭建的微服务建构,服务端与服务端之间的调用,可能有超时,失败等重试机制,也有可能存在多次请求,造成数据重复问题。
4.mq重复消费:在消费mq时,可能发生重复消费等问题。
四、引入幂等性校验后会产生什么影响
1.增加服务端业务处理的复杂性
五、如何实现幂等性
1.数据库唯一性主键
利用数据库唯一性索引保证数据插入或者删除时的幂等性
适用场景: 新增数据、删除数据
流程:
流程细节:
(1)外部在页面发起填写表单的请求
(2) 客户端发起获取分布式唯一id请求,分布式唯一Id可以是“雪花算法”,“美团leaf区域Id”,redis自增id。
(3)客户端填写表单数据发起请求时,带上分布式唯一性id
(4)后台新增数据时,数据库做主键id唯一性校验。
2.利用乐观锁
在数据表字段新增version字段,修改数据时带上version条件。
适用场景:更新操作
3.防重token令牌
方法描述: 客户端发起请求前,先调用服务端获取token令牌接口,服务端将token令牌作为key存于redis,客户端发起真正发起请求时带上token令牌,服务端拿到token令牌去redis做删除,若能删除成功表示是第一次提交,若删除失败(已被删除)则表示不是第一次提交。
适用场景:新增数据、修改数据、删除数据
流程描述