Wie lässt sich eine idempotente API-Schnittstelle für kritische Transaktionen in einer verteilten Architektur sicherstellen?

Die Sicherstellung der Idempotenz in verteilten Systemen erfolgt primär über die Implementierung eines Idempotency-Keys. Der Client generiert für jede kritische Transaktion eine eindeutige Kennung (z. B. eine UUIDv4) und übermittelt diese im HTTP-Header. Der Server nutzt diesen Key, um den Status der Anfrage in einem Idempotency-Store zu verfolgen.

Der technische Workflow gliedert sich in folgende Schritte:

  1. Prüfung: Der Server prüft, ob der Key bereits existiert.
  2. Verarbeitung: Falls der Key neu ist, wird ein Datensatz mit dem Status PROCESSING angelegt und die Transaktion gestartet.
  3. Abschluss: Nach erfolgreichem Abschluss wird das Ergebnis sowie der HTTP-Statuscode im Store gespeichert und der Status auf COMPLETED gesetzt.
  4. Wiederholung: Bei einem erneuten Request mit demselben Key liefert der Server direkt die gespeicherte Antwort aus dem Store zurück, ohne die Logik erneut zu triggern.

Zur technischen Umsetzung nutzen wir folgende Komponenten:

KomponenteFunktionImplementierungsempfehlung
Idempotency KeyEindeutige IdentifikationUUIDv4 im Request-Header (Idempotency-Key)
Idempotency StoreStatus- und Response-SpeicherRedis (für Performance) oder SQL (für Persistenz)
Distributed LockVermeidung von Race ConditionsRedlock oder optimistisches Locking in der DB
Transactional OutboxKonsistenz bei Event-VersandOutbox-Tabelle innerhalb der Primär-Datenbank

Die Wahl der Speicherstrategie und die Definition der TTL (Time-to-Live) für die Keys hängen von der geforderten Latenz und den regulatorischen Anforderungen ab, was wir im Rahmen unserer IT-Consulting & Digitale Strategie individuell bewerten.

Um Race Conditions zu vermeiden, bei denen zwei identische Requests zeitgleich eingehen, setzen wir auf verteilte Sperren. Nur der erste Request erhält das Lock und darf die Transaktion ausführen; alle nachfolgenden Requests müssen warten oder erhalten einen 409 Conflict Status, bis die erste Verarbeitung abgeschlossen ist.

Wir empfehlen für hochkritische Finanztransaktionen den Einsatz eines relationalen Idempotency-Stores innerhalb derselben Datenbanktransaktion wie die eigentliche Geschäftslogik. Nur durch diese atomare Verknüpfung von Key-Prüfung und Zustandsänderung wird garantiert, dass Netzwerk-Timeouts oder parallele Requests nicht zu inkonsistenten Datenzuständen führen.

Sergej Wiens

Sergej Wiens

Gründer & Software Architekt