`

了解一下幂等

阅读更多
google了一些中文的资料, 基本了解了幂等是怎么回事儿. 备忘一下.

PUT,DELETE操作是幂等的。所谓幂等是指不管进行多少次操作,结果都一样。比如我用PUT修改一篇文章,然后在做同样的操作,每次操作后的结果并没有不同,DELETE也是一样。顺便说一句,因为GET操作是安全的,所以它自然也是幂等的。

POST操作既不是安全的,也不是幂等的,比如常见的POST重复加载问题:当我们多次发出同样的POST请求后,其结果是创建出了若干的资源。

安全和幂等的意义在于:当操作没有达到预期的目标时,我们可以不停的重试,而不会对资源产生副作用。从这个意义上说,POST操作往往是有害的,但很多时候我们还是不得不使用它。

还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。

一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等操作对于代理和缓存来说具有“友好性”,因为幂等操作的额外执行不会对二者产生危害性后果(除了带宽浪费)。
PUT方法是幂等的,幂等性意味着对于一个成功执行的请求,不管其执行多少次,其结果都是一致的。也就是说,只要你愿意,你可以用PUT方法对 Hotel资源进行任意次更新,其结果都一样。如果两个PUT方法同时发生,那么只有其中之一会赢得最后的胜利并决定资源的最终状态。删除操作也是幂等的,如果一个PUT方法和DELETE方法同时发生,那么资源或者被更新,或者被删除,而不可能停留在某个中间状态。

如果你不确定是PUT还是DELETE被成功执行,并且没有得到状态码409 (Conflict)或者 417 (Expectation Failed)的话,那么就重新执行一遍。而不需要附加的可靠性协议来避免重复请求,因为通常重复的请求不会有任何影响。

上述描述对于POST方法就不适用了,因为POST方法不是幂等的,若要两次执行同一个POST请求那就要注意了。POST方法所缺失的幂等性就解释了为什么当你每次重新发送POST请求时浏览器总是弹出警告。POST方法用于创建资源,而不需要由客户端指定实例id

幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()”函数就是一个幂等函数,“deleteFile()”函数就不是。“幂等”是HTTP Session和EJB失败转移中的一个重要概念。
当正在进行方法调用的时候失败了怎么办呢?答案是:处理过程中止,客户端看见错误消息提示(除非方法是幂等方法)。只有方法是幂等方法的情况,一些负载均衡器才能试图失败转移这些方法到别的实例。

幂等为何如此重要?因为客户端并不知道服务器何时失败的(在方法刚开始调用或者快要调用完成的时候)。如果是非幂等方法,则两次调用就会两次改变系统状态,系统就会处于不一致的状态。

在复杂应用中,不太可能把所有的方法都变成幂等方法。所以,只能通过失败转移减少错误,而不可能从根本上避免错误。

把应用程序设计为幂等的:幂等的的意思就是一个操做不会修改状态信息,并且每次操作的时候都返回同样的结果(换句话说就是:做多次和做一次的效果是一样的),通常,WEB请求,特别是 HTML forms 都被发送多次(当用户点击发送按纽两次,重载页面多次),导致多次HTTP请求。设计SERVLET和其他WEB对象为 幂等的,可以容忍多次请求。详细可以去参考设计模式“Synchronized Token ”和“Idempotent Receiver ”关于怎样设计幂等的的应用程序。
分享到:
评论
3 楼 FlyAway2 2014-07-22  
还有一点需要注意的就是,创建操作可以使用POST,也可以使用PUT,区别在于POST是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。

+++  非常好!!
2 楼 smithfox 2010-10-13  
幂等性 个人理解及应用
http://www.smithfox.com/?e=16
1 楼 mercyblitz 2010-06-29  
“幂等”的GET方法,在实现中,不一定能够100%满足。

相关推荐

    带你了解快速幂,快速幂基础知识,从小白到入门

    快速幂是一种高效的算法,常用于计算大整数的幂次,尤其在计算机科学和编程竞赛中有着...提供的学习资料"带你了解快速幂,快速幂基础知识,从小白到入门.pdf"应该会涵盖更多细节和实例,帮助你深入理解和掌握这一算法。

    逆幂法c程序

    通过阅读和理解这段代码,我们可以更深入地了解逆幂法的实际应用和编程技巧。在学习和使用这个程序时,应注意矩阵的存储结构、数值稳定性以及如何选择合适的初始向量和收敛条件,这些都是影响算法性能的关键因素。

    数值分析 幂法反幂法

    通过对给定文件的分析,我们可以了解到这两种方法的基本思想及其实际应用过程。无论是理论还是实践层面,它们都具有重要意义。特别是在处理大规模矩阵时,合理运用这些技术可以显著提高计算效率和准确性。

    大数的幂运算和幂模运算(加法链和蒙哥马利算法的混合)

    首先,让我们了解一下什么是大数。大数是指超过普通计算机原生数据类型(如int或long)所能表示范围的数值。在处理大数时,我们通常会使用一种自定义的数据结构,如数组或链表,来存储多位数字。 **幂运算**是数学...

    易语言大数幂模运算

    易语言是一种专为中国人设计的编程语言,它以简体中文作为编程符号,降低了编程的门槛,使得更多非计算机...通过对这些源码的学习,不仅可以掌握大数运算的技巧,还能了解如何在实际编程中应用这些算法,提升编程技能。

    FLUENT模拟幂律

    通过对 FLUENT 模拟幂律流动的学习,我们可以了解到如何在 FLUENT 中建立非牛顿流体流动的模型,以及如何使用 \( k-\omega \) 湍流模型来模拟复杂流动场景。这种模拟方法对于解决石油与天然气行业中的实际问题具有...

    数值分析_幂法和反幂法求特征值

    在C++实现过程中,需要注意矩阵的存储结构(如一维数组或二维数组),并选择合适的矩阵运算库(如Eigen、BLAS等)来提高效率。误差分析是评估算法性能的关键部分,包括相对误差、绝对误差和收敛速率。通常,我们可以...

    Aop注解+Redis解决SpringBoot接口幂等性(源码自取)

    在开发Web应用时,接口幂等性是一个重要的设计原则,尤其在处理银行交易、订单系统等高并发场景中。幂等性确保一个请求无论执行多少次,结果始终一致,不会产生副作用。本教程将通过Spring Boot结合AOP注解与Redis来...

    S7-200SMART PLC_10的幂函数库文件+使用说明.rar

    首先,我们来理解一下10的幂函数在PLC编程中的作用。在数学运算中,10的幂通常用于进行指数计算,例如将数值转换为科学记数法或进行货币换算等。在PLC编程中,这样的功能对于处理涉及倍率转换、数据放大缩小等问题时...

    北航数值分析大作业 幂法,反幂法求特征值

    例如,在反幂法中,我们可以通过对 \( A - \mu I \) 进行LU分解等操作来求解线性方程组。 #### 总结 本文基于给定代码片段介绍了幂法和反幂法的基本原理及实现。幂法适用于求解实对称矩阵的最大特征值及其对应的...

    MFC方幂计算器

    首先,我们需要了解MFC中的主要组件。MFC框架主要包括以下部分:应用程序框架(CWinApp)、文档框架(CDocument)、视图框架(CView)、对话框框架(CDialog)、窗口框架(CWnd)等。在创建方幂计算器的过程中,我们...

    一个自然数幂和公式的推导

    通过了解和掌握形式幂级数和生成函数等工具,我们可以更好地探索和实现复杂的数学关系和计算。此外,文章中提到的“李氏数”和其递推关系为理解和求解自然数幂和问题提供了新的视角,也凸显了中国古代数学的贡献和...

    95丨项目实战二:设计实现一个通用的接口幂等框架(实现)1

    通过以上分析,我们可以了解到构建一个通用的接口幂等框架涉及到的核心技术点和设计决策,以及在实现过程中需要注意的问题。这个框架的设计和实现不仅关注功能实现,还强调代码质量和系统的可扩展性。

    幂零变换性质与构造方法研究

    在讨论幂零变换的性质时,我们不得不提到逆矩阵、若尔当标准形和特征值等概念。若尔当标准形是一种用于表示矩阵相似变换的特殊形式,它可以帮助我们更容易地理解幂零矩阵的结构。若尔当标准形通常包含一个或多个对角...

    快速幂算法详解:高效计算大数幂的利器.zip

    通过阅读“快速幂算法详解:高效计算大数幂的利器.pdf”这份文档,你可以深入了解快速幂算法的原理、实现细节以及各种优化策略。实践中,多进行实例分析和编程练习,将有助于你更好地理解和运用这一强大的算法工具。

    中职数学实数指数幂PPT课件.pptx

    总的来说,中职数学中的实数指数幂部分旨在让学生掌握根式、分数指数幂的概念,了解它们的相互转化关系,并能熟练运用指数幂的运算法则进行计算,这对于后续的数学学习和实际问题的解决具有基础性作用。

    复杂网络幂律分布matlab仿真程序

    了解了这些基本概念后,可以使用MATLAB程序进行实际操作,进一步探索复杂网络的幂律分布特性。这个过程不仅有助于理解幂律分布的理论,还能锻炼编程技能,并对网络科学的其他相关主题,如小世界网络、社区检测、网络...

    矩阵乘法必用算法快速幂基础程序pascal

    通过上述分析,我们了解了快速幂的基本概念、实现原理以及在实际编程中的应用。对于需要处理大整数运算或矩阵幂的问题,快速幂算法提供了一种高效而简洁的解决方案。此外,掌握快速幂算法也有助于深入理解更复杂的...

    mifa.zip_反幂法_幂法

    首先,我们来详细了解幂法。幂法是一种迭代算法,主要用于求解实对称矩阵或复共轭对称矩阵的最大特征值。基本思想是选取一个非零向量x作为初始猜测,然后通过不断将矩阵A作用于该向量上,即计算A的幂次x,来逐渐逼近...

Global site tag (gtag.js) - Google Analytics