首页 > Web开发 > 详细

http请求引发的幂等问题讨论

时间:2020-06-28 21:54:58      阅读:112      评论:0      收藏:0      [点我收藏+]

问题起因:组内同时对一同学的cr中有一个评论,需要把根据id获取数据这样的接口由POST改成GET,的确是该这样,但是大佬的评论是POST是非幂等,而现在的请求的幂等的。。。


  云里雾里,主要是因为,我压根就不记得幂等到底是啥意思了,果断去百度了下防止丢人。

 下面摘一个介绍:

HTTP协议涉及到的一种重要性质:幂等性(Idempotence)。在HTTP/1.1规范中幂等性的定义是:
Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.
从定义上看,HTTP方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。
幂等性属于语义范畴,正如编译器只能帮助检查语法错误一样,HTTP规范也没有办法通过消息格式等语法手段来定义它,这可能是它不太受到重视的原因之一。
但实际上,幂等性是分布式系统设计中十分重要的概念,而HTTP的分布式本质也决定了它在HTTP中具有重要地位。

幂等操作

特点

       任意多次执行所产生的影响均与一次执行的影响相同。

       不会影响系统状态,也不用担心重复执行会对系统造成改变。

举例

      HTTP请求中的GET,HEAD,PUT和DELETE方法都有这样的幂等属性(POST不是)

解释一下为什么PUT操作是幂等的,而POST不是.
假设原有资源为A

  • 执行一次PUT,将A变成了B,后面不管执行多少次相同的PUT,资源还是B。因为PUT主要是更新资源。
  • 执行一次POST,将A变成B,后面即使每执行的都是相同的POST,依然会在此创建资源B。因为POST是创建资源。


总结

协议都是人定的。只要客户端和服务器能彼此认同,就能工作。在常规的情况下,用符合规范的方式去实现系统可以减少很多工作量——大家都约定好了,就不要折腾了。但是,总会有一些情况用常规规范不合适,不满足需求。这时思路也不能被规范限制死,更不要死抠RFC。这些规范也许不能处理你遇到的特殊问题。比如:

  • Elastic Search的_search接口使用GET,却用body来表达查询,因为查询很复杂,用querystring很麻烦,必须用json格式才舒服,在请求体用json编码更加容易,不用折腾percent encoding。
  • 用POST写一个接口下单时可能也要考虑幂等,因为前端可能实现“下单按键”有bug,造成用户一次点击发出N个请求。你不能说因为POST by design应该是不幂等就不管了。

协议是死的,人是活的。遇到实际的问题时灵活的运用手上的工具满足需求就好。


胡扯

突然想起了前段时间,听了一个DTS(数据传输服务)的讲座,讲座的同学讲: redis的DTS是存在数据不一致问题的,比如数据由redis集群 A 同步到集群B, A的操作记录在同步到B的时候,A未收到反馈,这时候就存在两种情况,1是A没发出去,2是A发出去B处理成功了,但是因为网络问题A没收到,这时候A只能重新发送刚才的操作命令,如果是incr命令,且是因为原因2引起的重试,这时候就相当于同一个key被incr了两次,这就是所谓的不幂等了。



 
参考:
链接:https://www.jianshu.com/p/698300d0af82
链接:https://www.jianshu.com/p/234cf2e96832
链接:https://www.zhihu.com/question/28586791/answer/767316172

http请求引发的幂等问题讨论

原文:https://www.cnblogs.com/liuyong18/p/13204955.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!