drf——接口幂等性,Restful接口的幂等性

摘要:
deletefromuserwhereuserid=1,多次操作,结果一样,具备幂等性三、如何保证幂等token机制1、服务端提供了发送token的接口。*唯一ID机制*调用者生成一个唯一ID四、Restful服务的接口幂等性设计对于HTTP请求的POST、GET、PUT和DELETE,按照HTTP方法的定义,PUT、GET和DELETE都是幂等的。影响以属于幂等的。
一、什么是幂等性
幂等性是系统服务对外一种承诺,承诺只要调用接口成功,外部多次调用对系统的影响是一致的。
声明为幂等的服务会认为外部调用失败是常态,并且失败之后必然会有重试。

post请求不是接口幂等性
put操作是接口幂等性

二、什么情况下需要幂等

以SQL为例:

SELECT col1 FROM tab1 WHER col2=2,无论执行多少次都不会改变状态,是天然的幂等。
UPDATE tab1 SET col1=1 WHERE col2=2,无论执行成功多少次状态都是一致的,因此也是幂等操作。
UPDATE tab1 SET col1=col1+1 WHERE col2=2,每次执行的结果都会发生变化,这种不是幂等的。
insert into user(userid,name) values(1,’a’) 如userid为唯一主键,即重复操作上面的业务,只会插入一条用户数据,具备幂等性。
如userid不是主键,可以重复,那上面业务多次操作,数据都会新增多条,不具备幂等性。
delete from user where userid=1,多次操作,结果一样,具备幂等性

三、如何保证幂等(实现方式)

token机制

1、服务端提供了发送token的接口。我们在分析业务的时候,哪些业务是存在幂等问题的,就必须在执行业务前,先去获取token,服务器会把token保存到redis中。

2、然后调用业务接口请求时,把token携带过去,一般放在请求头部。

3、服务器判断token是否存在redis中,存在表示第一次请求,然后删除token,继续执行业务。

4、如果判断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_id=2 and version = 1根据version版本,也就是在操作库存前先获取当前商品的version版本号,然后操作的时候带上此version号。
我们梳理下,我们第一次操作库存时,得到version为1,调用库存服务version变成了2;
但返回给订单服务出现了问题,订单服务又一次发起调用库存服务,当订单服务传如的version还是1,再执行上面的sql语句时,就不会执行;
因为version已经变为2了,where条件就不成立。这样就保证了不管调用几次,只会真正的处理一次。 乐观锁主要使用于处理读多写少的问题

唯一主键

这个机制是利用了数据库的主键唯一约束的特性,解决了在insert场景时幂等问题。但主键的要求不是自增的主键,这样就需要业务生成全局唯一的主键。

如果是分库分表场景下,路由规则要保证相同请求下,落地在同一个数据库和同一表中,要不然数据库主键约束就不起效果了,因为是不同的数据库和表主键不相关。

防重表

使用订单号orderNo做为去重表的唯一索引,把唯一索引插入去重表,再进行业务操作,且他们在同一个事务中。
这个保证了重复请求时,因为去重表有唯一约束,导致请求失败,避免了幂等问题。
这里要注意的是,去重表和业务表应该在同一库中,这样就保证了在同一个事务,即使业务操作失败了,也会把去重表的数据回滚。
这个很好的保证了数据一致性。

唯一ID

调用接口时,生成一个唯一id,redis将数据保存到集合中(去重),存在即处理过。

*唯一ID机制 *
调用者生成一个唯一ID
四、Restful服务的接口幂等性设计
对于HTTP请求的POST、GET、PUT和DELETE,按照HTTP方法的定义,PUT、GET和DELETE都是幂等的。

PUT:用于创建或者更新一个资源,如果资源存在就更新资源,如果资源不存在就创建资源。我们常用的方式为PUT /xxxx/id,指定了一个id,更新或者创建都是针对这个id的,
因此PUT属于幂等的。 GET:用于获取一个资源,这个方法无需过多解释,方法肯定属于幂等的。 DELETE:删除一个资源,删除资源是需要指定ID,例如:DELTE
/xxxx/id,这种方式删除一个资源执行多次结果是相同的。影响以属于幂等的。 POST:创建一个资源,提交请求中的实体到服务端,用于创建需要的资源。常用格式为POST /XXXX/Order,无需指定资源的ID。明显此方法属于非幂等的。 以上是按照HTTP方法的定义来说的,可能有人会说,我用的GET就不是幂等,你也可以这样用,协议没有限制不让这么做,这是一个非强制性契约。

免责声明:文章转载自《drf——接口幂等性,Restful接口的幂等性》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇家中路由添加静态IP映射(二)微信公众号菜单进入的页面切换第二次失效下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PHP开发api接口安全验证(转)

php的api接口 在实际工作中,使用PHP写api接口是经常做的,PHP写好接口后,前台就可以通过链接获取接口提供的数据,而返回的数据一般分为两种情况,xml和json,在这个过程中,服务器并不知道,请求的来源是什么,有可能是别人非法调用我们的接口,获取数据,因此就要使用安全验证。 验证原理 示意图 原理 从图中可以看得很清楚,前台想要调用接口,需要使用...

JAVA学习总结(四)

1.接口 interface 1.1语法:   修饰符 interface 接口名{     常量     都是抽象方法  } 修饰符:默认 | public接口名:自定义,规则与类名相同,一般I字母打头:wifi接口(Iwifi) //示例: public interface Iwifi{ int COUNT=1;...

USB3.0测试和使用说明

概述 AC6102上集成了一颗Cypress 推出的高性能USB3.0传输芯片CYUSB3014,Cypress称之为EZ-USBFX3。该芯片性能强劲,功能强大,接口简单,非常适合用于各种需要高速数据传输的场合,以下为摘自EZ-USBFX3数据手册中关于该芯片的介绍: 赛普拉斯EZ-USBFX3是新一代USB3.0外设控制器,具有高度集成的灵活特性,可帮...

细说RESTful API安全之认证授权

认证授权包含2个方面:(1)访问某个资源时必须携带用户身份信息,如:用户登录时返回用户access_token,访问资源时携带该参数。(2)检查用户是否具备访问当前资源(url或数据)的权限:访问资源时检查用户权限。 在REST架构中,access_token被定义为用户身份标识,用于对资源访问授权,只允许系统合法用户访问资源。具体来说:- 必须在每次访...

【Vue后台管理二】vue-admin-template 对接后端API JWT认证

初始化对接端台API 上一篇了完成了项目初始化,但是那个只是把 vue-admin-template 模版简单的初始化了一下,新增了tagsview标签快捷导航栏,其他的没什么变化。 这一篇了就完成了和后端的Jwt token认证,登录,退出,基本的table list接口数据请求。首先看看效果。 其实看起来和第一篇的初始化效果差不多,唯一的区别是,第一篇...

Go-接口

接口类型 在Go语言中接口(interface)是一种类型,一种抽象的类型。 interface是一组method的集合,是duck-type programming的一种体现。接口做的事情就像是定义一个协议(规则),只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。 为了保护你的Go语言职业生涯,请牢记接口(in...