问题 定义幂等


所以“幂等”可以定义为:

如果执行N次的动作与仅执行一次动作具有相同的效果。

明白了,很容易。

我的问题是关于这个定义的微妙之处 - 这个行为本身就被认为是幂等的,还是你还必须考虑传递给行动的数据?

让我用一个例子来澄清:

假设我有一个更新某些资源的PUT方法,我们称之为 f(x)

明显, f(3) 是幂等的,只要我提供3作为输入。同样明显的是, f(5) 将改变资源的价值(即,它将不再是3或之前的任何值)

所以当我们谈论幂等性时,我们是指行动/功能的概括(即, f(x)),或者我们指的是行动/功能+传递给它的数据(即, f(3))?


6941
2017-12-14 14:12


起源

这不应该转移到数学论坛吗? (为了清楚起见:我没有downvote) - Roy Dictus
取决于我们是在谈论形式逻辑中的定义,还是Web编程中的定义。我怀疑那个贬低者(不是我)只是认为这个问题是不合适的。 - Ernest Friedman-Hill
@Roy-我不这么认为,因为它直接应用于RESTful Web服务,这就是我在上面写的示例的上下文 - Didaxis
我认为在这里讨论是有效的,因为有明确的CS应用程序,在页面中间讨论: en.wikipedia.org/wiki/Idempotence - Jonathan M
对于想要理解这个概念的人来说,这可能是有用的: pedrorijo.com/blog/fp-concepts - pedrorijo91


答案:


假设我有一个更新某些资源的PUT方法,我们称之为   F(X)

显然,f(3)是幂等的,只要我提供3作为输入。和   同样明显的是,f(5)将改变资源的价值(即它   将不再是3或以前的任何价值)。

这只是显而易见的是服务器实现就是这样 PUT 尊重这个幂等财产。在HTTP的上下文中, RFC 2616说

方法也可以具有“幂等”的属性(除此之外)   从错误或到期问题)N> 0的副作用 相同   请求与单个请求相同。

有点偏离主题...... 在像web这样的分布式系统中,您可能还需要考虑交换性和并发请求。例如,相同PUT(x1)请求的N + 1应具有相同的效果,但您不知道另一个客户端是否在您的之间发出了不同的PUT(x2)请求,因此PUT(x1)= PUT(x1)和mPUT(x2)= PUT(x2),两组请求可以交错。


5
2017-12-14 14:27



因此,我们可以得出结论,在这个例子中,PUT在单个请求的上下文中是幂等的。但即使它与其他并发请求交错,它仍然是幂等的,因为第一个操作的结果跟在idempotence属性之后,不是它。 - Amit Dash


幂等性要求该动作适用于其域上的所有值,即 f(f(x)) = f(x) 对全部 x。另一种思考方式是,如果操作的组成只是那个操作,那么操作就是幂等的。


5
2017-12-14 14:17



@JonathanM抱歉,我不明白你的意思。 abs(abs(x)) = abs(x) 对全部 x,超过实数或复数。如果你认为 abs 与我说的不符,请给出一个反例。 - Michael J. Barber


您假设幂等意味着将更改服务器的状态 最多一次 通过一系列的调用。大多数时候,人们使用这个术语来表示服务器上的状态 根本不会改变 通过任意数量的调用。在这种情况下,你的两个案件之间的区别是无关紧要的。


3
2017-12-14 14:16



但声明“根本不会改变”是“无效的”,对吧?这将是GET,HEAD,OPTIONS和TRACE - Didaxis


这不是幂等的定义。如果对于任何项x,f(f(x))== f(x),则函数是幂等的。

PUT是你的f()函数的副作用,而不是它的结果。


3
2017-12-14 14:17



你的定义与这里给出的相反: en.wikipedia.org/wiki/Idempotence。页面第一站点 abs() 作为幂等函数,但不是你的定义。 - Jonathan M
这是完全错误的。您已将幂等性定义为等同于身份函数。你隐含地假设已经对x进行了操作。 - Michael J. Barber
是的,这是真的,抱歉混淆...... - fge
我怀疑你可以毫不费力地澄清你的答案;将幂等特征与PUT操作相关联将是有用的。 - Michael J. Barber
@ MichaelJ.Barber真的,做到了 - fge