所以“幂等”可以定义为:
如果执行N次操作与仅执行一次操作具有相同效果的操作。
得到它,很容易。
我的问题是关于这个定义的微妙之处 - 这个行为本身就被认为是幂等的,还是你还必须考虑传递给行动的数据?
让我用一个例子来澄清:
假设我有一个更新某些资源的PUT方法,我们称之为f(x)
显然,f(3)
是幂等的,只要我提供3作为输入。同样显而易见的是,f(5)
将改变资源的价值(即,它将不再是3或之前的任何值)
所以当我们谈论幂等性时,我们是指动作/函数的泛化(即f(x)
),还是我们指的是动作/函数+传递给它的数据(即, f(3)
)?
答案 0 :(得分:5)
幂等性要求该操作适用于其域上的所有值,即所有f(f(x)) = f(x)
的{{1}}。考虑它的另一种方法是,如果操作的组成只是那个操作,那么操作是幂等的。
答案 1 :(得分:5)
假设我有一个更新某些资源的PUT方法,我们会称之为 F(X)
显然,f(3)是幂等的,只要我提供3作为输入。和 同样显而易见的是,f(5)将改变资源的价值(即它 将不再是3或之前的任何价值。
唯一明显的是服务器实现是PUT
尊重这个幂等属性。在HTTP的上下文中,RFC 2616 says:
方法也可以具有“幂等”的属性(除此之外) 从错误或到期问题)N的副作用> 0 相同 请求与单个请求相同。
离主题有点...... 在像web这样的分布式系统中,您可能还需要考虑交换性和并发请求。例如,相同PUT(x1)请求的N + 1应具有相同的效果,但您不知道另一个客户端是否在您的之间发出了不同的PUT(x2)请求,因此当n PUT(x1)时= PUT(x1)和m PUT(x2)= PUT(x2),两组请求可以交错。
答案 2 :(得分:3)
您假设幂等意味着服务器的状态最多只能通过一系列调用更改。大多数情况下,人们使用这个术语来表示服务器上的状态不会被任何数量的调用完全改变。在这种情况下,你的两个案件之间的区别是无关紧要的。
答案 3 :(得分:3)
这不是幂等的定义。如果对于任何项x,f(f(x))== f(x),函数是幂等的。
PUT是你的f()函数的副作用,而不是它的结果。