Tägliche Notiz: Debugging eines Produktions-API-Workflows
Integrationstest grün, Staging grün, Produktion schlägt bei 1 % der Anrufer fehl. Der Fehler war an einem Ort, den ich nie vermutet hätte.
Heute war so ein Tag.
Die API gibt im Staging 200 zurück, 500 für ~1% des Produktionsverkehrs. CloudWatch zeigt, dass die Lambda nach 29,9s aussteigt. Jeder Integrationstest grün. Jeder Lasttest grün.
Habe zwei Stunden damit verbracht, die Datenbank zu beschuldigen. Es war nicht die Datenbank.
Es stellte sich heraus: Eine unserer upstream SaaS-Integrationen begann, Antworten mit einem spezifischen Header zurückzugeben, auf den unser HTTP-Client stillschweigend erneut versuchte. Drei Versuche × 10s Backoff = 30s = Lambda-Timeout. Die 1% waren die Teilmenge von Kunden, deren Daten zufällig über einen bestimmten Vendor-Edge geleitet wurden.
# vorher
session = requests.Session()
session.mount("https://", HTTPAdapter(max_retries=Retry(total=3, backoff_factor=1)))
# nachher
session = requests.Session()
session.mount("https://", HTTPAdapter(max_retries=Retry(
total=3,
backoff_factor=1,
respect_retry_after_header=False, # der Vendor lügt
allowed_methods=frozenset(["GET"]), # niemals POSTs erneut versuchen
)))
Lehre, die ich immer wieder lerne: Retry-Strategien sind eine Systemgrenze. Standardwerte sind fast immer falsch für dein System.
Gehe mit Kopfschmerzen, aber einem grünen Dashboard ins Bett.
Geschrieben von
Adrian Romo
Senior Backend Engineer für skalierbare Python-APIs, AWS-Lambda-Architekturen, Voice-Systeme und Enterprise-Integrationen.
Verwandt
Weiterlesen
Sekunden der Arbeit, Stunden des Aufenthalts
Mein Morgenbriefing begann zu scheitern. Ollama war zwar erreichbar, lieferte aber HTTP 500 zurück, weil ein 21 Sekunden langer Bild-Render auch Stunden später noch 6,6 GB VRAM belegte.
Was verdient heute Aufmerksamkeit
Mein Homelab liefert jeden Morgen ein Urteil: Entweder braucht dich etwas, oder es braucht dich nichts. Die zweite Hälfte ehrlich zu bekommen, war deutlich schwieriger als die erste.
Der Alarm, der etwas benannte und es zum Beweis machte
Fünf Warnmeldungen mit hoher Schwere aus meinem eigenen Monitoring. Alle fünf betrafen denselben Fehler: Ein Datensatz benennt etwas, das als Beobachtung einer Eigenschaft gelesen wird, die nie gemessen wurde.
Weiter geht's
Wohin als Nächstes?
Stöbere durch weitere technische Texte, sieh dir die Engineering Case Studies an oder melde dich direkt.