怎么理解幂等性

理解要点

幂等性是系统的接口对外一种承诺(而不是实现), 承诺只要调用接口成功,

外部多次调用对系统的影响是一致的

. 声明为幂等的接口会认为外部调用失败是常态, 并且

失败之后必然会有重试.


声明为幂等性的API,多次调用后对调用资源产生影响或作用结果和一次调用产生的结果是相同的,幂等性API强调安全,不会因为多次的重复调用对系统资源产生错误的操作,正在金融业务中尤为重要。


HTTP幂等方法,是指无论调用多少次都不会有不同结果的 HTTP 方法。不管你调用一次,还是调用一百次,一千次,结果都是相同的。

还是以之前的博文的例子为例。

 
  1. GET /tickets # 获取ticket列表
  2. GET /tickets/12 # 查看某个具体的ticket
  3. POST /tickets # 新建一个ticket
  4. PUT /tickets/12 # 更新ticket 12
  5. PATCH /tickets/12 # 更新ticket 12
  6. DELETE /tickets/12 # 删除ticekt 12

HTTP GET方法

HTTP GET方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。

 
  1. GET /tickets # 获取ticket列表
  2. GET /tickets/12 # 查看某个具体的ticket

只是查询数据,不会影响到资源的变化,因此我们认为它幂等。

值得注意,幂等性指的是作用于结果而非资源本身。怎么理解呢?例如,这个HTTP GET方法可能会每次得到不同的返回内容,但并不影响资源。

可能你会问有这种情况么?当然有咯。例如,我们有一个接口获取当前时间,我们就应该设计成

 
  1. GET /service_time # 获取服务器当前时间

它本身不会对资源本身产生影响,因此满足幂等性。

HTTP POST方法

HTTP POST方法是一个非幂等方法,因为调用多次,都将产生新的资源。

 
  1. POST /tickets # 新建一个ticket

因为它会对资源本身产生影响,每次调用都会有新的资源产生,因此不满足幂等性。

HTTP PUT方法

HTTP PUT方法是不是幂等的呢?我们来看下

 
  1. PUT /tickets/12 # 更新ticket 12

因为它直接把实体部分的数据替换到服务器的资源,我们多次调用它,只会产生一次影响,但是有相同结果的 HTTP 方法,所以满足幂等性。

HTTP PATCH方法

HTTP PATCH方法是非幂等的。HTTP POST方法和HTTP PUT方法可能比较好理解,但是HTTP PATCH方法只是更新部分资源,怎么是非幂等的呢?

因为,PATCH提供的实体则需要根据程序或其它协议的定义,解析后在服务器上执行,以此来修改服务器上的资源。换句话说,PATCH请求是会执行某个程序的,如果重复提交,程序可能执行多次,对服务器上的资源就可能造成额外的影响,这就可以解释它为什么是非幂等的了。

可能你还不能理解这点。我们举个例子

 
  1. PATCH /tickets/12 # 更新ticket 12

此时,我们服务端对方法的处理是,当调用一次方法,更新部分字段,将这条ticket记录的操作记录加一,这次,每次调用的资源是不是变了呢,所以它是有可能是非幂等的操作。

HTTP DELETE方法

HTTP DELETE方法用于删除资源,会将资源删除。

 
  1. DELETE /tickets/12 # 删除ticekt 12

调用一次和多次对资源产生影响是相同的,所以也满足幂等性。

如何设计符合幂等性的高质量RESTful API

HTTP GET方法 vs HTTP POST方法

也许,你会想起一个面试题。HTTP请求的GET与POST方式有什么区别?你可能会回答到:GET方式通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。但是,我们现在从RESTful的资源角度来看待问题,HTTP GET方法是幂等的,所以它适合作为查询操作,HTTP POST方法是非幂等的,所以用来表示新增操作。

但是,也有例外,我们有的时候可能需要把查询方法改造成HTTP POST方法。比如,超长(1k)的GET URL使用POST方法来替代,因为GET受到URL长度的限制。虽然,它不符合幂等性,但是它是一种折中的方案。

HTTP POST方法 vs HTTP PUT方法

对于HTTP POST方法和TTP PUT方法,我们一般的理解是POST表示创建资源,PUT表示更新资源。当然,这个是正确的理解。

但是,实际上,两个方法都用于创建资源,更为本质的差别是在幂等性。HTTP POST方法是非幂等,所以用来表示创建资源,HTTP PUT方法是幂等的,因此表示更新资源更加贴切。

HTTP PUT方法 vs HTTP PATCH方法

此时,你看会有另外一个问题。HTTP PUT方法和HTTP PATCH方法,都是用来表述更新资源,它们之间有什么区别呢?我们一般的理解是PUT表示更新全部资源,PATCH表示更新部分资源。首先,这个是我们遵守的第一准则。根据上面的描述,PATCH方法是非幂等的,因此我们在设计我们服务端的RESTful API的时候,也需要考虑。如果,我们想要明确的告诉调用者我们的资源是幂等的,我的设计更倾向于使用 HTTP PUT 方法。

    (完)
