Was ist eine idempotente Operation?


Antworten:


964

Beim Rechnen ist eine idempotente Operation eine Operation, die keine zusätzlichen Auswirkungen hat, wenn sie mehrmals mit denselben Eingabeparametern aufgerufen wird. Das Entfernen eines Elements aus einem Satz kann beispielsweise als idempotente Operation am Satz angesehen werden.

In der Mathematik ist eine idempotente Operation eine, bei der f (f (x)) = f (x) ist . Zum Beispiel ist die abs()Funktion weil abs(abs(x)) = abs(x)für alle idempotent x.

Diese leicht unterschiedlichen Definitionen können miteinander in Einklang gebracht werden, indem berücksichtigt wird, dass x in der mathematischen Definition den Zustand eines Objekts darstellt und f eine Operation ist, die dieses Objekt mutieren kann. Betrachten Sie beispielsweise Pythonset und seine discardMethode. Die discardMethode entfernt ein Element aus einer Menge und führt nichts aus, wenn das Element nicht vorhanden ist. Damit:

my_set.discard(x)

hat genau den gleichen Effekt wie zweimal dieselbe Operation:

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

Idempotente Operationen werden häufig beim Entwurf von Netzwerkprotokollen verwendet, bei denen eine Anforderung zur Ausführung einer Operation garantiert mindestens einmal, aber auch mehrmals auftreten kann. Wenn die Operation idempotent ist, kann es nicht schaden, die Operation zwei- oder mehrmals auszuführen.

Weitere Informationen finden Sie im Wikipedia-Artikel über Idempotenz .


Die obige Antwort hatte zuvor einige falsche und irreführende Beispiele. Die vor April 2014 verfassten Kommentare beziehen sich auf eine ältere Revision.


6
Beispiel: Da die obige Antwort besagt, dass Idempotent operations are often used in the design of network protocolshier ein verwandtes Beispiel ist ** GET soll nichts auf dem Server ändern, also ist GET idempotent. Im HTTP / Servlet-Kontext bedeutet dies, dass dieselbe Anforderung zweimal ohne negative Konsequenzen gestellt werden kann. ** POST ist NICHT idempotent.
KNU

1
Ist "staatenlos" gleichbedeutend mit "idempotent"?
Michael Osofsky

2
@MichaelOsofsky: Nein, im Python- setBeispiel in der Antwort hat das gesetzte Objekt eindeutig den Status und bietet auch einige idempotente Operationen wie discard.
Greg Hewgill

1
@MichaelOsofsky discardkann auch zustandslos implementiert werden, indem der Status in den Rückgabewert einbezogen wird : discard([my_set, x]) = [my_new_set, x]. So können Sie tun discard(discard([my_set, x])). Beachten Sie, dass [my_new_set, x]ist nur ein Argument und seine Art ist 2-fach.
Pacerier

2
@Green Wenn Sie den Begriff "Gleicher Effekt" im Zusammenhang mit Impotenz verwenden, bedeutet dies, dass das Ergebnis dasselbe ist und nicht die Aktion . Der Aufruf discard(x)enthält nicht mehr Der Satz: ein zweites Mal die gleiche Wirkung haben , da es das erste Mal aufrufen x. Bei der Berechnung der Idempotenz geht es um die Robustheit eines Systems. Wie können Sie sich erholen, wenn ein Fehler erkannt wird (z. B. Netzwerkausfall)? Die einfachste Wiederherstellung besteht darin, es einfach noch einmal zu tun, aber das funktioniert nur, wenn es idempotent ist. ZB discard(x)ist idempotent, aber pop()nicht. Es geht nur um die Fehlerbehebung.
Andreas

138

Eine idempotente Operation kann beliebig oft wiederholt werden, und das Ergebnis ist das gleiche, als wäre es nur einmal ausgeführt worden. In der Arithmetik ist das Hinzufügen von Null zu einer Zahl idempotent.

Über Idempotenz wird im Zusammenhang mit "RESTful" -Webdiensten viel gesprochen. REST versucht, HTTP maximal zu nutzen, um Programmen Zugriff auf Webinhalte zu gewähren, und wird normalerweise im Gegensatz zu SOAP-basierten Webdiensten festgelegt, die nur Dienste im Stil von Remoteprozeduraufrufen in HTTP-Anforderungen und -Antworten tunneln.

