【问题标题】:Defining Idempotence定义幂等性
【发布时间】:2012-01-20 07:27:22
【问题描述】:

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

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

知道了,很简单。

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

让我用一个例子来澄清一下:

假设我有一个更新某些资源的 PUT 方法,我们将其命名为 f(x)

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

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

【问题讨论】:

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

标签: web-services http rest httpverbs idempotent


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 因此我们可以得出结论,在这个例子中,PUT 在单个请求的上下文中是幂等的。但即使它与其他并发请求交错,它仍然是幂等的,因为第一个操作的结果遵循幂等属性,不是吗。
【解决方案2】:

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

【讨论】:

  • @JonathanM 对不起,我不明白你的意思。 abs(abs(x)) = abs(x) 对于所有 x,在实数或复数上。如果您认为abs 与我所说的不符,请举个反例。
【解决方案3】:

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

【讨论】:

  • 但是说“根本不会改变”是“无效的”,对吧?这将是 GET、HEAD、OPTIONS 和 TRACE
【解决方案4】:

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

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

【讨论】:

  • 您的定义与此处给出的相反:en.wikipedia.org/wiki/Idempotence。页面第一个站点 abs() 作为幂等函数,但它不是您的定义。
  • 这完全是错误的。您已将幂等性定义为等价于恒等函数。您隐含地假设该操作已经对 x 完成。
  • 我怀疑你可以毫不费力地澄清你的答案;将幂等性专门与 PUT 操作联系起来会很有用。
  • 如果我理解正确的话,每个恒等函数都是幂等的,但反之则不然。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
  • 2014-04-01
  • 2016-01-08
  • 1970-01-01
相关资源
最近更新 更多