Kurz erklärt
Idempotenz beschreibt eine Eigenschaft von Operationen, die für die Stabilität verteilter Systeme entscheidend ist: Eine Operation ist idempotent, wenn ihre mehrfache Ausführung exakt denselben Effekt hat wie ihre einmalige Ausführung. Du kannst sie also beliebig oft wiederholen, ohne dass sich am Endzustand etwas ändert.
Das klingt akademisch, hat aber sehr handfeste Konsequenzen: Idempotenz ist der Mechanismus, der verhindert, dass ein Kunde versehentlich zweimal belastet wird, wenn das Netzwerk während einer Zahlung kurz aussetzt. Für jeden, der eine API betreibt, über die Geld, Bestellungen oder andere kritische Vorgänge laufen, ist Idempotenz keine Kür, sondern Pflicht.
Warum Idempotenz im Netzwerk so wichtig ist
Verteilte Systeme haben ein grundlegendes Problem: Wenn ein Client eine Anfrage schickt und keine Antwort bekommt, weiß er nicht, ob die Anfrage angekommen und verarbeitet wurde oder ob sie unterwegs verloren ging. Die Antwort könnte ebenso verloren gegangen sein wie die Anfrage selbst. Der Client steht vor einer unangenehmen Wahl: nicht erneut senden (und riskieren, dass die Operation nie ausgeführt wurde) oder erneut senden (und riskieren, sie doppelt auszuführen). Genau hier löst Idempotenz das Dilemma: Ist die Operation idempotent, kann der Client gefahrlos so oft wiederholen, bis er eine Bestätigung erhält. Im schlimmsten Fall wurde die Operation mehrfach empfangen, aber nur einmal wirksam.
Man unterscheidet dabei gern drei Zustellgarantien: "At-most-once" (höchstens einmal, aber möglicherweise gar nicht), "At-least-once" (mindestens einmal, aber möglicherweise doppelt) und "Exactly-once" (genau einmal). Echtes "Exactly-once" ist auf Netzwerkebene extrem schwer bis unmöglich zu garantieren. Der pragmatische und in der Industrie überwiegend genutzte Weg ist deshalb: "At-least-once"-Zustellung kombiniert mit idempotenter Verarbeitung. Das Ergebnis fühlt sich für den Anwender wie "Exactly-once" an, ist aber technisch deutlich einfacher und zuverlässiger umzusetzen. Idempotenz ist damit der praktische Schlüssel zu einer Garantie, die sonst kaum erreichbar wäre.
Dieses Muster steckt überall in zuverlässiger Software: in automatischen Retry-Mechanismen, in Message-Queues mit "At-least-once"-Zustellung, in Webhook-Empfängern und in Zahlungs-Pipelines. Ohne Idempotenz führt jeder dieser Wiederholungsmechanismen früher oder später zu Doppelbuchungen, doppelten Bestellungen oder inkonsistenten Datenständen.
Ein konkretes Szenario aus dem Onlinehandel
Stell dir einen Kunden vor, der im Checkout auf "Jetzt kaufen" klickt. Die Anfrage erreicht deinen Server, die Bestellung wird angelegt und die Zahlung ausgelöst — doch genau in diesem Moment bricht die Mobilfunkverbindung des Kunden ab, bevor die Erfolgsmeldung bei ihm ankommt. Der Kunde sieht einen Ladekreis, wird ungeduldig und klickt erneut. Ohne Schutzmechanismus legt dein System jetzt eine zweite Bestellung an und bucht ein zweites Mal ab. Das Resultat: ein verärgerter Kunde, ein Support-Ticket, eine Rücküberweisung und im schlimmsten Fall eine negative Bewertung. Mit Idempotenz dagegen erkennt der Server die Wiederholung, liefert das Ergebnis der ersten Bestellung zurück und der Kunde sieht einfach seine Bestellbestätigung — als wäre nichts gewesen. Genau dieser unsichtbare Schutz ist es, der robuste Systeme von fragilen unterscheidet.
Idempotente und nicht-idempotente HTTP-Methoden
Im Kontext einer REST-API ist genau definiert, welche HTTP-Methoden idempotent sein sollen:
- GET, HEAD, OPTIONS — idempotent und zusätzlich "sicher" (verändern den Zustand gar nicht).
- PUT — idempotent: Dieselbe Ressource mit denselben Daten zu überschreiben, führt immer zum selben Ergebnis.
- DELETE — idempotent: Eine bereits gelöschte Ressource erneut zu löschen, ändert nichts mehr am Zustand.
- POST — nicht idempotent: Zweimal gesendet, entstehen zwei Datensätze. Genau das macht POST gefährlich bei Wiederholungen.
- PATCH — nicht garantiert idempotent: hängt davon ab, wie das Update formuliert ist (ein absolutes "setze Preis auf 10 Euro" ist idempotent, ein relatives "erhöhe Preis um 10 Prozent" nicht).
Diese Festlegung stammt aus der HTTP-Spezifikation und ist keine Empfehlung, sondern ein Vertrag: Clients, Proxies und Caches verlassen sich darauf. Ein Proxy darf eine fehlgeschlagene GET-Anfrage automatisch wiederholen, weil GET als idempotent gilt — bei POST wäre das fatal.