REST organisiert eine Webanwendung in "Ressourcen" (wie ein Twitter-Benutzer oder ein Flickr-Bild) und verwendet dann die HTTP-Verben POST, PUT, GET und DELETE, um diese Ressourcen zu erstellen, zu aktualisieren, zu lesen und zu löschen.

Idempotenz spielt bei REST eine wichtige Rolle. Wenn Sie eine Darstellung einer REST-Ressource erhalten (z. B. ein JPEG-Bild von Flickr abrufen) und der Vorgang fehlschlägt, können Sie den GET einfach immer wieder wiederholen, bis der Vorgang erfolgreich ist. Für den Webdienst spielt es keine Rolle, wie oft das Bild abgerufen wird. Wenn Sie einen RESTful-Webdienst zum Aktualisieren Ihrer Twitter-Kontoinformationen verwenden, können Sie die neuen Informationen auch so oft wie nötig eingeben, um eine Bestätigung vom Webdienst zu erhalten. Tausendmaliges Setzen ist dasselbe wie einmaliges Putten. In ähnlicher Weise entspricht das tausendmalige Löschen einer REST-Ressource dem einmaligen Löschen. Idempotenz erleichtert somit die Erstellung eines Webdienstes, der gegenüber Kommunikationsfehlern widerstandsfähig ist.

Weiterführende Literatur: RESTful Web Services von Richardson und Ruby (Idempotenz wird auf Seite 103-104 beschrieben) und Roy Fieldings Dissertation über REST . Fielding war einer der Autoren von HTTP 1.1, RFC-2616, der in Abschnitt 9.1.2 über Idempotenz spricht .


Klar und unkompliziert. Dies ist jedoch nur eine Interpretation von idempotent.
Pacerier

10
"idempotence" ist ein stark überladenes Wort, weil es großartig klingt und genügend Zeichen hat, um den sesquipedalischen Scheck zu bestehen. Wenn Benjamin Peirce ein einfacher klingendes Wort gewählt hätte, hätten wir diese Frage heute nicht einmal.
Pacerier

2
Wie man es versteht: In ähnlicher Weise ist das tausendmalige Löschen einer REST-Ressource dasselbe wie das einmalige Löschen ? Sie können die Ressource nicht erneut löschen, wenn sie bereits gelöscht wurde.
Grün

1
@Green aber nicht löschen es das erste Mal. Sie senden eine Löschanforderung . Der wichtige Punkt ist, dass Sie so viele Anfragen senden können, wie Sie möchten.
Caleth

1
@ JimFerrans Ich verstehe. Ich dachte, es könnte einen funktionsbezogenen Grund (in das HTTP selbst integriert) geben, warum PUT ohne Sorgen erneut gesendet werden kann, während POST dies nicht kann. Nun scheint es, dass wir einfach die HTTP-Standards
einhalten müssen

109

Unabhängig davon, wie oft Sie die Operation aufrufen, ist das Ergebnis dasselbe.


8
Ich habe gehört, dass idempotent als einer oder beide der folgenden Punkte definiert ist: 1) Für einen bestimmten Satz von Eingängen wird immer der gleiche Ausgang zurückgegeben. 2) Verursacht keine Nebenwirkungen. Meine Frage ist, ob eine Funktion, die mit # 1 übereinstimmt, aber nicht mit # 2, weil sie zu einem Nebeneffekt führt, der nicht mit der Berechnung zusammenhängt (protokolliert beispielsweise die Anforderung in einem Datenspeicher). Wird sie immer noch als idempotent angesehen?
Keith Bennett

12
Das Ergebnis des Aufrufs einer Operation muss den Status des Systems enthalten. Wenn die Operation also eine kumulative Nebenwirkung hat, ist sie nicht idempotent. Wenn der Nebeneffekt das System jedoch im selben Zustand belässt, unabhängig davon, wie oft die Operation aufgerufen wird, kann dies idempotent sein.
Robert

4
Kurz und bündig, ich liebe diese Art von Antwort. Ich bin mir nicht sicher, warum ich diesen Begriff ständig nachschlagen muss, er bleibt einfach nicht bei mir.
Prancer

