河北省建设执业注册中心网站,服务公司取名最好的名字,博客移植wordpress,wordpress报价如何保证接口的幂等性
什么是幂等性
幂等性是系统服务对外一种承诺#xff0c;承诺只要调用接口成功#xff0c;外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态#xff0c;并且失败之后必然会有重试。
通俗地说#xff0c;接口幂等性就是…如何保证接口的幂等性
什么是幂等性
幂等性是系统服务对外一种承诺承诺只要调用接口成功外部多次调用对系统的影响是一致的。声明为幂等的服务会认为外部调用失败是常态并且失败之后必然会有重试。
通俗地说接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的不会因为多次点击而产生了副作用。
举个最简单的例子那就是支付用户购买商品后支付支付扣款成功但是返回结果的时候网络异常此时钱已经扣了用户再次点击按钮此时会进行第二次扣款返回结果成功用户查询余额返发现多扣钱了流水记录也变成了两条这就没有保证接口的幂等性
什么情况下需要幂等
以SQL为例子
SQL分析是否幂等SELECT col1 FROM tab1 WHER col22无论执行多少次都不会改变状态是UPDATE tab1 SET col11 WHERE col22无论执行成功多少次状态都是一致的是UPDATE tab1 SET col1col11 WHERE col22每次执行的结果都会发生变化否INSERT INTO USER(userid,name) VALUES(1,a)如userid为唯一主键即重复操作上面的业务只会插入一条用户数据是同上如userid不是主键可以重复那上面业务多次操作数据都会新增多条否DELETE FROM user WHERE userid1多次操作结果一样是
如何保证幂等
token机制
服务端提供了发送token的接口。我们在分析业务的时候哪些业务是存在幂等问题的就必须在执行业务前先去获取token服务器会把token保存到redis中。然后调用业务接口请求时把token携带过去一般放在请求头部。服务器判断token是否存在redis中存在表示第一次请求然后删除token继续执行业务。如果判断token不存在redis中就表示是重复操作直接返回重复标记给client这样就保证了业务代码不被重复执行。 关键点先删除token还是后删除token
后删除token如果进行业务处理成功后删除redis中的token失败了这样就导致了有可能会发生重复请求因为token没有被删除。这个问题其实是数据库和缓存redis数据不一致问题。
先删除token如果系统出现问题导致业务处理出现异常业务处理没有成功接口调用方也没有获取到明确的结果然后进行重试但token已经删除掉了服务端判断token不存在认为是重复请求就直接返回了无法进行业务处理了。
先删除token可以保证不会因为重复请求业务数据出现问题。出现业务异常可以让调用方配合处理一下重新获取新的token再次由业务调用方发起重试请求就ok了。 token机制缺点
业务请求每次请求都会有额外的请求一次获取token请求、判断token是否存在的业务也就是额外的花销。在真实的生产环境中1万请求也就10个左右的请求会发生重试为了这10个请求我们让9990个请求都发生了额外的请求。
乐观锁机制
这种方法适合在更新的场景中
update t_goods set count count -1 , version version 1 where good_id2 and version 1根据version版本也就是在操作库存前先获取当前商品的version版本号然后操作的时候带上此version号。
我们梳理下我们第一次操作库存时得到version为1调用库存服务version变成了2但返回给订单服务出现了问题订单服务又一次发起调用库存服务当订单服务传如的version还是1再执行上面的sql语句时就不会执行因为version已经变为2了where条件就不成立。这样就保证了不管调用几次只会真正的处理一次。
乐观锁主要使用于处理读多写少的问题。
唯一主键
这个机制是利用了数据库的主键唯一约束的特性解决了在insert场景时幂等问题。但主键的要求不是自增的主键这样就需要业务生成全局唯一的主键。
如果是分库分表场景下路由规则要保证相同请求下落地在同一个数据库和同一表中要不然数据库主键约束就不起效果了因为是不同的数据库和表主键不相关。
防重表唯一索引
使用订单号orderNo做为去重表的唯一索引把唯一索引插入去重表再进行业务操作且他们在同一个事务中。这个保证了重复请求时因为去重表有唯一约束导致请求失败避免了幂等问题。这里要注意的是去重表和业务表应该在同一库中这样就保证了在同一个事务即使业务操作失败了也会把去重表的数据回滚。这个很好的保证了数据一致性。
唯一缓存ID
调用接口时生成一个唯一缓存IDredis将数据保存到集合中去重存在即处理过。
参考资料
如何保证接口的幂等性接口的幂等性如何保证