什么是幂等运算?


当前回答

my 5c: In integration and networking the idempotency is very important. Several examples from real-life: Imagine, we deliver data to the target system. Data delivered by a sequence of messages. 1. What would happen if the sequence is mixed in channel? (As network packages always do :) ). If the target system is idempotent, the result will not be different. If the target system depends of the right order in the sequence, we have to implement resequencer on the target site, which would restore the right order. 2. What would happen if there are the message duplicates? If the channel of target system does not acknowledge timely, the source system (or channel itself) usually sends another copy of the message. As a result we can have duplicate message on the target system side. If the target system is idempotent, it takes care of it and result will not be different. If the target system is not idempotent, we have to implement deduplicator on the target system side of the channel.

其他回答

如果一个操作执行多次等同于执行一次,那么它就是幂等的。

例如:将音量设置为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,这在编程中并不需要总是这样。

幂等运算即使调用多次也会产生相同状态的结果,前提是传入相同的参数。

对集合的幂等运算在应用一次或多次时,其成员保持不变。

它可以是像absolute(x)这样的一元运算,其中x属于一组正整数。这里absolute(absolute(x)) = x。

它可以是一个二进制操作,比如集合与自身的并集总是返回相同的集合。

干杯

相当详细和专业的回答。只是添加了一个简单的定义。

幂等=可重复运行

例如, 如果多次执行Create操作,则不能保证运行时没有错误。 但是如果有一个CreateOrUpdate操作,那么它声明了可重运行性(等幂)。

假设客户端向“IstanceA”服务发出请求,该服务处理请求,将其传递给DB,并在发送响应之前关闭。因为客户端没有看到它被处理,它将重试相同的请求。负载均衡器将请求转发到另一个服务实例“InstanceB”,该服务实例将对相同的DB项进行相同的更改。

我们应该使用幂等符号。当客户端向服务发送请求时,它应该有某种类型的请求id,可以保存在DB中,以显示我们已经执行了请求。如果客户端重试请求,“InstanceB”将检查requestId。由于特定的请求已经被执行,因此它不会对DB项进行任何更改。这种请求叫做幂等请求。因此,我们多次发送相同的请求,但不会做任何更改