1
@ KeithBennett, Die zweite Definition ist falsch. "Keine Nebenwirkung" bedeutet nicht idempotent. Idempotente Funktionen können Nebenwirkungen haben. ZB MySQL's truncateund delete.
Pacerier

Das Ergebnis ist das gleiche (dh der Systemstatus), die Antwort kann jedoch variieren (dh HTTP-Statuscodes in einem REST-Service).
G. Steigert

50

Idempotenz bedeutet, dass das einmalige oder mehrfache Anwenden einer Operation den gleichen Effekt hat.

Beispiele:

  • Multiplikation mit Null. Egal wie oft Sie es tun, das Ergebnis ist immer noch Null.
  • Setzen eines Booleschen Flags. Egal wie oft Sie es tun, das Flag bleibt gesetzt.
  • Löschen einer Zeile aus einer Datenbank mit einer bestimmten ID. Wenn Sie es erneut versuchen, ist die Zeile immer noch weg.

Für reine Funktionen (Funktionen ohne Nebenwirkungen) impliziert Idempotenz, dass f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) ) = ...... für alle Werte von x

Bei Funktionen mit Nebenwirkungen bedeutet Idempotenz außerdem, dass nach der ersten Anwendung keine zusätzlichen Nebenwirkungen verursacht werden. Sie können den Zustand der Welt als zusätzlichen "versteckten" Parameter für die Funktion betrachten, wenn Sie möchten.

Beachten Sie, dass in einer Welt, in der gleichzeitig Aktionen ausgeführt werden, möglicherweise keine Operationen mehr ausgeführt werden, die Sie für idempotent hielten (z. B. könnte ein anderer Thread den Wert des Booleschen Flags im obigen Beispiel deaktivieren). Grundsätzlich müssen Sie, wenn Sie Parallelität und veränderlichen Zustand haben, viel genauer über Idempotenz nachdenken.

Idempotenz ist oft eine nützliche Eigenschaft beim Aufbau robuster Systeme. Wenn beispielsweise das Risiko besteht, dass Sie eine doppelte Nachricht von einem Drittanbieter erhalten, ist es hilfreich, den Nachrichtenhandler als idempotente Operation zu verwenden, damit der Nachrichteneffekt nur einmal auftritt.


1
Wenn für reine Funktionen f(x) = f(f(x)), meinen Sie, dass dies f(x){return x+1;}keine reine Funktion ist? weil f(x) != f(f(x)): f(1)gibt 2, während f(2)gibt 3.
Pacerier

1
@Pacerier Nein, @mikera sagt, rein und idempotent impliziert f(x) = f(f(x)). Aber wie @GregHewgill erwähnt hat, müssen Sie, damit diese Definition Sinn macht, xals Objekt und fals Operation betrachten, die den Zustand des Objekts mutiert (dh die Ausgabe von fist mutiert x).
Justin J Stark


16

Ich wollte nur einen echten Anwendungsfall rauswerfen, der Idempotenz demonstriert. Angenommen, Sie definieren in JavaScript eine Reihe von Modellklassen (wie im MVC-Modell). Die Art und Weise, wie dies häufig implementiert wird, entspricht funktional so etwas (grundlegendes Beispiel):

function model(name) {
  function Model() {
    this.name = name;
  }

  return Model;
}

Sie können dann neue Klassen wie folgt definieren:

var User = model('user');
var Article = model('article');

Aber wenn Sie versuchen würden, die UserKlasse model('user')von irgendwo anders im Code zu erhalten, würde dies fehlschlagen:

var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');

Diese beiden UserKonstruktoren wären unterschiedlich. Das ist,

model('user') !== model('user');

Um es idempotent zu machen , fügen Sie einfach eine Art Caching-Mechanismus hinzu, wie folgt:

var collection = {};

function model(name) {
  if (collection[name])
    return collection[name];

  function Model() {
    this.name = name;
  }

  collection[name] = Model;
  return Model;
}

Wenn Sie Caching hinzufügen, ist es jedes Mal model('user')dasselbe Objekt, und daher ist es idempotent. Damit:

model('user') === model('user');

10

