Artikel

Build-Timeout vs. API-Timeout: Warum ein 700-Sekunden-Fetch nicht in einen 600-Sekunden-Build passt

Build-Timeout vs. API-Timeout: Warum ein 700-Sekunden-Fetch nicht in einen 600-Sekunden-Build passt

Ein API-Aufruf mit 700 Sekunden Laufzeit kann in einer 600-Sekunden-Build-Umgebung nicht zuverlässig enden. So findest du das echte Deadline-Limit, setzt Budgets und verlegst lange Arbeit aus dem Deployment.

7 Min. LesezeitSprache: DE DeutschKostenlos0 Claps0 Kommentare
Leseoptionen

Ein langsamer Request ist nicht das eigentliche Problem

Ein Build lädt Daten über eine API, verarbeitet sie und erzeugt statische Seiten. Darf der Request 700 Sekunden warten, die Plattform beendet den Build aber nach 600 Sekunden, ist das Ergebnis unvermeidbar.

Das ist keine zufällige Störung, sondern ein Konflikt von Deadlines. Außerdem teilt sich der Request das Zeitfenster mit Installation, Kompilierung, Schreiben und Upload der Build-Artefakte.

Die früheste Deadline gewinnt

In Produktionssystemen wirken mehrere Timer gleichzeitig:

Ebene Beispiel
Build-Limit der Plattform 600 Sekunden
CI-Job 15 Minuten
Framework-Datenabruf 60 Sekunden
HTTP-Client 700 Sekunden
Proxy oder Upstream-API 30 Sekunden

Die kleinste gültige Deadline beendet die Arbeit. Ein 700-Sekunden-Timeout im Client verlängert keine Plattform, die den Prozess nach 600 Sekunden beendet.

Erstelle zuerst eine Zeitleiste

Miss den Beginn des Builds und des Fetches, DNS/Verbindung/Time-to-first-byte, Statuscode, Antwortgröße, Request-ID, Retries und die Komponente, die den finalen Fehler ausgibt. Nutze eine Korrelations-ID, aber protokolliere keine Tokens, Autorisierungsheader oder sensiblen Nutzdaten.

Verteile ein Zeitbudget

Ein einzelner API-Aufruf darf nicht das gesamte Build-Limit erhalten. Reserviere Zeit für Installation, Ausgabe und Fehlerbehandlung und gib jedem externen Aufruf ein kleineres, bewusstes Budget.

async function fetchJson(url, { timeoutMs = 15_000, ...options } = {}) {
  const response = await fetch(url, {
    ...options,
    signal: AbortSignal.timeout(timeoutMs),
  });

  if (!response.ok) throw new Error(`Request failed: ${response.status}`);
  return response.json();
}

Wenn der Aufrufer bereits ein Abbruchsignal besitzt, kombiniere es mit AbortSignal.any() und dem Timeout-Signal.

Retries brauchen ebenfalls eine Deadline

Wiederholungen helfen bei temporären Netzwerkfehlern, Drosselung und manchen Serverfehlern. Sie schaden, wenn sie einen sicher scheiternden Request nur vervielfachen. Wiederhole nur idempotente Arbeit, nur plausible temporäre Fehler und nur solange das gesamte Zeitbudget reicht. Verwende exponentielles Backoff und Jitter.

Behebe die Architektur statt nur die Zahl

Ist ein API-Aufruf länger als das Deployment-Fenster, löst ein höherer Client-Timeout nichts. Entferne lange Arbeit aus dem kritischen Pfad:

  • Übertrage weniger Felder, nutze Pagination, Indizes oder einen Export-Endpunkt.
  • Baue aus einem Cache oder Snapshot und veröffentliche bei Fehlern den letzten gültigen Stand.
  • Starte Berichte und große Verarbeitung als Hintergrundjob und verwende anschließend das Ergebnis.
  • Nutze inkrementelle Regenerierung, Caching oder Server-Rendering, wenn Aktualität wichtig ist.
  • Parallelisiere unabhängige Requests nur mit einer kleinen Obergrenze.

Wann ein höheres Timeout sinnvoll ist

Bei einer seltenen, klar begrenzten Aufgabe kann es sinnvoll sein, wenn alle äußeren Limits es erlauben. Für eine in jedem Build langsame externe Quelle, einen Nutzerpfad oder ein festes Plattformlimit ist es keine Lösung.

Checkliste

  • Ermittle die früheste Deadline in Plattform, CI, Proxy, Client und Upstream.
  • Reserviere Zeit nach dem Fetch für den Rest des Builds.
  • Setze für jeden externen Aufruf ein explizites kleineres Timeout.
  • Begrenze Retries mit Gesamtdauer, Backoff und Jitter.
  • Cache oder Snapshots für langsame Build-Eingaben verwenden.
  • Lange Verarbeitung in Hintergrundjobs verlagern.
  • Zeiten, Status und Request-IDs ohne Geheimnisse protokollieren.

Fazit

Ein 700-Sekunden-Fetch in einer 600-Sekunden-Umgebung ist ein Architekturhinweis, kein Tuning-Problem. Mache Daten schneller verfügbar, verwende einen Snapshot oder führe die lange Arbeit außerhalb des Deployments aus.

Empfohlene Artikel

YOLO-Objekterkennung: Ein vollständiger Praxisleitfaden für Entwickler
EditorialDE
18 Min.Kostenlos

YOLO-Objekterkennung: Ein vollständiger Praxisleitfaden für Entwickler

Ein durchgängiger Entwicklerleitfaden zu YOLO: Grundlagen, Datenqualität, Training, Evaluation, Echtzeit-Inferenz, Produktion, Performance und Sicherheit.

Engineering-ArtikelKI-LeitfädenAIPythonVision
0 Claps
Lesen
15 JavaScript-Funktionen, die erfahrene Entwickler 2026 wirklich verwenden
EditorialDE
11 Min.Kostenlos

15 JavaScript-Funktionen, die erfahrene Entwickler 2026 wirklich verwenden

Ein praxisnaher deutscher Leitfaden mit 15 modernen JavaScript-Funktionen, ausführbaren Beispielen und Tipps aus der Perspektive erfahrener Entwickler.

Engineering-ArtikelJavaScriptCleanAdvanced
0 Claps
Lesen
Was ist ein Cache Stampede und wie verhindert man ihn in Laravel?
EditorialDE
9 Min.Kostenlos

Was ist ein Cache Stampede und wie verhindert man ihn in Laravel?

Ein Cache Stampede entsteht, wenn viele gleichzeitige Requests denselben abgelaufenen Cache-Key verfehlen und die Daten parallel neu berechnen. Dieser Laravel-Leitfaden zeigt Gegenmaßnahmen mit atomaren Locks, stale-while-revalidate, TTL-Jitter und sicheren Fallbacks.

Engineering-ArtikelLaravelCachingRedis
0 Claps
Lesen

Kommentare

0 Kommentare

Noch keine freigegebenen Kommentare sichtbar. Neue Antworten können moderiert werden.