12

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

一个动作,如果执行 N 次,则与只执行一次该动作具有相同的效果。

明白了,够简单的。

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

让我用一个例子来澄清:

假设我有一个更新某些资源的 PUT 方法,我们将调用它f(x)

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

所以当我们谈论幂等性时,我们是指像(即,f(x))这样的动作/函数的泛化,还是指的是动作/函数+传递给它的数据(即,f(3))?

4

4 回答 4

6

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

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

这很明显是服务器实现PUT尊重这个幂等属性。在 HTTP 的上下文中,RFC 2616 说

方法还可以具有“幂等性”的属性,因为(除了错误或过期问题)N > 0 个相同 请求的副作用与单个请求相同。

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

于 2011-12-14T14:27:00.933 回答
5

幂等性要求该动作适用于其域内的所有值,即f(f(x)) = f(x)适用于所有x。另一种思考方式是,如果操作与自身的组合就是该操作,则操作是幂等的。

于 2011-12-14T14:17:05.273 回答
3

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

于 2011-12-14T14:16:02.017 回答
3

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

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

于 2011-12-14T14:17:17.550 回答