什么时候可以调用幂等操作?

When can you call operation idempotent?

维基百科中幂等的定义是:幂等是数学和计算机科学中某些运算的属性,可以应用多个次而不改变初始应用程序后的结果。

问题是:我有 REST API PUT 调用,它更新域聚合的属性。此外,它会为每个更新的 属性 触发事件。现在,如果我们对后端有两个完全相同的 PUT 调用:

  1. 第一次 PUT 调用更新聚合的属性并触发假设 5 个事件。
  2. 第二次 PUT 调用更新了聚合的属性,但不触发任何事件,因为聚合的属性没有改变(第一次 PUT 调用更新了聚合属性的值)。

问题是:这个操作是幂等的吗?

是的,它是:无论您发送多少次相同的 PUT 请求,它都会使您的系统(您的聚合)处于相同的状态。

This question and its answers解释什么是幂等运算。简而言之:重复调用不会改变结果。

所以从你对这个操作的描述来看,它似乎是幂等的。

是也不是。从数据的角度来看它是幂等的。无论调用多少次,数据库中的数据都不会改变。但它不是幂等的,因为某些日志记录或其他事件可能会发生,这会改变系统的 "Entropy":)

这取决于你的定义。由于您有副作用(如果存在差异则触发某些事件),多次调用可能会导致比预期更多的副作用。然而,应用程序的状态,忽略副作用,没有并发,将是幂等的。请记住,REST 调用是通过异步网络进行的,因此这是一个分布式系统。

如果您有两个并发进程,它们可能会触发不同数量的副作用。例如:

a = 2
a = 3
a = 2 
a = 3

将触发两倍于

的事件
a = 2
a = 2 
a = 3
a = 3

这可能会引起一些麻烦。