Eine idempotente Operation ist eine Operation, Aktion oder Anforderung, die mehrmals angewendet werden kann, ohne das Ergebnis, dh den Status des Systems, über die ursprüngliche Anwendung hinaus zu ändern.

BEISPIELE (WEB APP CONTEXT):

IDEMPOTENT: Das Erstellen mehrerer identischer Anforderungen hat den gleichen Effekt wie das Erstellen einer einzelnen Anforderung. Eine Nachricht in einem E-Mail-Nachrichtensystem wird geöffnet und in der Datenbank als "geöffnet" markiert. Man kann die Nachricht viele Male öffnen, aber diese wiederholte Aktion führt immer nur dazu, dass sich diese Nachricht im "geöffneten" Zustand befindet. Dies ist eine idempotente Operation. Wenn Sie zum ersten Mal eine Aktualisierung einer Ressource unter Verwendung von Informationen durchführen, die nicht mit der Ressource (dem Status des Systems) übereinstimmen, ändert sich der Status des Systems, wenn die Ressource aktualisiert wird. Wenn ein PUT dasselbe Update wiederholt an eine Ressource sendet, stimmen die Informationen im Update mit den Informationen überein, die sich bei jedem PUT bereits im System befinden, und es erfolgt keine Änderung des Systemstatus. Wiederholte PUTs mit denselben Informationen sind idempotent:

NON-IDEMPOTENT: Wenn eine Operation immer eine Statusänderung verursacht, z. B. das wiederholte Versenden derselben Nachricht an einen Benutzer, was dazu führt, dass jedes Mal eine neue Nachricht gesendet und in der Datenbank gespeichert wird, wird die Operation als NON-IDEMPOTENT bezeichnet.

NULLIPOTENT: Wenn eine Operation keine Nebenwirkungen hat, z. B. das reine Anzeigen von Informationen auf einer Webseite ohne Änderung in einer Datenbank (mit anderen Worten, Sie lesen nur die Datenbank), wird die Operation als NULLIPOTENT bezeichnet. Alle GETs sollten nullipotent sein.

Wenn wir über den Zustand des Systems sprechen, ignorieren wir offensichtlich hoffentlich harmlose und unvermeidliche Effekte wie Protokollierung und Diagnose.


9

Idempotente Operationen: Operationen, die keine Nebenwirkungen haben, wenn sie mehrmals ausgeführt werden.
Beispiel : Eine Operation, die Werte aus einer Datenressource abruft und diese beispielsweise druckt.

Nicht-dempotente Operationen: Operationen, die bei mehrmaliger Ausführung Schaden anrichten würden. (Da sie einige Werte oder Zustände ändern)
Beispiel: Eine Operation, die von einem Bankkonto abgebucht wird


3
Eigentlich eine falsche Antwort! Für die Idempotente Operation ist es nicht richtig zu sagen, "keine Nebenwirkungen zu haben". Für die nicht-idempotenten Operationen ist die Aussage "etwas Schaden anrichten" eine verwirrende Antwort.
Saeed Mohtasham

9

Ziemlich detaillierte und technische Antworten. Fügen Sie einfach eine einfache Definition hinzu.

Idempotent = Wiederholbar

Beispielsweise kann Createnicht garantiert werden , dass die Operation an sich fehlerfrei ausgeführt wird, wenn sie mehrmals ausgeführt wird. Wenn es jedoch eine Operation gibt, wird die CreateOrUpdateWiederholbarkeit (Idempotenz) angegeben.


3
Dies ist eine trügerische Definition. Die Wiederholbarkeit garantiert nicht, dass sie idempotent ist. Eine Operation kann erneut ausgeführt werden und in jedem Lauf zusätzliche Effekte zum Ergebnis hinzufügen, sodass sie nicht idempotent ist.
Saeed Mohtasham

7

Eine idempotente Operation über eine Menge lässt ihre Mitglieder unverändert, wenn sie einmal oder mehrmals angewendet wird.

Es kann eine unäre Operation wie Absolut (x) sein, bei der x zu einer Menge positiver Ganzzahlen gehört. Hier ist absolut (absolut (x)) = x.

Es kann eine binäre Operation sein, bei der die Vereinigung einer Menge mit sich selbst immer dieselbe Menge zurückgibt.

Prost


