什么是幂等操作?

1149
什么是幂等操作?

1
请查看关于最新幂等操作引发的事件(2022年)的故事:https://threadreaderapp.com/thread/1502947315279187979.html - Qiulang
18个回答

9

这是一种操作,每个第n个结果都与第一个结果的值匹配。例如,-1的绝对值是1。 -1的绝对值的绝对值是1。 -1的绝对值的绝对值的绝对值也是1。以此类推。

另请参阅:何时使用递归会非常愚蠢?


1
即使过了10年,这仍然是一个简洁的答案。+1 - Soner from The Ottoman Empire

8

对于一个集合来说,幂等操作在应用一次或多次后不会改变其成员。

它可以是像 absolute(x) 这样的一元操作,其中 x 属于正整数集合。这里 absolute(absolute(x)) = x。

它可以是像自身与自身的并集 这样的二元操作,总是返回相同的集合。

祝好!


2
幂等操作是指 f(f(x)) = f(x) 的操作。"不改变其成员" 不是正确的答案。 - Saeed Mohtasham

5

简而言之,幂等操作是指无论您对其进行多少次操作,该操作都不会产生不同的结果。

例如,根据HTTP规范的定义,GET、HEAD、PUT和DELETE是幂等操作;但是POST和PATCH则不是。这就是为什么有时候POST被替换为PUT的原因。


4
如果执行操作多次与执行一次等效,则称该操作具有幂等性。
例如:将音量设置为20。无论电视的音量被设置为20多少次,最终结果都是音量为20。即使一个进程执行了50/100次或更多次操作,在进程结束时音量仍将为20。
反例:将音量增加1。如果一个进程执行此操作50次,则最终音量将为初始音量+50;如果一个进程执行此操作100次,则最终音量将为初始音量+100。显然,最终结果取决于操作执行的次数。因此,我们可以得出结论,此操作不是幂等的。我已经用粗体突出了最终结果。
如果从编程角度考虑,假设我有一个操作,其中函数f以foo作为输入,并将f的输出设置为foo。如果在执行此操作50/100次或更多次的过程中,我的foo变量保存的值与仅执行一次操作时相同,则该操作是幂等的;否则不是。
foo = <某个随机值,比如-2> { foo = f(foo) }  花括号表示操作
如果f返回输入的平方,则该操作不是幂等的。因为最终foo将为(-2)的(操作执行次数)次方。
如果f返回输入的绝对值,则该操作是幂等的,因为无论操作执行多少次,foo都将是abs(-2)。这里,最终结果被定义为变量foo的最终值。
在数学上,幂等性的含义略有不同: f(f(....f(x))) = f(x) 这里输出的f(x)作为输入再次传递给f,这并不总是编程中的情况。

参考:https://ttboj.wordpress.com/2017/05/05/declarative-vs-imperative-paradigms/ - Aman Godara

1

我的5c: 在集成和网络中,幂等性非常重要。 以下是几个真实生活的例子: 想象一下,我们将数据传递到目标系统。数据由一系列消息组成。 1. 如果序列在通道中混合会发生什么?(就像网络包一样 :))。如果目标系统是幂等的,结果不会有所不同。如果目标系统依赖于序列中的正确顺序,我们必须在目标站点上实现重新排序器,以恢复正确的顺序。 2. 如果存在消息副本会发生什么?如果目标系统的通道没有及时确认,源系统(或通道本身)通常会发送另一个消息副本。结果可能会在目标系统中产生重复的消息。 如果目标系统是幂等的,它会处理好这些问题,结果不会有所不同。 如果目标系统不是幂等的,我们必须在通道的目标系统端实现去重器。


单独发送的请求的幂等性(与任何其他请求或任何改变系统状态的事件隔离)并不等同于重新排序请求。HTTP PUT请求和HTTP DELETE请求都应该是单独幂等的,但这并不意味着在相同URL上调用PUT和DELETE的顺序无关紧要,因为PUT请求可能会产生副作用! - Robin Green

