什么是幂等性
幂等性是数学的一个概念,表示进行1次变换和进行N次变换产生的效果相同。
接口的幂等性:以相同的请求调用这个接口一次和调用这个接口多次,对系统产生的影响相同。
什么情况需要幂等
以相同的请求调用这个接口一次或者多次,需要给调用方返回一致的结果时,需要考虑将这个接口设计成幂等接口
实现幂等的方案
1、来源加序列号
如果是一个幂等接口,将source和seq字段,(或者是一个uuid)组成联合主键去数据库表中或者是redis中查询,如果没有查询到,说明没有处理过这个请求,然后正常处理就行。处理完了之后将结果和source字段和seq字段一并存在数据库和redis中。根据source和seq能查询到,说明这个请求已经处理了,直接返回结果就行。
2、唯一索引(唯一字段)
此方案适合新增操作。
比如新增用户接口。将用户表中的身份证字段加上唯一索引。当同一个请求调用两次时,我们可以先根据身份证字段查询下用户是不是存在,不存在的话再新增。存在的话就返回新增失败。或者直接新增也是可以的,数据库直接抛出异常,对异常处理放回前端
3、乐观锁
此方案适合更新操作。
乐观锁只有在更新数据的那一刻才会加锁,其他时间不加锁。通常数据库实现乐观锁的方式是增加一个时间戳字段。
4、token机制
通过 Token 的机制实现防止重复提交
1、服务端提供了发送token的接口。我们在分析业务的时候,哪些业务是存在幂等问题的,就必须在执行业务前,先去获取token,服务器会把token保存到redis中。(微服务肯定是分布式了,如果单机就适用jvm缓存)。
2、然后调用业务接口请求时,把token携带过去,一般放在请求头部。
3、服务器判断token是否存在redis中,存在表示第一次请求,这时把redis中的token删除,继续执行业务。
4、如果判断token不存在redis中,就表示是重复操作,直接返回重复标记给client,这样就保证了业务代码,不被重复执行。