429-Rate-Limit-Handhabung: Warteschlange, Backoff und klare Benutzerzustände
429-Rate-Limit-Handhabung für LLM- und API-Apps: Anfragen in eine Warteschlange, sicheres Backoff und klare Nutzerzustände, damit das Produkt vorhersehbar bleibt.

Was ein 429 wirklich bedeutet (und warum Nutzer es merken)
Ein 429 sagt: langsamer. Sie schicken zu viele Anfragen zu schnell. Meist bedeutet das nicht, dass Ihr Code "falsch" ist. Es heißt, Sie haben ein Limit getroffen, das die Systeme schützt (und manchmal auch Ihr Budget).
Nutzer empfinden schlechten 429-Umgang als besonders nervig, selbst wenn die App größtenteils funktioniert. Die Erfahrung wird unordentlich: ein Spinner, der nie endet, ein Fehler nach langem Warten oder Antworten, die manchmal erscheinen und manchmal fehlschlagen. Das Schlimmste ist die Inkonsistenz. Menschen können nicht vorhersagen, was als Nächstes passiert.
Retries können helfen, aber unbedachte Retries verschlimmern die Lage oft. Wenn jede fehlgeschlagene Anfrage sofort neu versucht wird, erzeugen Sie genau dann einen Traffic-Peak, wenn der Provider Sie bitten will, die Geschwindigkeit zu drosseln. Das kann einen kleinen Aussetzer in einen längeren Ausfall verwandeln und Kontingente schnell verbrauchen.
Das Ziel ist nicht perfekte Geschwindigkeit. Es ist vorhersehbares Verhalten unter Last. Die App sollte sich jedes Mal gleich verhalten, auch wenn die Antwort später kommt.
Ein einfaches Modell sind drei zusammenarbeitende Teile:
- Eine Warteschlange, die Spitzen glättet, statt alles auf einmal abzusetzen
- Backoff (oft exponentiell mit Jitter), damit Retries sich verteilen
- Klare nutzerseitige Zustände, damit Menschen wissen, ob die Anfrage wartet, erneut versucht wird oder eine Aktion nötig ist
Beispiel: Eine Chat-App hat morgens einen Spike. Ohne Kontrolle fallen die Hälfte der Nachrichten zufällig aus. Mit Warteschlange und Backoff dauern Nachrichten vielleicht länger, aber Nutzer sehen „In Warteschlange“ und dann „Erneuter Versuch in 4s.“ Die App wirkt ruhig und zuverlässig statt kaputt.
Woher Rate Limits in realen Apps meist kommen
Die meisten 429s sind keine zufälligen Ausfälle. Sie sind ein Zeichen dafür, dass zu viele Anfragen gleichzeitig ein Limit treffen und Ihre App die Last nicht verteilt hat.
Der häufigste Auslöser ist ein Burst: ein Traffic-Peak nach einem Launch, einem Social-Post oder einem einzelnen großen Kunden, der ein Team einlädt. Batch-Jobs tun das auch, wie Neuindizierung, CSV-Importe oder nächtliches Backfilling von Embeddings.
Es ist auch entscheidend, wessen Limit Sie treffen. Provider setzen oft Caps pro API-Key, pro Account oder pro Region durch. Ihre eigene App kann ebenfalls Limits erzeugen, absichtlich oder versehentlich, z. B. pro Nutzer, pro Workspace oder pro IP-Adresse (besonders wenn viele Nutzer hinter einem Firmen-NAT sitzen).
LLM-Apps haben einige Muster, die Limits schneller erreichen, als man denkt:
- Streaming-Antworten halten Verbindungen länger offen, sodass die Parallelität steigt, selbst wenn die QPS normal aussieht.
- Tool-Aufrufe vervielfachen die Arbeit, weil eine "Antwort" zusätzliche Aufrufe zum Laden von Daten, Ausführen von Funktionen und erneutes Fragen auslöst.
- Bulk-Embeddings sind klassisch: ein einzelner "Dokumente importieren"-Vorgang kann Hunderte von Anfragen in einer engen Schleife feuern.
Versteckte Multiplikatoren sind die üblichen Schuldigen. Ein Klick kann viele nachgelagerte Calls erzeugen:
- Ein Chat-Senden triggert Moderation, die eigentliche Completion und einen Logging-Aufruf
- Eine einzelne Nutzer-Nachricht löst 3–10 Tool-Aufrufe aus, bevor die finale Antwort kommt
- Ein "Retry"-Button feuert sofort und erhöht den Druck
- Ein Seitenladen löst mehrere parallele Requests über Tabs hinweg aus
- Ein Background-Worker wiederholt denselben fehlerhaften Job über viele Accounts
Staging sieht oft gut aus, weil dort ein Nutzer, saubere Daten und keine Cron-Jobs sind. Production hat Parallelität, reale Nutzungsspitzen, lang geöffnete Streaming-Sessions und versehentliche Stürme wie mehrere Worker, die denselben Backfill starten.
Wählen Sie eine klare Policy: retry, delay oder stop
Wenn Sie einen 429 treffen, ist die schlechteste Reaktion "sofort erneut versuchen" ohne Regeln. Das bewirkt, dass der Provider härter zurückdrängt und Ihre App zufällig wirkt. Gutes 429-Handling beginnt mit einer einfachen Policy, an die sich das Team halten kann.
Teilen Sie Anfragen in zwei Buckets auf:
- Interaktive Aktionen (ein Nutzer klickte einen Button)
- Hintergrundarbeit (Syncs, Webhooks, Batch-Jobs)
Interaktive Aktionen brauchen ein kurzes Geduldsfenster und klares Feedback. Hintergrundarbeit kann länger warten, solange sie nicht für immer aufstaut.
Eine praktikable Policy, die Sie später anpassen können:
- Retryen nur, wenn die Anfrage sicher wiederholbar ist (Read-Only-Calls oder Writes mit Idempotency).
- Setzen Sie ein maximales Retry-Fenster (z. B. 10–20 Sekunden für interaktiv, 5–30 Minuten für Hintergrund).
- Stoppen und schlagen schnell fehl, wenn der Nutzer das Problem durch eigenes Verhalten beheben kann (z. B. Spam auf "Regenerate") oder wenn notwendige Eingaben fehlen.
- Verwenden Sie separate Prioritäten: Interaktive Requests gehen zuerst, Hintergrund-Requests weichen, wenn Limits enger werden.
- Loggen Sie Kontext bei jedem 429, damit Sie Muster debuggen können, nicht raten.
Idempotenz macht Retries sicher. Wenn eine Operation etwas erzeugt (Karte belasten, Datensatz anlegen, E-Mail senden), hängen Sie einen Idempotency-Key an, damit ein Retry keine Nebenwirkung dupliziert. Wenn Sie das nicht idempotent machen können, bevorzugen Sie "stoppen und fragen" statt blinder Retries.
Definieren Sie für jede Anfrage, wann sie "done" ist. Eine Anfrage sollte entweder erfolgreich sein, einen klaren Fehler zurückgeben oder nach Ihrem maximalen Retry-Fenster timeouten. Für immer hängen zu bleiben ist das frustrierendste Ergebnis.
Loggen Sie genug, um die Basics zu beantworten: welcher Endpoint wurde getroffen, welcher Nutzer es ausgelöst hat, welche Art von Request (interaktiv vs. Hintergrund), wann er gestartet wurde und wie lange er gewartet hat.
Schritt für Schritt: Fügen Sie eine Warteschlange hinzu, die Spitzen glättet
Der schnellste Weg, 429-Handling zu verbessern, ist, nicht sofort Requests abzufeuern, wenn die UI sie triggert. Legen Sie jeden API-Call in eine Warteschlange. Das verwandelt einen Burst von 50 Klicks in einen kontrollierten Fluss, den der Provider akzeptieren kann.
1) Starten Sie mit einer kleinen Warteschlange zwischen UI und Provider
Halten Sie die erste Version langweilig. Wenn die App das LLM oder eine API aufrufen möchte, erzeugt sie einen Job mit Payload und ein paar Labels (wer hat ihn angefragt, für welchen Screen, wann erstellt). Die UI sendet Jobs in die Queue, nicht direkt an den Provider.
Eine praktische Job-Form enthält: endpoint/model, Prompt oder Parameter-Hash, User-ID, Priorität und einen Retry-Zähler.
2) Fügen Sie einen Worker mit Concurrency-Limit hinzu
Ein Worker zieht Jobs aus der Queue und führt sie aus. Die Schlüsseleinstellung ist die Parallelität: wie viele Jobs gleichzeitig laufen dürfen. Starten Sie niedrig (z. B. 1–3) und erhöhen Sie nur, wenn Sie stabile Ergebnisse sehen.
Ein einfacher Ansatz, der in den meisten Apps funktioniert:
- Verarbeiten Sie nur N Jobs parallel (Ihr Concurrency-Limit)
- Wenn ein Job fertig ist, starten Sie sofort den nächsten
- Wenn ein Job ein 429 erhält, legen Sie ihn mit Verzögerung zurück in die Queue (Backoff kommt später)
- Tracken Sie aktive Jobs, sodass Sie N nie überschreiten
3) Prioritäten: Lassen Sie die App reaktiv bleiben
Nicht alle Anfragen sind gleich. Ein Button, den der Nutzer gerade geklickt hat, sollte vor Hintergrundarbeit wie "Alles zusammenfassen" oder "Wöchentlichen Bericht generieren" springen. Verwenden Sie zuerst zwei Prioritäten (hoch und niedrig). Wenn Ihre Queue es unterstützt, behandeln Sie hohe Priorität als separaten Lane.
4) Dedupe wiederholte Anfragen
Nutzer doppelklicken. Frontends re-rendern. Wenn Sie innerhalb eines kurzen Fensters (z. B. 2–10 Sekunden) identische Prompts senden, mergen Sie sie. Geben Sie das gleiche laufende Ergebnis an alle Aufrufer zurück. Das allein kann das Anfragevolumen stark reduzieren.
5) Persistieren Sie Queue-Zustand, damit Neustarts Arbeit nicht verlieren
Wenn der Server neu startet, dürfen ausstehende Jobs nicht verschwinden oder sich unvorhersehbar wiederholen. Speichern Sie wartende Jobs und ihren Status in dauerhaftem Speicher (DB oder richtiges Queue-System). Hier scheitern viele Prototypen: Requests sind fire-and-forget, und Nutzer sehen fehlende Antworten, Duplikate oder endlose Spinner, wenn Limits getroffen werden.
Schritt für Schritt: Backoff, das Druck reduziert statt erhöht
Gutes 429-Handling bedeutet meist, weniger zu tun, nicht härter zu versuchen. Wenn Sie zu schnell retryen, verwandeln Sie eine kleine Verlangsamung in einen Traffic-Peak und halten Nutzer in einer Schleife gefangen.
Beginnen Sie mit exponentiellem Backoff: nach dem ersten 429 warten Sie ein bisschen, dann länger nach jedem weiteren 429. Eine einfache Regel ist, die Verzögerung jedes Mal zu verdoppeln. Das gibt dem Provider Zeit zur Erholung und verhindert, dass Sie die API weiter zuschlagen.
Fügen Sie Jitter (kleine zufällige Abweichung) zu jeder Wartezeit hinzu. Ohne Jitter werden Tausende Clients, die gleichzeitig das Limit treffen, auch gleichzeitig erneut versuchen und das Limit wieder auslösen. Jitter verteilt die Retries, sodass Ihre App eine Chance hat, erfolgreich zu sein.
Wenn der Provider einen Hinweis wie einen Retry-After-Wert gibt, behandeln Sie ihn als Wahrheit. Nutzen Sie ihn als Basisverzögerung und wenden Sie dann etwas Jitter an.
Setzen Sie klare Obergrenzen, damit Retries nicht ewig laufen:
- Maximale Versuche (z. B. 3–6 Versuche)
- Maximale Verzögerung (z. B. Wartezeiten bei 30–60 Sekunden deckeln)
- Gesamtzeitbudget (z. B. nach 2 Minuten aufgeben)
- Ein Fallback-Pfad (Task speichern, Nutzer später probieren lassen)
Hören Sie auf beim Retryen bei Fehlern, die sich nicht von selbst beheben. Ein 400 schlägt immer fehl. Ein 401/403 bedeutet, Auth ist kaputt. Retry nur, wenn es wahrscheinlich ist, dass es gelingt (429, viele 5xx-Fehler und einige Netzwerk-Timeouts).
Beispiel: Ein Chat trifft bei einem Launch 429s. Versuch 1 wartet 1–2 Sekunden, Versuch 2 wartet 2–4 Sekunden, Versuch 3 wartet 4–8 Sekunden, dann geben Sie auf und zeigen eine klare Meldung, dass das System beschäftigt ist und die Nachricht gesendet wird, sobald sie verfügbar ist.
Nutzerzustände, die die App vorhersehbar machen
Bei einem Rate Limit ist das Schlimmste nicht die Verzögerung. Es ist die Verwirrung. Wenn die UI eingefroren wirkt oder ständig zwischen Fehlern und Spinners wechselt, klicken Nutzer erneut, laden neu oder öffnen einen zweiten Tab. Das erzeugt mehr Anfragen und verlängert das Problem.
Gutes 429-Handling beginnt damit, in einfachem Sprachgebrauch zu benennen, was passiert, und eine klare nächste Option zu geben.
Verwenden Sie eine kleine Menge klarer Zustände
Halten Sie die Zustände in der gesamten App konsistent. Die meisten Teams brauchen nur drei:
- Wartet in der Queue: „Wir stehen in der Reihe, um Ihre Anfrage zu senden.“
- Erneuter Versuch: „Der Provider ist beschäftigt. Wir versuchen es in 10–20 Sekunden erneut.“
- Nochmal versuchen: „Wir konnten das noch nicht senden. Bitte versuchen Sie es jetzt nochmal."
Geben Sie, wann immer möglich, eine grobe Zeitangabe, auch nur als Bereich. Sie können sie an der Position in der Queue messen (z. B. 3 Anfragen vor Ihnen) oder an Ihrem Backoff-Timer. Ein kleiner Countdown hilft Menschen, ohne zu klicken zu warten.
Bieten Sie einen sicheren Abbrechen-Button für lange Wartezeiten an. Erklären Sie in einem Satz, was Abbrechen bedeutet: „Abbrechen stoppt die Retries. Ihr Entwurf bleibt hier, und nichts wird gesendet.“ Wenn Abbrechen Arbeit verlieren würde, sagen Sie das deutlich und bieten Sie stattdessen „Entwurf speichern“ an.
Vermeiden Sie rohe Fehler wie "429" oder "Too Many Requests." Übersetzen Sie es in das, was den Nutzer interessiert: "Der AI-Provider bittet uns langsamer zu arbeiten." Dann bieten Sie eine Aktion an: weiter warten (Standard) oder nochmal versuchen.
Bei Wartezeiten länger als ein paar Sekunden zeigen Sie eine leichte Benachrichtigung, wenn das Ergebnis bereit ist, z. B. ein In-App-Banner „Ihre Antwort ist bereit“ oder eine Status-Änderung an der Nachricht. Das ist besonders in Chats wichtig.
Schützen Sie den Rest Ihrer App, während der Provider langsamer wird
Wenn ein Provider 429s beginnt zu liefern, ist das größte Risiko nicht der fehlgeschlagene Call. Es ist der Nebeneffekt: Threads blockieren, Queues wachsen unbegrenzt und andere Bereiche der App wirken langsam. Gutes 429-Handling geht vor allem um Eindämmung.
Fangen Sie mit Timeouts überall an, wo ein Provider-call hängen bleiben kann. Ein Retry, der ewig wartet, ist nicht geduldig, er blockiert. Halten Sie eine klare Max-Zeit pro Versuch und eine klare maximale Gesamtzeit über alle Retries, damit eine Anfrage nicht den Rest des Systems in Geiselhaft nimmt.
Ein Circuit Breaker hilft bei 429-Spikes. Statt jede Anfrage weiter auf den Provider loszulassen, pausieren Sie Calls für ein kurzes Fenster und probieren dann mit einem kleinen Test-Request erneut. Das macht die Verlangsamung vorhersehbar und verhindert, dass Sie weiter Druck aufbauen.
Trennen Sie UI-Reaktivität von Provider-Geschwindigkeit. Die UI sollte sofort reagieren: die Nutzeraktion annehmen, einen klaren Zustand anzeigen und die Arbeit im Hintergrund verarbeiten. Wenn Sie Klicks direkt an die Provider-Antwortzeit binden, fühlt sich die ganze App kaputt an, selbst wenn nur eine Abhängigkeit langsam ist.
Per-User-Budgets verhindern, dass ein starker Nutzer (oder ein Bug) alle anderen ausknockt. Halten Sie es einfach: wie viele wartende Jobs und wie viel Retry-Zeit ein Nutzer verbrauchen darf, bevor Sie beginnen zu verzögern oder abzulehnen.
Nützliche Signale zum Überwachen:
- 429-Rate über die Zeit (Spitzen vs. konstant)
- Queue-Depth (wie viele Jobs warten)
- Durchschnittliche Wartezeit, bevor ein Job startet
- Timeout-Rate (zu strikt vs. zu locker)
- Circuit-Breaker-Open-Time (wie oft Sie Calls pausieren)
Häufige Fehler, die 429-Probleme verschlimmern
Die meisten 429-Schmerzen kommen von einigen vorhersehbaren Fehlern. Vermeiden Sie sie und 429-Handling wird langweilig (im positiven Sinne).
Retries, die einen Retry-Sturm erzeugen
Sofortige Retries oder Retries mit gleicher fixer Verzögerung können eine kleine Verlangsamung in einen Ausfall verwandeln. Wenn 200 Nutzer auf "Try again" drücken und jeder Client zur selben Sekunde erneut versucht, bekommen Sie eine synchronisierte Welle von Traffic, die weiterhin 429s auslöst.
Verwenden Sie wachsende Verzögerungen plus Jitter, sodass Retries sich verteilen.
Endlose Retries und versteckte Kosten
Ohne maximale Retry-Anzahl und ein maximales Gesamtwartezeit kann eine Nutzeraktion eine unendliche Schleife auslösen. Das kann Tokens oder API-Credits verbrennen, Server-Worker mit nutzlosen Tasks beschäftigen und zu verwirrenden "lädt ewig"-Screens führen.
Begrenzen Sie Retries und stoppen Sie mit einer klaren Meldung, wenn Sie das Limit erreichen.
Ein globales Limit ohne Prioritäten
Wenn Sie alle Calls gleich behandeln, kann Hintergrundarbeit (z. B. Embeddings) kritische Flows wie Login, Checkout oder "Nachricht senden" verdrängen. Nutzen Sie separate Queues oder Prioritäten, damit Kernaktionen immer Vorrang haben.
Ignorieren von Teil-Erfolg
Ein häufiges Szenario: Ein Request gelingt (Sie haben eine Nachricht erstellt), aber der nächste Request bekommt ein 429 (Sie konnten die aktualisierte Historie nicht holen). Wenn Sie die ganze Operation als fehlgeschlagen behandeln, riskieren Sie Duplikate, fehlende UI-Updates oder inkonsistenten Zustand.
Behandeln Sie jeden Call als eigenen Schritt. Speichern Sie, was gelungen ist, und retryen Sie nur, was fehlgeschlagen ist.
Generische Fehler, die Nutzer zum Klicken bringen
"Etwas ist schiefgelaufen" bringt Menschen dazu, den Button zu hämmern, was mehr Last erzeugt. Zeigen Sie einen spezifischen Zustand wie: "Wir warten auf den Provider. Erneuter Versuch in 8 Sekunden."
Schnelle Checkliste vor dem Release
Behandeln Sie 429-Handling vor dem Release wie ein Produkt-Feature, nicht nur als Retry-Schleife. Eine gute Einrichtung hält Kosten unter Kontrolle, vermeidet Überraschungs-Ausfälle und lässt die App ruhig wirken, selbst wenn der Provider sagt "langsamer."
Eine praktische Pre-Ship-Checkliste:
- Parallelität ist an zwei Stellen begrenzt: pro Feature (z. B. Chat) und pro Nutzer (damit eine beschäftigte Person nicht alle anderen ausbremst).
- Retries haben klare Limits: maximale Versuche und maximales Gesamtzeit-Budget (sodass Requests nicht ewig hängen).
- Backoff reduziert Druck: Sie fügen Jitter hinzu, respektieren Server-Hinweise wie
Retry-Afterund vermeiden synchronisierte Retries über viele Nutzer. - Die UI bleibt vorhersehbar: Nutzer sehen, was passiert ("Warten auf Retry"), wie lange es dauern könnte, und eine sichere nächste Aktion (Abbrechen, Erneut versuchen oder ohne Ergebnis weiterfahren).
- Logs sind ausreichend zum schnellen Debuggen: Provider-Name, Endpoint/Modell, Request-ID, Nutzer-ID (oder anonymer Token), Versuchszähler, gewählte Wartezeit und die exakte Fehlermeldung.
Führen Sie vor dem Release einen kurzen Storm-Test durch. Öffnen Sie die App in zwei Browsern, triggern Sie 10–20 Aktionen schnell und bestätigen Sie, dass Sie geordnete Warteschlangen, wachsende Verzögerungen und ein sauberes Stoppen sehen, wenn Limits erreicht werden.
Beispiel: Ein Chat-Feature, das von einem plötzlichen Spike getroffen wird
Stellen Sie sich eine Team-Demo vor: Jemand teilt einen Link, und innerhalb einer Minute öffnen 50 Personen den Chat und tippen denselben Prompt. Ihre App sendet 50 nahezu identische Calls an einen LLM-Provider. Nach ein paar Sekunden bekommen Sie 429s.
Ohne Kontrolle wirkt alles zufällig. Einige Requests timeouten, einige retryen sofort und werden wieder geblockt, und Nutzer klicken "Send" immer wieder. Jetzt haben Sie Duplikate, höhere Kosten und unpassende Outputs (eine Person sieht eine Antwort, eine andere einen Fehler, eine dritte zwei Antworten).
Eine Request-Queue ändert die Form des Traffics. Statt den Provider zu überfluten, stellen Sie Anfragen an und geben sie in gleichmäßigem Tempo frei. Fügen Sie Priorität hinzu, damit die App reaktiv bleibt: UI-kritische Aktionen wie das Abbrechen einer Nachricht, Laden der Chat-Historie oder Abrufen des Nutzerprofils gehen vor, während Generierungs-Requests warten.
Backoff verhindert, dass Sie die Lage verschlimmern, wenn der Provider bereits zurückdrängt. Bei einem 429 retryen Sie nach einer wachsenden Verzögerung (exponentielles Backoff) plus etwas Zufall (Jitter). Das stoppt, dass alle 50 Clients gleichzeitig erneut versuchen und wieder kollidieren.
Was Nutzer sehen, ist genauso wichtig wie der Code. Während des Spikes könnte eine vorhersehbare UI anzeigen:
- "In Warteschlange" mit einer geschätzten Wartezeit wie 20–40 Sekunden
- Einen klaren Abbrechen-Button, der den wartenden Job tatsächlich stoppt
- Eine Retry-Option nur nach einem Fehler, nicht während normalen Wartens
- Eine einzelne Nachricht pro Prompt (keine Duplikate), die von "Queued" zu "Sending" zu "Done" wechselt
Nächste Schritte: Basics implementieren, dann zuverlässig machen
Beginnen Sie mit einer Seite, die Ihre Regeln beschreibt: wann Sie retryen, wie lange Sie warten, wann Sie aufgeben und was der Nutzer in jedem Schritt sieht. Das verhindert das übliche Chaos, in dem das Backend ewig retryt, während die UI eingefroren aussieht.
Wenn Sie nur zwei Engineering-Aufgaben diese Woche machen, erledigen Sie sie an der Stelle, die den Schmerz am schnellsten stoppt: am gemeinsamen Client, der mit Ihrem Provider spricht. Zentralisiertes 429-Handling bedeutet, dass jedes Feature profitiert und Sie nicht fünf unterschiedliche Retry-Verhalten in der App haben.
Eine praktische Reihenfolge, die meist funktioniert:
- Definieren Sie eine Retry-Policy (max. Versuche, max. Wartezeit, welche Fehler retrybar sind)
- Fügen Sie eine Request-Queue hinzu, um Bursts von Nutzerklicks und Hintergrundjobs zu glätten
- Fügen Sie exponentielles Backoff mit Jitter hinzu, damit Retries Druck reduzieren statt erhöhen
- Fügen Sie klare Nutzerzustände hinzu: warten, retryen und einen sicheren Fallback, wenn Sie aufgeben
- Loggen Sie jeden 429 inklusive der gewählten Verzögerung, damit Sie später Muster sehen
Dann führen Sie einen einfachen Lasttest durch. Simulieren Sie 20–50 schnelle Aktionen (Nachricht senden, regenerieren, Daten aktualisieren) und erzwingen Sie ein paar 429-Antworten. Das Ziel ist nicht perfekte Geschwindigkeit. Es ist, dass die UI verständlich bleibt: Nutzer sollten sehen, dass die App wartet, nicht kaputt ist, und wissen, was als Nächstes passiert.
Wenn Sie ein AI-generiertes Codebase geerbt haben, seien Sie vorsichtig mit Schnellpatches. So entstehen Retry-Stürme und Geister-Requests, die weiterlaufen, nachdem der Nutzer weg navigiert hat.
Wenn Sie eine zweite Meinung wollen: FixMyMess (fixmymess.ai) spezialisiert sich auf die Diagnose und Reparatur von AI-generierten Apps, die unter realem Traffic auseinanderfallen, einschließlich runaway Retries, fehlender Caps und chaotischem Request-Fanout. Ein kurzes Audit kann helfen, schnell vorhersehbares Verhalten herzustellen.
Häufige Fragen
What does a 429 error actually mean?
Ein 429 bedeutet, dass der Provider Sie throttelt, weil zu viele Anfragen in kurzer Zeit angekommen sind. Ihr Code kann richtig sein, aber Ihr Traffic-Muster (Spitzen, hohe Parallelität oder versteckte zusätzliche Calls) überschreitet ein Kontingent oder Durchsatz-Limit.
What should my app do when it gets a 429?
Standardmäßig warten und mit Verzögerung erneut versuchen — nicht sofort. Verwenden Sie ein kurzes Zeitbudget für nutzergetriggerte Aktionen und ein längeres für Hintergrundjobs, und hören Sie auf zu retryen, sobald das Budget erreicht ist, damit die App nicht ewig lädt.
Why are exponential backoff and jitter recommended?
Exponentielles Backoff bedeutet, dass jeder Retry länger wartet als der vorherige, wodurch der Druck auf den Provider sinkt. Jitter fügt kleine Zufallsschwankungen hinzu, damit viele Clients nicht gleichzeitig erneut versuchen und eine weitere Welle von 429s auslösen.
Should I follow the Retry-After header?
Behandeln Sie Retry-After als primären Hinweis, wie lange Sie warten sollen. Wenn Sie Jitter hinzufügen, halten Sie ihn klein um diesen Wert herum, damit Sie die Timing-Vorgabe des Providers respektieren und synchronisierte Retries vermeiden.
Do I really need a request queue, or can I just retry?
Eine Warteschlange glättet Spitzen, indem sie „50 Anfragen jetzt“ in einen kontrollierten Fluss verwandelt, den der Provider verkraftet. Sie bietet außerdem einen Ort für Prioritäten, Verzögerungen und Persistenz, damit Anfragen bei Neustarts nicht verschwinden oder dupliziert werden.
How do I pick a safe concurrency limit?
Fangen Sie klein an: oft 1–3 parallele Tasks pro Worker oder Feature. Erhöhen Sie nur, wenn in realistischem Traffic stabile Ergebnisse sichtbar sind. Die sichere Grenze ist der höchste Wert, der bei normalen Spitzen nicht häufig 429s auslöst.
When are retries dangerous, and how do I make them safe?
Retten Sie nur Anfragen, die gefahrlos wiederholt werden können, wie Leseaufrufe oder Schreibvorgänge mit Idempotency-Keys. Wenn ein Retry Duplikate erzeugen könnte (Abbuchungen, E-Mails, Datensätze), machen Sie es zuerst idempotent oder brechen Sie ab und fragen den Nutzer.
Should I dedupe identical prompts or API calls?
Ja. Wenn Sie identische Anfragen kurz hintereinander sehen, geben Sie das gleiche Ergebnis des laufenden Aufrufs zurück, statt neue Calls zu starten. Das reduziert Doppelclick-Traffic und Frontend-Render-Spam, die bei Spitzen oft 429s verursachen.
What should users see while a request is waiting or retrying?
Zeigen Sie klare, konsistente Zustände wie „Queued“, „Retrying in X seconds“ und ein deutliches „Try again“, wenn Sie aufgeben. Das Wichtigste ist, dass die UI die Aktion sofort bestätigt und erklärt, was passiert, damit Nutzer nicht ständig klicken und die Last erhöhen.
What should I log and measure to fix 429s for good?
Loggen Sie genug Kontext, um Muster zu erkennen: welche Endpoint/Modell, welcher Nutzer oder Workspace, interaktiv vs. Hintergrund, Versuchszähler, gewählte Verzögerung und insgesamt verbrachte Zeit. Wenn Sie ein geerbtes AI-Codebase mit runaway Retries oder fehlenden Caps haben, kann FixMyMess (fixmymess.ai) es auditieren und die Fehlerzustände schnell beheben, damit das Verhalten unter realem Traffic vorhersehbar bleibt.