1
1. 幂等性的基础
数学上,如果一个函数满足 f(f(x)) = f(x),那么它被称为幂等函数。 因此,如果我们有一个函数 absolute(x),它返回整数 x 的正数对应值;那么以下条件必须成立:
absolute(absolute(x)) = absolute(x)

如果我们将x设为-100,无论我们重复这个操作多少次,第一次执行后的结果和第一次执行后的结果将完全相同。
所以,
absolute(-100) = 100
AND
absolute(absolute(-100)) = absolute(100) = 100
=> absolute(absolute(x)) = absolute(x)

❗ 这里需要注意的一个重要点是,“结果”并不一定指函数返回的数据,而是指正在执行操作的数据。
因此,如果你在面向对象编程中使用一个函数,例如一个具有值为{1,2,4}的集合,并尝试执行add(2)操作,那么结果即集合的内容将不会改变。无论你重复这个操作多少次,结果始终都是相同的,即{1,2,4}。然而,当你添加一个集合中不存在的元素,比如执行add(3)操作时,集合将变为(不考虑顺序){1,2,4,3}。但是,无论你再次重复这个操作多少次(甚至100次),结果(即集合)仍将包含{1,2,4,3}。对于列表来说,情况并非如此,因为它可以包含重复的元素。每次向列表中添加元素时,它都会被添加进去。
简而言之,
一个操作如果可以重复多次,并且第一次执行和第n次执行后的结果完全相同,则称该操作具有幂等性。
此外,任何不改变数据的操作都是幂等的,因为它对数据状态没有任何影响。
在REST中的幂等性: GET、HEAD、OPTIONS、TRACE等请求方法(不改变数据)是幂等的(前提是实现正确)。 用于更改数据的方法的幂等性可能不同,例如: - PUT和DELETE应该被实现成幂等的。 - POST和PATCH不能保证幂等性,可能是也可能不是。
为什么PUT方法必须是幂等的?
根据IETF的RFC-7231PUT旨在替换服务器状态。因此,如果您在网站上存储了一个地址,PUT请求应该在其请求中包含整个地址。此外,它应该替换服务器上的数据(如果数据尚不存在,则创建)。因此,首次执行请求和多次执行相同请求后的结果完全相同。 4. 为什么DELETE必须是幂等的? 删除用于从服务器上删除资源。因此,如果您删除自己的地址,同一地址不能再次被删除(它不存在,并且不会删除其他内容)。因此,首次执行和多次执行相同请求后的结果完全相同。
❗ REST中一个常见的误解是,如果每次执行请求都接收相同的响应,那么它就是幂等的。这是不正确的。结果始终与服务器上的数据相关(即正在执行操作的数据)。在考虑REST中的幂等性时,请思考服务器的状态。

这个视频非常详细地解释了这些概念:https://www.youtube.com/watch?v=R7s2FVN4c9Q


0
假设客户端对“IstanceA”服务发出请求,该服务处理该请求,将其传递给数据库,并在发送响应之前关闭。由于客户端没有看到它被处理了,所以它会重试相同的请求。负载均衡器将把请求转发到另一个服务实例“InstanceB”,该实例将在同一DB项上进行相同的更改。
我们应该使用“幂等令牌”。当客户端向服务发送请求时,它应该具有某种可以保存在DB中的请求ID,以表明我们已经执行了该请求。如果客户端重试请求,“InstanceB”将检查请求ID。由于特定请求已经执行过,因此它不会对DB项进行任何更改。这些类型的请求称为“幂等请求”。因此,我们可以多次发送相同的请求,但不会进行任何更改。

0

对于工作流管理器(如Apache Airflow),如果您的管道中的幂等性操作失败,则系统可以自动重试任务,而不会影响系统。即使日志发生变化,这也是好的,因为您可以看到事件。

在这种情况下最重要的是,您的系统可以重试失败的任务,并且不会搞乱管道(例如,在每次重试中将相同的数据附加到表中)。


但在上面解释之前,请简要解释“幂等操作”。 - Dendi Handian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接