=

怎么理解幂等性[或者http幂等性]相关推荐

  1. 线上故障之-redis锁处理幂等性失效和幂等性问题解决方案

    线上故障之-redis锁处理幂等性失效和幂等性问题解决方案 redis锁处理幂等性失效 事务传播bug try bug 幂等性设计方法 1. insert前先select 2. 加悲观锁 3. 加乐观 ...

  2. 深入理解分布式技术 - 消息幂等性如何保障不重复消费

    文章目录 概述 如何理解幂等 各类中间件对幂等性的处理 远程服务调用的幂等问题 消息消费中的重试问题 消息投递的几种语义 At most once At least once Exactly once ...

  3. 深入浅出业务幂等性---1、幂等性介绍与接口幂等

    微服务与幂等性 随着应用架构由单体架构到微服务架构进行演变,现如今市面上超过50%的应用都会基于分布式或微服务完成系统架构设计.在微服务架构体系内,就会存在若干个微服务,这些服务可能基于RPC或者HT ...

  4. 关于幂等性的解释和理解

    关于幂等性的解释 幂等性(idempotent.idempotence):幂等是一个数学与计算机学概念,常见于抽象代数中.在编程中一个幂等操作的特点是执行多次或1次,其影响是相同的. 核心描述就是说: ...

  5. SpringBoot 接口幂等性的实现方案

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:超级小豆丁 http://www.mydlq.clu ...

  6. SpringBoot接口幂等性实现的4种方案!

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达今日推荐:分享一套基于SpringBoot和Vue的企业级中后台开源项目,这个项目有点哇塞!个人原创100W +访问量博客:点 ...

  7. 转:聊聊开发中幂等性问题(*)

    [README] 这是一篇非常棒的, 讲解幂等性问题的post, 感谢原文作者: 转自: https://juejin.cn/post/6844903815552958477 幂等 (idempote ...

  8. 幂等性问题和解决方法

    在实际的开发项目中,一个对外暴露的接口往往会面临很多次请求.这就需要考虑到一个幂等性问题. 幂等性 幂等性的概念是:任意多次执行所产生的影响均与一次执行的影响相同,即无论你请求了多少次,对数据库的影响 ...

  9. kafka幂等性实现

    kafka幂等性实现 1.原理阶段 在 0.11.0.0 之前的版本中, 如果 producer 没有收到表明消息已经被提交的响应, 那么 producer 除了将消息重传之外别无选择,这里提供的是a ...

最新文章

  1. Grafana 7.0 发布:改进的界面、新的插件平台和可视化等
  2. 【BZOJ】4032: [HEOI2015]最短不公共子串(LibreOJ #2123)
  3. 避免在WHERE条件中,在索引列上进行计算或使用函数,因为这将导致索引不被使用...
  4. GRE作文用AI打分,已经20周年了:AI给中国考生的分数,远高于人类打分
  5. Java 8中HashMap冲突解决
  6. 基于wifi的单片机无线通信研究_SKYLAB:智能家居无线协议WiFi/BLE/Zigbee介绍与对比...
  7. PyQt5 技术篇-设置QComboBox下拉框默认值,获取下拉框当前选择的内容
  8. VNC over reverse SSH
  9. 封属于旋转轴密封件吗_氧化铝95瓷属于普通型的一种吗?
  10. 金蝶云系统显示服务器离线,金蝶云服务器已离线是什么情况
  11. Spring Cloud 个人心得 理论
  12. How to shrink disk for KVM
  13. 通信原理及系统系列3—— 基于卷积编码的2ASK通信系统设计(非相干解调)
  14. VS2015安装包-下载
  15. 高中数学一轮复习逆袭必要学习方法
  16. 租的房子里有无线路由器有ip和dns服务器无密码可以联网吗,没网怎么设置路由器?...
  17. 宝塔php安全模式,windows server 2016关闭IE增强安全模式方法
  18. 如何在局域网下建立共享文件夹?
  19. ArcGIS API for JavaScript 4.2学习笔记[10] 2D添加指北针widget、视图保存、视图padding(第二章完结)...
  20. 职业生涯规划jd网上商城

热门文章

  1. 使用pgpool-ii 搭建postgresql 高可用、负载均衡架构
  2. check(check out)
  3. 2009奥巴马的秋季开学演讲稿
  4. VC学习资料收集(12):VC小知识总结
  5. 阿里云的云服务器ECS和云虚拟主机有何区别?
  6. 【编译原理】 实验二:词法分析器的手动实现(基于状态机的词法分析器)
  7. 一流国企与外企的待遇比较
  8. Sketch 56 中文版发布 最佳产品原型设计工具
  9. 为什么要学习人工智能,人工智能热招的岗位有哪些,工资和学历有哪些关系?
  10. 工欲善其事,必先利其器之—利用网上在线工具—多个地点Ping服务器以检测服务器响应情况