所以“幂等”可以定义为:
如果执行N次的动作与仅执行一次动作具有相同的效果。
明白了,很容易。
我的问题是关于这个定义的微妙之处 - 这个行为本身就被认为是幂等的,还是你还必须考虑传递给行动的数据?
让我用一个例子来澄清:
假设我有一个更新某些资源的PUT方法,我们称之为 f(x)
明显, f(3)
是幂等的,只要我提供3作为输入。同样明显的是, f(5)
将改变资源的价值(即,它将不再是3或之前的任何值)
所以当我们谈论幂等性时,我们是指行动/功能的概括(即, f(x)
),或者我们指的是行动/功能+传递给它的数据(即, f(3)
)?
假设我有一个更新某些资源的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),两组请求可以交错。
幂等性要求该动作适用于其域上的所有值,即 f(f(x)) = f(x)
对全部 x
。另一种思考方式是,如果操作的组成只是那个操作,那么操作就是幂等的。
您假设幂等意味着将更改服务器的状态 最多一次 通过一系列的调用。大多数时候,人们使用这个术语来表示服务器上的状态 根本不会改变 通过任意数量的调用。在这种情况下,你的两个案件之间的区别是无关紧要的。
这不是幂等的定义。如果对于任何项x,f(f(x))== f(x),则函数是幂等的。
PUT是你的f()函数的副作用,而不是它的结果。