什么是幂等运算?


当前回答

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

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

其他回答

无论调用该操作多少次,结果都是相同的。

在计算中,幂等运算是指如果使用相同的输入参数多次调用它,则不会产生额外影响的运算。例如,从集合中移除一项可以被认为是集合上的幂等操作。

在数学中,幂等运算是指f(f(x)) = f(x)。例如,abs()函数是幂等的,因为对于所有x, abs(abs(x)) = abs(x)。

考虑到数学定义中的x代表一个对象的状态,而f是一个可能改变该对象的操作,可以调和这些略有不同的定义。例如,考虑Python集合及其discard方法。discard方法从集合中删除一个元素,如果该元素不存在,则不执行任何操作。所以:

my_set.discard(x)

与执行两次相同的操作具有完全相同的效果:

my_set.discard(x)
my_set.discard(x)

幂等操作经常用于网络协议的设计中,其中执行操作的请求保证至少发生一次,但也可能发生多次。如果操作是幂等的,那么执行两次或两次以上的操作是没有伤害的。

更多信息请参见维基百科关于幂等性的文章。


上面的答案之前有一些不正确和误导性的例子。下面的评论写在2014年4月之前,是指一个较旧的修订。

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

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

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

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

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

干杯

幂等操作是一种可以应用多次而不改变结果(即系统状态)的操作、动作或请求,超出初始应用。

示例(web应用上下文):

IDEMPOTENT: Making multiple identical requests has the same effect as making a single request. A message in an email messaging system is opened and marked as "opened" in the database. One can open the message many times but this repeated action will only ever result in that message being in the "opened" state. This is an idempotent operation. The first time one PUTs an update to a resource using information that does not match the resource (the state of the system), the state of the system will change as the resource is updated. If one PUTs the same update to a resource repeatedly then the information in the update will match the information already in the system upon every PUT, and no change to the state of the system will occur. Repeated PUTs with the same information are idempotent: the first PUT may change the state of the system, subsequent PUTs should not.

非幂等性: 如果一个操作总是导致状态的变化,比如反复向用户发送相同的消息,导致每次都发送新消息并存储在数据库中,我们称该操作为NON-IDEMPOTENT。

NULLIPOTENT: 如果一个操作没有副作用,就像仅仅在网页上显示信息而没有对数据库进行任何更改(换句话说,你只是在读取数据库),我们说这个操作是NULLIPOTENT。所有get都应该是无效的。

当谈论系统的状态时,我们显然忽略了无害的和不可避免的影响,如日志和诊断。