Answers:
在计算中,幂等运算是指如果使用相同的输入参数多次调用幂等运算,则不会产生任何其他影响。例如,从集合中删除项目可以视为对该集合的幂等操作。
在数学中,幂等运算是f(f(x))= f(x)的情况。例如,该abs()
函数是幂等的,因为abs(abs(x)) = abs(x)
对于x
。
通过考虑数学定义中的x表示对象的状态,并且f是可以使该对象变异的运算,可以调和这些稍有不同的定义。例如,考虑Pythonset
及其discard
方法。该discard
方法从集合中删除一个元素,如果该元素不存在,则不执行任何操作。所以:
my_set.discard(x)
与执行两次相同的操作具有完全相同的效果:
my_set.discard(x)
my_set.discard(x)
幂等操作通常用于网络协议的设计中,在该协议中,执行一项操作的请求至少会发生一次,但也可能会发生多次。如果该操作是幂等的,则两次执行此操作不会有任何危害。
有关更多信息,请参见有关幂等性的Wikipedia文章。
上面的答案以前有一些不正确和误导性的例子。以下注释是在2014年4月之前写的,是较旧的版本。
set
答案的Python 示例中,set对象显然具有状态,并且还提供了一些幂等操作,例如discard
。
discard
也可以通过将状态包含在返回值中来以无状态方式实现:discard([my_set, x]) = [my_new_set, x]
。这样就可以了discard(discard([my_set, x]))
。请注意,[my_new_set, x]
是只有一个参数,它的类型是2元组。
discard(x)
第二次调用与第一次调用具有相同的效果:该集合将不再包含x
。计算幂等性与系统的健壮性有关。由于事情可能会失败(例如,网络中断),因此当检测到故障时,如何恢复?最简单的恢复方法是再次执行此操作,但这仅在重新执行幂等时才有效。例如discard(x)
是幂等的,但pop()
不是。都是关于错误恢复的。
幂等运算可以重复任意次,其结果将与仅进行一次相同。在算术中,将零加到数字上是幂等的。
在“ RESTful” Web服务的上下文中讨论了幂等性。REST试图最大程度地利用HTTP来使程序访问Web内容,并且通常与基于SOAP的Web服务形成对比,后者只是在HTTP请求和响应中建立远程过程调用样式服务。
REST将Web应用程序组织为“资源”(例如Twitter用户或Flickr图像),然后使用POST,PUT,GET和DELETE的HTTP动词来创建,更新,读取和删除这些资源。
幂等在REST中扮演重要角色。如果您获取REST资源的表示形式(例如,从Flickr获取jpeg图像),而操作失败,则可以一次又一次地重复GET,直到操作成功。对于Web服务,获取图像的次数无关紧要。同样,如果您使用RESTful Web服务来更新您的Twitter帐户信息,则可以多次输入新信息,以便从Web服务获得确认。将其放置一千次与放置一次相同。同样,将REST资源删除一千次与删除一次相同。因此,幂等性使得构建可抵抗通信错误的Web服务变得容易得多。
进一步阅读:Richardson和Ruby 撰写的RESTful Web服务(在103-104页讨论了幂等性),以及Roy Fielding的REST博士学位论文。Fielding是HTTP 1.1 RFC-2616的作者之一,在第9.1.2节中讨论了幂等性。
无论您调用该操作多少次,结果都是一样的。
truncate
和delete
。
幂等是指一次执行一项操作或多次执行一项操作具有相同的效果。
例子:
对于纯函数(没有副作用的函数),幂等性意味着f(x)= f(f(x))= f(f(f(x()))= f(f(f(f(x)))) )= ......对于x的所有值
对于具有副作用的功能,幂等性还意味着在首次应用后不会引起其他副作用。如果愿意,可以将世界状况视为该函数的附加“隐藏”参数。
请注意,在一个同时进行并行操作的世界中,您可能会发现原来认为是幂等的操作不再如此(例如,在上面的示例中,另一个线程可能会取消设置布尔值的值)。基本上,只要您具有并发性和可变状态,就需要对幂等性进行更仔细的考虑。
幂等性通常是构建健壮系统的有用属性。例如,如果存在从第三方接收重复消息的风险,则使消息处理程序充当幂等操作会很有帮助,这样消息效果只会发生一次。
f(x) = f(f(x))
,那f(x){return x+1;}
是不是纯函数?因为f(x) != f(f(x))
:f(1)
给2同时f(2)
给出了3
f(x) = f(f(x))
。但是正如@GregHewgill所提到的,为了使此定义有意义,您必须考虑x
将其视为对象以及f
使对象状态发生变化的操作(即:的输出f
是mutated x
)。
只是想抛出一个证明幂等的真实用例。在JavaScript中,假设您正在定义一堆模型类(如在MVC模型中)。通常实现的方式在功能上等效于以下示例(基本示例):
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
然后,您可以像这样定义新的类:
var User = model('user');
var Article = model('article');
但是,如果您尝试从代码中的其他位置User
通过获取类model('user')
,则它将失败:
var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');
这两个User
构造函数将不同。那是,
model('user') !== model('user');
为了使其幂等,您只需添加某种缓存机制,如下所示:
var collection = {};
function model(name) {
if (collection[name])
return collection[name];
function Model() {
this.name = name;
}
collection[name] = Model;
return Model;
}
通过添加缓存,您每次执行的操作都model('user')
将是同一个对象,因此是幂等的。所以:
model('user') === model('user');
幂等操作是可以多次应用的操作,动作或请求,而不会改变结果(即系统状态),超出了最初的应用程序。
示例(Web应用程序上下文):
决定因素:发出多个相同的请求与发出单个请求具有相同的效果。电子邮件消息系统中的一条消息已打开,并在数据库中标记为“已打开”。一个人可以多次打开该消息,但是重复执行此操作只会导致该消息处于“打开”状态。这是一个幂等操作。第一次使用与资源不匹配的信息(系统状态)PUT对资源进行更新时,系统状态将随着资源更新而改变。如果一个PUT反复对资源进行相同的更新,则更新中的信息将与每个PUT上已存在于系统中的信息相匹配,并且不会更改系统状态。具有相同信息的重复PUT是幂等的:
非强制性:如果某个操作总是引起状态变化,例如一次又一次地向用户发布同一条消息,导致每次都发送新消息并将其存储在数据库中,那么我们就说该操作是非强制性的。
NULLIPOTENT:如果某个操作没有副作用,例如仅在网页上显示信息而数据库中没有任何更改(换句话说,您仅在读取数据库),则说该操作为NULLIPOTENT。所有GET均应无效。
在谈论系统状态时,我们显然忽略了希望的无害和不可避免的影响,例如日志记录和诊断。
幂等运算:如果多次执行,则没有副作用。
示例:一种从数据资源中检索值并进行打印的
操作非等幂操作:如果多次执行该操作会造成一定危害。(当它们更改某些值或状态时)
示例:从银行帐户中提取的操作
相当详细和技术性的答案。只需添加一个简单的定义。
幂等=可重新运行
例如,Create
如果执行多次,则
操作本身无法保证不会出错。但是,如果有操作,CreateOrUpdate
那么它将声明可重新运行性(幂等)。
一个集合上的幂等运算在被应用一次或多次后,其成员保持不变。
它可以是绝对值(x)之类的一元运算,其中x属于一组正整数。这里的absolute(absolute(x))= x。
它可以是二进制运算,就像集合与自身的并集将始终返回同一集合一样。
干杯
我的5c:在集成和网络中,幂等性非常重要。现实生活中的几个例子:想象一下,我们将数据传递到目标系统。通过一系列消息传递的数据。1.如果序列在通道中混合会发生什么?(因为网络软件包总是这样做:))。如果目标系统是幂等的,结果将不会有所不同。如果目标系统依赖于顺序中的正确顺序,则我们必须在目标站点上实现重新排序器,这将恢复正确的顺序。2.如果消息重复,该怎么办?如果目标系统的通道未及时确认,则源系统(或通道本身)通常会发送该消息的另一个副本。结果,我们可以在目标系统侧获得重复的消息。如果目标系统是幂等的,它会照顾好它,结果不会有所不同。如果目标系统不是幂等的,则必须在通道的目标系统侧实现重复数据删除器。
重试安全。
通常是了解其在计算机科学中含义的最简单方法。
Idempotent operations are often used in the design of network protocols
是一个相关的例子,** GET不能改变服务器上的任何东西,所以GET是幂等的。在HTTP / Servlet上下文中,这意味着可以两次发出相同的请求,而不会产生负面影响。** POST不是幂等的。