Eine idempotente Operation ist eine, bei der f (f (x)) = f (x) ist. "Lässt seine Mitglieder unverändert" ist keine richtige Antwort.
Saeed Mohtasham

7

Es ist jede Operation, bei der jedes n-te Ergebnis zu einer Ausgabe führt, die dem Wert des ersten Ergebnisses entspricht. Zum Beispiel ist der Absolutwert von -1 1. Der Absolutwert des Absolutwerts von -1 ist 1. Der Absolutwert des Absolutwerts des Absolutwerts von -1 ist 1. Und so weiter.

Siehe auch: Wann wäre eine wirklich dumme Zeit, um Rekursion zu verwenden?


1
es ist auch nach 10 Jahren eine markige Antwort. +1
snr

3

Ein gutes Beispiel für das Verständnis einer idempotenten Operation könnte das Sperren eines Autos mit einem Fernschlüssel sein.

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

lockist eine idempotente Operation. Selbst wenn bei jedem lockFahren Nebenwirkungen auftreten , wie z. B. Blinken, befindet sich das Auto immer noch im selben gesperrten Zustand, unabhängig davon, wie oft Sie den Sperrvorgang ausführen.


1

my 5c: Bei der Integration und Vernetzung ist die Idempotenz sehr wichtig. Einige Beispiele aus der Praxis: Stellen Sie sich vor, wir liefern Daten an das Zielsystem. Daten, die von einer Folge von Nachrichten geliefert werden. 1. Was würde passieren, wenn die Sequenz im Kanal gemischt wird? (Wie Netzwerkpakete immer :)). Wenn das Zielsystem idempotent ist, ist das Ergebnis nicht anders. Wenn das Zielsystem von der richtigen Reihenfolge in der Sequenz abhängt, müssen wir einen Resequencer am Zielstandort implementieren, der die richtige Reihenfolge wiederherstellen würde. 2. Was würde passieren, wenn die Nachricht doppelt vorhanden wäre? Wenn der Kanal des Zielsystems nicht rechtzeitig bestätigt, sendet das Quellsystem (oder der Kanal selbst) normalerweise eine weitere Kopie der Nachricht. Infolgedessen können auf der Zielsystemseite doppelte Nachrichten angezeigt werden. Wenn das Zielsystem idempotent ist, es kümmert sich darum und das Ergebnis wird nicht anders sein. Wenn das Zielsystem nicht idempotent ist, müssen wir den Deduplikator auf der Zielsystemseite des Kanals implementieren.


Die Idempotenz einzelner Anforderungen, die isoliert von anderen Anforderungen gesendet werden (oder alles andere, was den Status des Systems ändert), ist nicht dasselbe wie das Neuordnen von Anforderungen. Eine HTTP-PUT-Anforderung und eine HTTP-DELETE-Anforderung sollten beide einzeln idempotent sein - dies bedeutet jedoch nicht, dass die Reihenfolge des Aufrufs von PUT und DELETE unter derselben URL keine Rolle spielt, da die PUT-Anforderung möglicherweise Nebenwirkungen hat!
Robin Green

1

Kurz gesagt , Idempotente Operationen bedeuten, dass die Operation nicht zu unterschiedlichen Ergebnissen führt, unabhängig davon, wie oft Sie die idempotenten Operationen ausführen.

Zum Beispiel sind gemäß der Definition der Spezifikation von HTTP GET, HEAD, PUT, and DELETEidempotente Operationen; jedoch POST and PATCHist es nicht. Deshalb wird manchmal POSTdurch ersetzt PUT.


-4

Wiederholungssicher.

Ist normalerweise der einfachste Weg, seine Bedeutung in der Informatik zu verstehen.


1
Wiederholen impliziert etwas, das beim ersten oder vorherigen Mal fehlgeschlagen ist. Nicht ganz das Gleiche.
Lasse V. Karlsen

Wer hat meine Frage bearbeitet und mir eine Abwertung gegeben? Das ist nicht der Text, den ich gepostet habe?
Teknopaul

Sie können das Bearbeitungsprotokoll überprüfen, indem Sie auf den Link unter Ihrer Antwort klicken, der "Vor X Stunden bearbeitet" oder ähnliches lautet.
Lasse V. Karlsen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.