Playbook
Taxonomie der Zahlungsfehler (Taxonomie Der Zahlungsfehler)
Ein Timeout, ein 429, ein 5xx, eine Business-Ablehnung und ein Infrastrukturfehler sind nicht dasselbe. Jede Kategorie braucht ihre eigene Retry-Strategie.
Verteilte Payment Engine (Distributed Payment Engine)
Teil 11 von 22
Serie zur verteilten Payment-Architektur — die Lücke zwischen Capture und Complete.
Im vorherigen Teil haben wir gesehen, wie semantische Events wie PaymentFailed die Statuscodes des Providers verbergen. Doch ein einzelnes PaymentFailed-Event reicht nicht aus, denn das Wort 'fehlgeschlagen' umfasst sehr unterschiedliche Realitäten.
Eine abgelehnte Karte, ein Netzwerk-Timeout, ein PSP, der 429 zurückgibt, und ein PSP, der 500 zurückgibt, sehen alle wie 'Fehler' aus — doch jeder verlangt eine völlig andere Reaktion. Dieser Teil baut eine Taxonomie, die diese Unterschiede sichtbar macht.
PaymentFailed
├─ Business Decline (Karte abgelehnt — nicht wiederholen)
├─ Timeout (unklares Ergebnis — vorsichtig wiederholen)
├─ Rate Limited (429) (zu viele Anfragen — mit Backoff wiederholen)
└─ Infrastructure (5xx) (Fehler beim Provider — wiederholen)
Wo die Begriffe zuerst auftauchen
📦 Business Decline
Der PSP lehnt die Anfrage aus einem Grund ab, der mit der Karte selbst zusammenhängt: Guthaben, Betrugsverdacht.
📦 Transienter Fehler
Ein vorübergehender Fehler, bei dem ein erneuter Versuch sinnvoll ist: Timeout, 5xx, 429.
📦 Permanenter Fehler
Ein Fehler, bei dem ein erneuter Versuch nichts ändert: eine ungültige Kartennummer, eine nicht unterstützte Währung.
📦 Unklares Ergebnis
Ein Zustand, in dem unbekannt ist, ob die Anfrage den PSP überhaupt erreicht hat: ein Verbindungs-Timeout.
Einen Business Decline zu wiederholen verschwendet Zeit; ein unklares Ergebnis nicht zu wiederholen riskiert eine tatsächlich verpasste Zahlung. Die Taxonomie trennt genau diese beiden Risiken.
Die vier Grundkategorien
Business Decline: Der PSP hat die Anfrage empfangen, verarbeitet und eine Entscheidung getroffen — die Karte wurde abgelehnt. Das ist kein Systemfehler, sondern eine Geschäftsentscheidung. Ein erneuter Versuch ändert nichts; der Kunde sollte eine andere Zahlungsmethode angeboten bekommen.
Timeout / unklares Ergebnis: Die Anfrage wurde gesendet, aber keine Antwort kam an. Die Gefahr hier: Die Zahlung könnte beim PSP bereits erfolgt sein — nur die Antwort ist bei Ihnen verloren gegangen. Diese Kategorie darf nicht blind wiederholt werden; zuerst muss der tatsächliche Status abgefragt werden (mit dem Idempotency Key), erst dann entschieden werden.
Rate Limited (429): Der PSP lehnt Sie vorübergehend ab, um das Anfragevolumen zu steuern. Das ist kein Fehler, sondern ein Signal. Ein sofortiger erneuter Versuch verschlimmert die Lage; es muss mit Backoff gewartet werden.
Infrastructure (5xx): Auf der Seite des PSP ist etwas fehlgeschlagen. Die Anfrage wurde nicht verarbeitet, ein erneuter Versuch ist meist sicher — aber anhaltende 5xx-Antworten sind ein Signal für einen Circuit Breaker.
Fehler empfangen
│
├─ Hat der PSP die Anfrage klar abgelehnt? → Business Decline → nicht wiederholen
│
├─ Kam gar keine Antwort? → Unklares Ergebnis → zuerst Status abfragen
│
├─ Ist es ein 429? → Rate Limited → mit Backoff wiederholen
│
└─ Ist es ein 5xx? → Infrastructure → wiederholen, aber Circuit Breaker beobachten
Warum eine einzige 'einfach wiederholen'-Regel scheitert
Ein Worker, der jeden Fehler gleich behandelt, scheitert auf zwei Arten: Er wiederholt Business Declines sinnlos (verzögert die Nutzererfahrung, belastet manchmal Kartennetzwerklimits) — oder er lässt unklare Ergebnisse gänzlich unwiederholt (das System vergisst eine tatsächlich erfolgreiche Zahlung). Die Taxonomie verringert beide Risiken, indem sie jeden Fehler in die richtige Kategorie einordnet.
Die Taxonomie im Code abbilden
Das Feld failureReason des semantischen Events sollte eine dieser vier Kategorien tragen, niemals den rohen Fehlertext des Providers. Das Provider-Gateway ist für dieses Mapping verantwortlich — eine Erweiterung des Translators aus dem vorherigen Teil.
| failureReason | Wiederholung sinnvoll | Aktion |
|---|---|---|
| BusinessDecline | Nein | Andere Zahlungsmethode anbieten |
| AmbiguousTimeout | Erst abfragen | Status prüfen, dann entscheiden |
| RateLimited | Ja | Mit Backoff wiederholen |
| InfrastructureError | Ja | Wiederholen + Circuit Breaker beobachten |
Häufig verwechselte Unterschiede
❌ Jeder Fehler sollte wiederholt werden
✓ Ein Business Decline sollte niemals wiederholt werden; das Ergebnis ändert sich nicht
❌ Timeout = kein Fehler, einfach wiederholen
✓ Timeout = Unklarheit; der echte Status muss zuerst abgefragt werden
❌ Ein 429 ist ein Fehler
✓ Ein 429 ist ein Signal — das System verlangsamt Sie absichtlich
Schneller Vergleich der Kategorien
| Kategorie | Ergebnis bekannt | Wiederholung sinnvoll | Typische Ursache |
|---|---|---|---|
| Business Decline | ja | nein | Karte, Guthaben, Betrug |
| Timeout | nein | erst abfragen | Netzwerk, PSP-Langsamkeit |
| Rate Limited | ja | ja (mit Wartezeit) | Volumensteuerung |
| Infrastructure | ja | ja | Fehler beim Provider |
Checkliste beim Aufbau der Taxonomie
- Ist jeder vom Provider zurückgegebene Fehlercode explizit einer der vier Kategorien zugeordnet?
- Was passiert bei einem noch nicht zugeordneten Fehlercode — wird standardmäßig zuerst abgefragt oder blind wiederholt? (Der richtige Standard: erst abfragen.)
- Wird bei Timeouts vor jedem erneuten Versuch tatsächlich eine Statusabfrage durchgeführt?
- Berücksichtigt die 429-Backoff-Dauer den
Retry-After-Header des PSP, falls vorhanden? - Wird die 5xx-Häufigkeit als Metrik überwacht, die einen Circuit Breaker auslösen kann?
- Gerät der Nutzerfluss nach einem Business Decline jemals versehentlich in die Retry-Schleife?
Was bleiben soll
- 'Fehlgeschlagen' ist kein einziger Zustand, sondern mindestens vier unterschiedliche Realitäten mit vier unterschiedlichen Aktionen.
- Business Declines werden niemals wiederholt; Timeouts werden niemals blind wiederholt, sondern zuerst abgefragt.
- Ein 429 ist ein Signal, ein 5xx ist ein Fehler; beide werden wiederholt, aber mit unterschiedlicher Disziplin.
- Die Taxonomie macht einen Fehler aus Ihrem eigenen
failureReason-Enum lesbar, nicht aus dem rohen Providertext.
Eine Retry-Strategie, die ohne Verständnis des Fehlers geschrieben wurde, ist nicht nur nutzlos — sie schadet still.
Der nächste Teil baut für jede dieser vier Kategorien den eigentlichen Retry-Algorithmus: Backoff, Jitter, Caps und Circuit Breaker.
FAQ
Häufige Fragen
Was ist Business Decline?
Der PSP lehnt die Anfrage aus einem Grund ab, der mit der Karte selbst zusammenhängt: Guthaben, Betrugsverdacht.
Was ist Transienter Fehler?
Ein vorübergehender Fehler, bei dem ein erneuter Versuch sinnvoll ist: Timeout, 5xx, 429.
Stimmt es, dass „Jeder Fehler sollte wiederholt werden“?
Ein Business Decline sollte niemals wiederholt werden; das Ergebnis ändert sich nicht
Was legt dieser Teil fest?
Eine abgelehnte Karte, ein Netzwerk-Timeout, ein PSP, der 429 zurückgibt, und ein PSP, der 500 zurückgibt, sehen alle wie 'Fehler' aus — doch jeder verlangt eine völlig andere Reaktion. Dieser Teil baut eine Taxonomie, die diese Unterschiede sichtbar macht. 'Fehlgeschlagen' ist kein einziger Zustand, sondern mindestens vier unterschiedliche Realitäten mit vier unterschiedlichen Aktionen. Im vorherigen Teil haben wir gesehen, wie semantische Events wie `PaymentFailed` die Statuscodes des Providers verbergen. Doch ein einzelnes `PaymentFailed`-Event reicht nicht aus, denn das Wort 'fehlgeschlagen' umfasst sehr unterschiedliche Realitäten.
Gelernte Engineering-Prinzipien
- Fehlgeschlagen ist kein einziger Zustand; jede Kategorie braucht eine andere Aktion.
- Ein unklares Ergebnis wird abgefragt, niemals blind wiederholt.
- Ein 429 ist ein Signal, kein Fehler — es wird diszipliniert abgewartet.
Weiterlesen
Weiterlesen
Nachster Teil der Serie
Retry-Algorithmen für Payment-Worker
Exponential Backoff, Jitter, Caps, der Unterschied zwischen Retry und Defer sowie Circuit Breaker — die Taxonomie aus dem vorherigen Teil wird zu…
Nachster Teil der Serie
Semantische Events statt roher Provider-Payloads
Sollte der Webhook, den das Provider-Gateway empfängt, mit dem eigenen Event-Namen des PSP weitergegeben werden — oder als semantisches Event wie…
Aus derselben Serie
Provider-Abstraktion ohne SDK (Software Development Kit)-Leckage
Wie das Provider-Gateway das PSP-SDK besitzt, während der Checkout-Orchestrator nur eine semantische Schnittstelle sieht — und warum Karten- und…