Sichere Integration von Drittanbieter‑APIs, damit Ihre App bei Ausfällen weiterläuft. Erfahren Sie, wie Timeouts, Retries, Circuit Breaker und schnelle Checks funktionieren.

Eine Drittanbieter‑API kann auf Arten ausfallen, die nicht wie ein klarer „Ausfall“ aussehen. Das häufigste Problem ist Langsamkeit: Anfragen hängen, Antworten kommen spät und Ihre App wartet weiter. Wenn diese Aufrufe auf dem kritischen Pfad liegen, häuft sich ein kleines Problem außerhalb Ihrer Kontrolle im Inneren Ihres Systems.
So wird ein lokaler Performance‑Einbruch zu einem kompletten Ausfall. Threads oder Worker bleiben wartend hängen, Warteschlangen wachsen, Datenbanktransaktionen dauern länger, und neue Anfragen beginnen zu timeouten. Bald fühlen sich selbst Seiten, die die externe API nicht nutzen, kaputt an, weil das System durch wartende Arbeit überlastet ist.
Die Auswirkungen sind konkret. Ein unzuverlässiger Identitätsanbieter blockiert Registrierungen und Logins. Ein Timeout beim Zahlungsanbieter friert den Checkout ein und lässt Nutzer unsicher, ob abgebucht wurde. Verzögerte Nachrichten stoppen Passwort‑Resets und Bestellbestätigungen, was eine zweite Welle von Wiederholungen und Support‑Tickets auslöst.
Das Ziel ist einfach: externe Fehler isolieren, damit die Kern‑Workflows weiterlaufen. Das kann bedeuten, dass ein Nutzer eine Bestellung aufgeben kann, während Sie die Zahlung später bestätigen, oder dass die Anmeldung gelingt, auch wenn die Willkommensmail fehlschlägt.
Ein praktischer Erfolgsmesser: Wenn ein Provider langsam oder ausgefallen ist, sollte Ihre App trotzdem schnell und klar antworten und der Explosionsradius klein bleiben. Beispielsweise sollten die meisten Kernanfragen weiterhin innerhalb Ihres normalen Latenzbudgets fertig werden, Fehler sich auf Features beschränken, die wirklich von dieser API abhängen, Nutzer einen klaren Status sehen (queued, pending, try again later) und die Wiederherstellung automatisch erfolgen, wenn der Provider zurückkommt.
Die meisten Ausfälle sind vorhersehbar, auch wenn ihr Zeitpunkt es nicht ist. Benennen Sie sie im Voraus, dann können Sie entscheiden, was wiederholt werden soll, was gestoppt wird und was dem Nutzer angezeigt wird.
Die häufigen Kategorien:
Nicht alle Fehler bedeuten dasselbe. Transiente Probleme sind oft einen Retry wert, weil der nächste Aufruf erfolgreich sein kann (Netzwerkstörungen, Timeouts, 502/503 und manche 429s nach Wartezeit). Permanente Probleme lösen sich in der Regel nicht von selbst (ungültige Anmeldeinformationen, falsche Endpunkte, fehlerhafte Anfragen, Berechtigungsverweigerungen).
Alle Fehler gleich zu behandeln verwandelt einen kleinen Vorfall in Downtime. Permanente Fehler immer wieder zu wiederholen verschwendet Zeit, trifft Ratenlimits schneller und baut einen Rückstau auf, der alles andere verlangsamt. Niemals transiente Fehler zu wiederholen zwingt Nutzer, Aktionen zu wiederholen, und verwirft Arbeit, die kurz darauf hätte abgeschlossen werden können.
Geben Sie Workflows besondere Aufmerksamkeit, bei denen eine Pause sich wie ein Abbruch anfühlt: Checkout, Login, Passwort‑Reset und Benachrichtigungen (E‑Mail/SMS/Push). Ein Zwei‑Sekunden‑Spike in einer Marketing‑API ist ärgerlich. Ein Zwei‑Sekunden‑Spike bei der Zahlungsautorisierung blockiert Umsatz.
Ein hilfreicher Test lautet: „Muss dieser Aufruf jetzt unbedingt die Hauptaufgabe des Nutzers abschließen?“ Wenn ja, brauchen Sie enge Timeouts, sorgfältige Wiederholungen und einen klaren Fehlerpfad. Wenn nein, verschieben Sie ihn in eine Warteschlange und halten die App reaktionsfähig.
Ein Timeout ist die maximale Zeit, die Sie warten, bevor Sie abbrechen und weiterziehen. Ohne klares Limit kann ein langsamer Provider wartende Anfragen anhäufen und wichtige Arbeit blockieren.
Es hilft, zwei Arten des Wartens zu trennen:
Zahlen zu wählen ist keine Frage der Perfektion. Es geht darum, menschliche Geduld und Ihren Workflow abzugleichen.
Eine praktische Methode ist, rückwärts vom Erlebnis zu rechnen:
Der Trade‑off ist real. Zu lange Timeouts binden Threads, Worker und Datenbankverbindungen. Zu kurze Timeouts erzeugen falsche Fehler und lösen unnötige Wiederholungen aus.
Retries helfen, wenn ein Fehler wahrscheinlich vorübergehend ist: ein kurzer Netzwerkfehler, DNS‑Hickup oder ein einmaliger 500/502/503. In diesen Fällen kann ein zweiter Versuch gelingen und die Nutzer merken nichts.
Das Risiko ist ein Retry‑Sturm. Wenn viele Clients gleichzeitig fehlschlagen und alle gleichzeitig wiederholen, können sie den Provider (und Ihre eigenen Worker) überlasten. Backoff und Jitter verhindern das.
Ein Retry‑Budget hält Sie ehrlich. Halten Sie die Versuche niedrig und begrenzen Sie die Gesamtzeit, damit Kern‑Workflows nicht wartend blockiert werden.
Wiederholen Sie vorhersehbare Client‑Fehler wie 400/422 Validierungsfehler, 401/403 Auth‑Probleme oder 404 nicht. Diese schlagen sehr wahrscheinlich wieder fehl und erzeugen nur zusätzliche Last.
Noch eine Schutzmaßnahme: Wiederholen Sie Schreib‑Operationen (POST/PUT) nur, wenn Sie Idempotenz implementiert haben, sonst riskieren Sie Doppellasten oder doppelte Datensätze.
Idempotenz bedeutet, dass Sie dieselbe Anfrage zweimal ausführen können und am Ende dasselbe Ergebnis erhalten. Das ist wichtig, weil Retries normal sind: Netzwerke fallen aus, Server starten neu und Clients timeouten. Ohne Idempotenz erzeugt ein „hilfreicher“ Retry Duplikate und reale Geldprobleme.
Stellen Sie sich den Checkout vor: die Zahlungs‑API ist langsam, Ihre App time‑outet und Sie wiederholen. Wenn der erste Aufruf tatsächlich erfolgreich war, könnte der Retry eine zweite Abbuchung erzeugen. Dasselbe Risiko besteht bei Aktionen wie Bestellung anlegen, Abonnement starten, E‑Mail/SMS senden, Rückzahlung veranlassen oder ein Support‑Ticket anlegen.
Die Lösung ist, jeder „mach etwas“‑Anfrage einen Idempotenz‑Schlüssel (oder Request‑ID) beizufügen. Er sollte eindeutig pro Nutzeraktion sein, nicht pro Versuch. Der Provider (oder Ihr eigener Service) nutzt diesen Schlüssel, um Duplikate zu erkennen und dasselbe Ergebnis zurückzugeben, statt die Aktion erneut auszuführen.
Behandeln Sie den Idempotenz‑Schlüssel wie Teil des Datenmodells, nicht wie einen Header, den man hoffentlich nicht vergisst.
Erzeugen Sie einen Schlüssel, wenn der Nutzer die Aktion startet (z. B. beim Klick auf „Bezahlen“), und speichern Sie ihn mit Ihrem lokalen Datensatz.
Bei jedem Versuch:
Wenn Sie der „Provider“ für interne Aufrufe sind, erzwingen Sie dasselbe Verhalten serverseitig.
Ein Circuit Breaker ist ein Schutzschalter. Wenn ein externer Dienst zu oft fehlschlägt, hören Sie für eine kurze Zeit auf, ihn aufzurufen, statt weitere wahrscheinlich zeitintensive Anfragen zu stapeln.
Circuit Breaker haben typischerweise drei Zustände:
Wenn der Breaker offen ist, sollte Ihre App etwas Vorhersehbares tun. Wenn eine Adressvalidierungs‑API bei der Registrierung ausfällt, akzeptieren Sie die Adresse und markieren sie zur späteren Überprüfung. Ist eine Zahlungs‑Risikoüberprüfung down, legen Sie die Bestellung zur manuellen Prüfung in die Queue oder deaktivieren die Option vorübergehend und erklären warum.
Wählen Sie Schwellenwerte, die zum Nutzer‑Impact passen:
Halten Sie Cooldowns kurz (Sekunden bis eine Minute) und begrenzen Sie Half‑Open‑Probes. Das Ziel ist, zuerst Kern‑Workflows zu schützen und dann schnell zu erholen.
Wenn eine externe API langsam oder ausgefallen ist, ist Ihr Ziel, den Nutzer weiterkommen zu lassen. Das heißt, Sie brauchen einen Plan B, der ehrlich erklärt, was passiert ist.
Ein Fallback ist, was Ihre App tut, wenn die API nicht rechtzeitig antwortet. Optionen sind: gecachte Daten verwenden, in einen degradierten Modus wechseln (nicht‑essentielle Widgets ausblenden, optionale Aktionen deaktivieren), den Nutzer nach Eingaben fragen statt die API zu rufen (manuelle Adresseneingabe) oder eine klare Meldung mit dem nächsten Schritt zeigen.
Seien Sie ehrlich: Sagen Sie nicht, etwas sei abgeschlossen, wenn es das nicht ist.
Wenn die Arbeit nicht in der Nutzeranfrage abgeschlossen sein muss, schieben Sie sie in eine Warteschlange und antworten Sie schnell. Übliche Kandidaten: E‑Mails senden, zu einem CRM synchronisieren, Reports erzeugen und Analyse‑Events posten.
Schnell fehlschlagen für Kern‑Aktionen. Wenn eine API nicht erforderlich ist, um den Checkout (oder die Kontoerstellung) abzuschließen, blockieren Sie die Anfrage nicht. Akzeptieren Sie die Bestellung, legen Sie den externen Aufruf in die Queue und gleichen Sie später ab. Wenn die API erforderlich ist (z. B. Zahlungsautorisierung), schlagen Sie schnell mit einer klaren Meldung fehl und lassen den Nutzer nicht ewig warten.
Was der Nutzer sieht, sollte zu dem passen, was hinter den Kulissen passiert: ein klarer Status (completed, pending, failed), ein Versprechen, das Sie halten können (Quittung jetzt, Bestätigung später), eine Möglichkeit zum Retry und ein sichtbarer Eintrag in der UI (Aktivitätsprotokoll, Pending‑Badge).
Ratenbegrenzungen sind die Art eines Providers zu sagen: „Ihr könnt uns anrufen, aber nicht zu oft.“ Sie erreichen sie schneller, als Sie denken: Traffic‑Spikes, gleichzeitig startende Hintergrundjobs oder ein Bug, der bei Fehlern in einer Schleife landet.
Fangen Sie damit an, zu kontrollieren, wie viele Anfragen Sie erzeugen. Batches bilden, Antworten 30–60 Sekunden cachen, wenn es sicher ist, und clientseitig drosseln, damit Ihre App nicht schneller ausbricht, als der Provider erlaubt.
Bei einem 429 Too Many Requests behandeln Sie das als Signal langsamer zu werden.
Retry‑After, wenn er bereitgestellt wird.Begrenzen Sie außerdem Parallelität. Ein einzelner Workflow (z. B. Kontaktsynchronisation) sollte nicht alle Worker‑Slots verbrauchen und kritische Flows wie Login oder Checkout aushungern. Separate Pools oder feature‑basierte Caps helfen.
Jeder Drittanbieter‑Aufruf braucht einen Plan für Fehler. Perfektion ist nicht nötig. Sie brauchen vorhersehbares Verhalten, wenn der Provider einen schlechten Tag hat.
Entscheiden Sie, was passiert, wenn der Aufruf jetzt fehlschlägt. Eine Steuerberechnung beim Checkout ist eventuell must‑have. Das Synchronisieren eines Marketing‑Kontakts kann meist warten. Diese Entscheidung bestimmt den Rest.
Wählen Sie Timeouts pro Aufruftyp und halten Sie sie konsistent. Legen Sie dann ein Retry‑Budget fest, damit Sie eine langsam arbeitende API nicht weiter bearbeiten.
Wenn eine Anfrage etwas erstellen oder Geld abbuchen kann, fügen Sie Idempotency‑Keys hinzu und speichern Sie einen Request‑Datensatz. Wenn eine Zahlungsanfrage time‑outet, darf ein Retry nicht doppelt abbuchen. Tracking hilft dem Support bei der Antwort auf „Ist es durchgegangen?“
Wenn Fehler steigen, hören Sie kurz auf, den Provider aufzurufen. Für must‑have Calls zeigen Sie einen klaren „Erneut versuchen“‑Pfad. Für can‑wait Calls legen Sie die Arbeit in die Queue und verarbeiten sie später.
Messen Sie Latenz, Fehlerquote und Breaker‑Open/Close‑Ereignisse. Alerten Sie bei anhaltenden Änderungen, nicht bei einzelnen Ausreißern.
Die meisten API‑Ausfälle starten nicht groß. Sie werden groß, weil Ihre App auf die schlechtestmögliche Weise reagiert: sie wartet zu lange, retryt zu aggressiv und bindet genau die Worker, die sonst alles am Laufen halten.
Diese Muster verursachen Kaskaden:
Kleine Fixes verhindern große Ausfälle: Retryen Sie nur Fehler, die wahrscheinlich temporär sind (Timeouts, manche 429s, manche 5xx) und begrenzen Sie Versuche mit Backoff und Jitter; halten Sie Timeouts kurz und bewusst; fordern Sie Idempotenz für jede Operation, die erstellt oder belastet; und entwerfen Sie für partielle Ausfälle.
Bevor Sie eine Integration in Produktion bringen, machen Sie einen schnellen Pass mit einer Fail‑First‑Mentalität. Wenn Sie eine Frage nicht mit „ja“ beantworten können, behandeln Sie sie als Release‑Blocker für Kern‑Workflows wie Signup, Checkout oder das Versenden von Nachrichten.
Wenn ein Zahlungsanbieter zu time‑outen beginnt, ist das richtige Verhalten: „Der Checkout lädt weiter, der Nutzer bekommt eine klare Meldung und Sie hängen nicht ewig“, nicht „alles hängt, bis es time‑outet."
Stellen Sie sich einen Checkout vor, der drei Dienste anruft: eine Zahlungs‑API zur Abbuchung, eine Steuer‑API zur Berechnung der Steuer und eine E‑Mail‑API zum Versand der Quittung.
Der Zahlungsaufruf ist der einzige, der synchron sein muss. Probleme bei Steuer oder E‑Mail dürfen den Kauf nicht blockieren.
Angenommen, die Steuer‑API braucht manchmal 8–15 Sekunden. Wartet der Checkout, brechen Nutzer ab und Ihre Worker hängen.
Ein sicherer Ablauf:
Ergebnis: weniger abgebrochene Warenkörbe und weniger festhängende Bestellungen, wenn der Steuer‑Provider langsam ist.
Die Quittungs‑E‑Mail ist wichtig, darf aber nie die Zahlungsabwicklung blockieren. Wenn die E‑Mail‑API ausfällt, sollte der Circuit Breaker nach wenigen schnellen Fehlern öffnen und Aufrufe für eine kurze Cooldown‑Phase stoppen.
Statt E‑Mails inline zu senden, legen Sie einen „Receipt senden“‑Job mit einem Idempotency‑Schlüssel in die Queue (z. B. order_id + email_type). Wenn der Provider down ist, retryt die Queue im Hintergrund und der Kunde sieht trotzdem einen erfolgreichen Kauf.
Ergebnis: weniger Support‑Tickets wegen fehlender Bestätigungen und kein Umsatzverlust durch Checkout‑Fehler aus nicht‑zahlungspflichtigen Gründen.
Wählen Sie einen Workflow, dessen Ausfall am schlimmsten schmerzt (Checkout, Signup, Abrechnung) und machen Sie ihn zur Referenzintegration. Kopieren Sie dann dieselben Defaults überall.
Eine einfache Rollout‑Reihenfolge:
Schreiben Sie Ihre Defaults nieder und behalten Sie sie langweilig: ein Connect‑Timeout, ein Request‑Timeout, maximale Retry‑Anzahl, Backoff‑Bereich, Breaker‑Cooldown und Regeln, was retrybar ist.
Führen Sie einen Fail‑Drill durch, bevor Sie auf den nächsten Workflow ausweiten. Erzwingen Sie Timeouts (oder blockieren Sie den Provider in einer Testumgebung) und prüfen Sie, ob der Nutzer eine nützliche Meldung sieht, Fallbacks funktionieren und wartende Retries sich nicht für immer aufstauen.
Wenn Sie schnell neue Produkte bauen, lohnt es sich, diese Zuverlässigkeits‑Defaults in eine wiederverwendbare Vorlage zu gießen. Für Teams, die Koder.ai (koder.ai) nutzen, heißt das oft, Timeout, Retry, Idempotency und Breaker‑Regeln einmal zu definieren und dann dasselbe Muster beim Generieren neuer Services anzuwenden.