什么是幂等运算?
当前回答
理解幂等运算的一个好例子可能是用远程钥匙锁汽车。
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
锁是一个幂等运算。即使每次运行上锁都有一些副作用,比如眨眼,但不管你运行多少次上锁操作,汽车仍然处于相同的上锁状态。
其他回答
任何操作,每n个结果都会产生与第1个结果值匹配的输出。例如,-1的绝对值是1。-1的绝对值的绝对值是1。-1绝对值的绝对值的绝对值等于1。等等。请参见:什么时候使用递归是非常愚蠢的?
简而言之,幂等运算意味着无论你做多少次幂等运算都不会得到不同的结果。
例如,根据HTTP规范的定义,GET、HEAD、PUT、DELETE是幂等操作;但是POST和PATCH不是。这就是为什么有时POST被PUT取代的原因。
假设客户端向“IstanceA”服务发出请求,该服务处理请求,将其传递给DB,并在发送响应之前关闭。因为客户端没有看到它被处理,它将重试相同的请求。负载均衡器将请求转发到另一个服务实例“InstanceB”,该服务实例将对相同的DB项进行相同的更改。
我们应该使用幂等符号。当客户端向服务发送请求时,它应该有某种类型的请求id,可以保存在DB中,以显示我们已经执行了请求。如果客户端重试请求,“InstanceB”将检查requestId。由于特定的请求已经被执行,因此它不会对DB项进行任何更改。这种请求叫做幂等请求。因此,我们多次发送相同的请求,但不会做任何更改
无论调用该操作多少次,结果都是相同的。
如果一个操作执行多次等同于执行一次,那么它就是幂等的。
例如:将音量设置为20。 不管把电视的音量设置多少次为20,最终的结果都是20。即使一个进程执行该操作50/100次或更多,在进程结束时,卷也将为20。
反例:将音量增加1。如果一个进程执行该操作50次,则最终卷将为初始卷+ 50;如果一个进程执行该操作100次,则最终卷将为初始卷+ 100。正如您可以清楚地看到的,最终结果根据执行操作的次数而变化。因此,我们可以得出结论,这个运算不是幂等的。
我用粗体突出显示了最终结果。
如果你从编程的角度考虑,假设我有一个操作,其中一个函数f以foo作为输入,f的输出被设为foo。如果在进程结束时(执行此操作50/100次或更多次),我的foo变量保存的值是该操作只执行一次时的值,则该操作是幂等的,否则为NOT。
Foo = <某个随机值,比如-2>
{foo = f(foo)}花括号概括了该操作
如果f返回输入的平方,则运算不是幂等的。因为foo在最后会被(-2)提升到(执行操作次数)的次方
如果f返回输入的绝对值,则操作是幂等的,因为无论执行多少次操作,foo都将是abs(-2)。 这里,最终结果被定义为变量foo的最终值。
在数学意义上,幂等的含义略有不同: F (F (.... F (x))) = F (x) 这里f(x)的输出再次作为输入传递给f,这在编程中并不需要总是这样。