Workers-Free-Kontingent reicht nicht? 7 Tipps, damit 100.000 Anfragen einen Monat reichen
Letzten Monat habe ich mit Workers ein Bildhosting auf R2 gebaut – auf dem Papier perfekt. Nach nicht einmal drei Tagen kam die Mail von Cloudflare: Ihr Free-Kontingent ist fast aufgebraucht.
Ich war verwirrt: Täglich 100.000 Anfragen, oder? Mein kleines Host mit ein paar Dutzend Bildern – woher 120.000/Tag in Analytics? Zwei Tage Docs und Community später wurde klar: Subrequests, KV-Reads, Cache – alles frisst still Kontingent.
Die gute Nachricht: Mit ein paar Hebeln von 120.000 auf ~30.000/Tag. Monatlich reicht das Free-Tier mit ~30 % Reserve. Dieser Artikel fasst die Praxis zusammen – vielleicht sparen Sie die 5 $/Monat für den Paid-Plan.
Nicht täuschen lassen: „100.000“ bedeuten nicht, was man denkt
In der Doku klingt „100.000 Anfragen/Tag“ einfach: mein Worker wird 100.000-mal aufgerufen – fertig. So ist es nicht.
Wahrheit 1: Subrequests – nicht extra bezahlt, aber begrenzt
fetch() zu APIs, R2, KV = Subrequests. Sie kosten nicht separat, aber im Free-Tier max. 50 Subrequests pro Request (Paid: 1.000).
Beispiel Bildhosting: 1 abrechenbare Anfrage, KV-Rechtecheck (1 Subrequest), R2-Bild (1 Subrequest) = 2 Subrequests, 1 Abrechnung.
Aggregationsdienst mit 10 APIs pro Hit = 10 Subrequests – das Limit ist schneller erreicht als gedacht.
Wahrheit 2: 100.000 pro Account, nicht pro Worker
Mehrere Worker teilen sich ein Kontingent. Zehn Worker = weiterhin 100.000/Tag gesamt. Umgehung über viele Worker scheitert; Ausweg: optimieren oder Paid.
Wahrheit 3: KV und Cache API zählen mit
Jeder KV.get() verbraucht Anfragen (ohne Subrequest-Zähler, aber Kontingent). Rechteprüfung bei jedem Hit = +1 KV-Operation pro Besucher.
Cache match() / put() kosten ebenfalls – auch wenn sie Origin entlasten.
Die 3 Fallen, die mich auf 120.000 trieben
- Reverse Proxy ohne Cache – API-Proxy, jedes Mal
fetch()zur Origin. Cache API → 80 % Treffer, Anfragen halbiert. - KV ohne
cacheTtl– pro BildKV.get(). MitcacheTtl: 600(10 Min.) −70 % KV-Reads. - Redirect-Ketten – Shortlink mit
302, drei Hops (A→B→C→Ziel) = drei Subrequests. Finale URL direkt → zwei gespart.
Wer knapp am Limit ist: zuerst diese drei Punkte prüfen.
7 Optimierungstipps – Free-Kontingent länger nutzen
Nach dem Verständnis der Regeln haben sich diese sieben Hebel in der Praxis bewährt.
Tipp 1: Cache – bis zu 80 % weniger Duplikat-Anfragen
Viele Worker brauchen nicht bei jedem Request Live-Logik. Mein Bildhosting vorher: Prüfung → R2 → Antwort. Nachher mit Cache API:
const cache = caches.default;
const cacheKey = new Request(request.url, request);
// Zuerst Cache prüfen
let response = await cache.match(cacheKey);
if (response) {
return response; // Cache-Treffer
}
// Miss: Request verarbeiten
response = await handleRequest(request);
// Cache setzen (statische Bilder 1 Tag)
response = new Response(response.body, {
...response,
headers: {
...response.headers,
'Cache-Control': 'public, max-age=86400',
},
});
await cache.put(cacheKey, response.clone());
return response;
85 % Treffer: von 120.000/Tag nur noch 18.000 echte Worker-Pfade (−102.000).
Tipp 2: KV-Dreiklang
KV ist praktisch und teuer in Anfragen. Drei Hebel:
-
cacheTtlerhöhen – Standard 60 s am Edge:// Vorher const value = await KV.get('key'); // Nachher (10 Min. Cache) const value = await KV.get('key', { cacheTtl: 600 });Rechte alle 30 Min. aktualisiert →
cacheTtl: 1800, KV-Reads −70 %. -
KV-Ergebnis in Cache API – für langsam ändernde Daten (Config, Blocklisten):
const cacheKey = `kv-cache:${key}`; let cached = await caches.default.match(cacheKey); if (!cached) { const value = await KV.get(key); cached = new Response(value); await caches.default.put(cacheKey, cached.clone()); } return cached.text(); -
waitUntilfür Writes – Antwort nicht auf KV-Schreiben warten:event.waitUntil(KV.put('key', 'value')); return new Response('OK');
Kombiniert: KV-Operationen von ~30.000 auf ~8.000/Tag.
Tipp 3: Subrequests vermeiden
Aggregation mit 5 externen APIs = 5 Subrequests. Später: häufige APIs 5 Min. cachen, seltene 24 h in KV, Vorverarbeitung in R2. ~80 % der Requests ohne Subrequest.
Tipp 4: Request.cache nutzen
Seit November 2024 feiner steuerbar:
// Kein Cache (sensible Daten)
const response = await fetch(url, { cache: 'no-store' });
// Standard-Cache
const response = await fetch(url, { cache: 'default' });
Private Bilder: no-store. Öffentliche: default für CDN-Optimierung.
Tipp 5: Redirect-Ketten
Jeder Hop in einer 302-Kette = Subrequest.
Vorher:
return Response.redirect(targetUrl, 302);
Nachher: finale URL cachen, Ketten wie bit.ly → t.co vermeiden.
Tipp 6: Analytics – die „Fresser“ finden
Workers Analytics ist kostenlos. Oft 80 % der Anfragen von 20 % der Pfade. Bei mir: /api/status alle 60 s vom Monitor – 15 % des Tageslimits. 60-Sekunden-Cache → −15.000/Tag.
Tipp 7: Nicht-dringende Tasks zeitlich verschieben
Cron Triggers für Statistik, Aufräumen, Cache-Warmup. Statt pro Hit KV-Counter: Zähler im Speicher, stündlich per Cron bündeln – KV-Writes von 20.000 auf 24/Tag.
Praxis: Bildhosting 120.000 → 30.000 Anfragen/Tag
Hintergrund
- Workers für Logik, R2 für Dateien, KV für Metadaten/Rechte
- ~2.000 echte Bildaufrufe/Tag
- Tag 3: Warnung bei ~120.000 Anfragen/Tag
Diagnose
- Jeder Bildhit →
KV.get()(2.000 Reads für stabile Metadaten) - Kein
Cache-Control→ Browser fragt jedes Mal neu - Thumbnails live im Worker → 30 Bilder/Liste = 30 Verarbeitungen
2.000 echte Besuche → 120.000 Worker-Aufrufe.
Optimierung in 4 Schritten
Schritt 1: KV cacheTtl (schnellster Effekt)
const metadata = await IMAGE_KV.get(imageId, {
cacheTtl: 600
});
KV-Reads: 2.000 → ~300/Tag (−85 %)
Schritt 2: Browser-Cache
return new Response(imageData, {
headers: {
'Content-Type': 'image/jpeg',
'Cache-Control': 'public, max-age=86400',
'CDN-Cache-Control': 'public, max-age=2592000'
}
});
Wiederholte Besuche −60 % → ~48.000/Tag
Schritt 3: Thumbnails vorberechnen
const thumbnail = await generateThumbnail(image);
await R2.put(`thumbnails/${imageId}`, thumbnail);
// Abruf
const thumbnail = await R2.get(`thumbnails/${imageId}`);
→ ~32.000/Tag
Schritt 4: Worker-Cache-Layer
const cache = caches.default;
let response = await cache.match(request);
if (response) return response;
await cache.put(request, response.clone());
return response;
78 % Treffer, stabil ~30.000/Tag
Ergebnis
| Kennzahl | Vorher | Nachher | Änderung |
|---|---|---|---|
| Anfragen/Tag | 120.000 | 32.000 | −73 % |
| KV-Reads | 2.000 | 300 | −85 % |
| Cache-Treffer | 0 % | 78 % | +78 % |
| Kosten | ~20 % über Limit | ~70 % Reserve | ~60 US-Dollar/Jahr |
Learnings
- Engpass zuerst (Analytics), dann optimieren
- Cache dominiert (Browser, CDN, Worker)
- KV sparsam:
cacheTtl, Vorberechnung - Inkrementell – jeder Schritt messbar
Paid oder optimieren?
| Punkt | Free | Paid (5 $/Monat) |
|---|---|---|
| Anfragen/Tag | 100.000 | ~330.000 |
| Pro Minute | 1.000 | kein klares Limit |
| Subrequests/Request | 50 | 1.000 |
| KV-Reads | 100.000/Tag | 10 Mio./Monat |
| CPU | 10 ms | 50 ms |
| Jahr | 0 $ | ~60 $ |
Paid lohnt sich typischerweise wenn:
- Stabil >100.000/Tag über eine Woche (Spitzen ≠ Dauerlast)
- Viele Subrequests (Crawler, Gateway, 10+ APIs)
- Kommerziell – SLA und Tickets > 5 $
Wann Optimierung Zeitverschwendung ist
- Cache-Spaghetti, Wartung teurer als 5 $
- Alles optimiert, reicht nicht → Paid
- 3 h Arbeit bei >20 €/h Stundensatz → oft Paid schneller
Empfehlung: privat/lernen optimieren; kommerziell eher Paid.
Nach Paid weiter optimieren?
Ja – 10 Mio./Monat sind auch endlich. Überlimit 0,50 $/Million; bei 1 Mio./Tag ≈20 $/Monat gesamt.
Fazit
Abrechnung verstehen, dann gezielt optimieren.
100.000/Tag wirken groß, gehen schnell auf – meist Ineffizienz, nicht zu viel echtes Traffic. Mein Host: 2.000 Besuche, 120.000 Anfragen → mit Cache und KV ~30.000.
Wenn Ihnen das Kontingent knapp wird:
- Workers Analytics: welche Pfade?
- Cache und KV zuerst
- Drei Fallen (Subrequests,
cacheTtl, Redirect-Ketten) - Sieben Tipps kombinieren
- Erst dann Paid
Cloudflare ist ein Unternehmen – Free-Tier fair nutzen. Ziel: effizienter Ressourceneinsatz, nicht Regeln aushebeln.
Hat Ihnen der Artikel 5 $ gespart? Teilen Sie ihn gern mit anderen Workers-Nutzern.
Cloudflare Workers Free-Kontingent optimieren – kompletter Ablauf
Abrechnungsregeln, 7 Praxis-Tipps, Fall Bildhosting 120.000 → 30.000 Anfragen/Tag, Cache-Treffer +80 %
Estimated time: PT2H
-
1
Step 1: Abrechnungsregeln und typische Fallen verstehen
Workers-Abrechnung: -
2
Step 2: 7 Optimierungstipps: Cache, KV, Subrequests
Tipp 1: Cache – bis 80 % weniger Duplikate -
3
Step 3: Praxis: Bildhosting vor/nachher
Vorher: 120.000/Tag, 2.000 KV-Reads, 0 % Cache -
4
Step 4: Paid oder optimieren?
Free vs. Paid vergleichen; Upgrade bei Dauerlast, vielen Subrequests, SLA-Bedarf; Grenzen der Optimierung (Komplexität, Zeit) -
5
Step 5: Schritte und Best Practices
Analytics → Cache/KV → Fallen prüfen → 7 Tipps kombinieren → ggf. Paid; Free-Tier verantwortungsvoll nutzen
FAQ
Wie werden die „100.000“ kostenlosen Workers-Anfragen berechnet?
Wahrheit 1: Subrequests werden nicht separat berechnet, aber es gibt Limits
• fetch() zu anderen APIs, R2-Lesen, KV-Abfragen – das sind Subrequests
• Gut: Subrequests kosten extra nichts. Schlecht: Im Free-Tier nur 50 Subrequests pro Request, Paid bis 1.000
• Beispiel: Nutzer ruft Ihre Bildhosting-URL auf (1 abrechenbare Anfrage), Worker prüft KV (1 Subrequest), holt Bild aus R2 (1 Subrequest) – 2 Subrequests, aber nur 1 abrechenbare Anfrage
Wahrheit 2: 100.000 gelten pro Account, nicht pro Worker
• Mehrere Worker teilen sich das Kontingent
• 10 Worker zusammen = weiterhin nur 100.000/Tag – Umgehung über mehrere Worker funktioniert nicht
Wahrheit 3: KV und Cache API zählen mit
• Jeder KV.get() verbraucht Anfragen (kein Subrequest-Limit, aber Kontingent)
• Jeder Zugriff mit KV-Rechteprüfung = +1 KV-Operation
• Cache: match() und put() haben ebenfalls Kosten, auch wenn sie Origin-Anfragen sparen
Welche 3 Fallen treffen am häufigsten auf? Wie vermeiden?
Falle 1: Reverse Proxy ohne Cache, jeder Aufruf ein Subrequest
• API-Proxy: jedes Mal fetch() zur Origin-API, kein Cache → jede Nutzeranfrage = Subrequest
• Mit Cache API: 80 % Trefferquote, Anfragen halbiert
• Lösung: Cache konsequent nutzen – viele Worker-Projekte brauchen nicht bei jedem Hit Live-Berechnung
Falle 2: Häufige KV-Reads ohne cacheTtl
• Bildhosting: pro Bild KV.get() für Rechte – ohne cacheTtl
• cacheTtl: 600 (10 Min.) → KV-Reads −70 %
• KV-Dreiklang: 1) cacheTtl erhöhen (Standard 60 s am Edge), 2) Batch-Reads mit Promise.all, 3) Writes reduzieren (teurer als Reads)
Falle 3: Redirect-Ketten zählen jeden Hop
• Shortlink mit 302, Kette A→B→C→Ziel = jeder Hop 1 Subrequest
• Direkt finale URL liefern spart Zähler
• Lösung: Keine Redirect-Ketten – finale Adresse speichern oder cachen
Was sind die 7 Optimierungstipps konkret? Welcher Effekt?
• Schnellster Hebel im Test
• Vorher: jeder Bildaufruf = Prüfung → R2 → Antwort
• Nachher: Cache API, 85 % Treffer – von 120.000 auf 18.000 echte Worker-Logik (−102.000)
Tipp 2: KV-Dreiklang
1) cacheTtl erhöhen
2) Parallel mit Promise.all lesen
3) Writes minimieren
Tipp 3: Subrequests reduzieren
• APIs zusammenführen, R2 per öffentlicher URL statt Worker
Tipp 4: Redirects
• Ketten vermeiden, finale URL direkt
Tipp 5: Code-Logik
• Vorberechnen und cachen statt jedes Mal live
Tipp 6: Monitoring
• Workers Analytics: Pfade mit höchstem Verbrauch
Tipp 7: Paid-Plan
• Wenn Optimierung nicht reicht: 5 $/Monat, ~3× Tageslimit, 20× Subrequest-Limit
Wie stark war der Effekt im Praxisbeispiel?
Vorher:
• 120.000 Anfragen/Tag
• 2.000 KV-Reads
• 0 % Cache-Treffer
• ~20 % über Limit
Nachher:
• 32.000 Anfragen/Tag (−73 %)
• 300 KV-Reads (−85 %)
• 78 % Cache-Treffer
• ~70 % Puffer (−60 US-Dollar/Jahr vs. Paid)
Seit 2 Monaten stabil 30.000–40.000/Tag im Free-Tier. Nur ~2.000 echte Besuche, aber 120.000 Anfragen vorher – durch Cache, KV und Vorberechnung auf ~30.000.
Wann lohnt Paid, wann Optimierung?
Free: 100.000/Tag, 1.000/Min., 50 Subrequests/Request, 100.000 KV-Reads/Tag, 10 ms CPU
Paid: ~330.000/Tag (10 Mio./Monat), 1.000 Subrequests/Request, 10 Mio. KV-Reads/Monat, 50 ms CPU, ~60 US-Dollar/Jahr
Upgrade sinnvoll wenn:
1) stabil >100.000/Tag über eine Woche
2) viele Subrequests (Crawler, Gateway, 10+ APIs pro Request)
3) kommerzielles Projekt: SLA und Support > 5 $
Optimierungsgrenze:
• Zu komplexer Cache-Code vs. Zeitkosten
• Alles optimiert, reicht trotzdem nicht → Paid
• 3 h Optimierung bei Stundensatz >20 € → oft Paid günstiger
Empfehlung: Privat/Lernen zuerst optimieren; kommerziell eher direkt Paid.
Nach dem Upgrade noch optimieren?
Kern: Abrechnung verstehen, dann gezielt optimieren. Free wirkt großzügig, geht schnell auf – meist nicht zu viel Traffic, sondern ineffiziente Nutzung. Free-Tier fair nutzen; extremes „Ausreizen“ kann Throttling oder Sperre bedeuten.
Schritte bei knappem Kontingent:
1) Analytics: welche Pfade verbrauchen?
2) Cache + KV zuerst
3) Drei Fallen prüfen (Subrequests, cacheTtl, Redirect-Ketten)
4) Alle 7 Tipps kombinieren
5) Erst dann Paid
6 Min. Lesezeit · Veröffentlicht am: 1. Dez. 2025 · Aktualisiert am: 4. Juli 2026
Cloudflare Full Stack
Wenn du über die Suche hier gelandet bist, kommst du am schnellsten weiter, indem du zum vorherigen oder nächsten Beitrag dieser Serie springst.
Vorheriger
API Key im Frontend offengelegt? Workers-Proxy schützt Secrets in 5 Minuten – 100.000 kostenlose Requests täglich
Direkte API-Aufrufe aus dem Frontend leaken Keys leicht. So bauen Sie mit Cloudflare Workers einen kostenlosen API-Proxy in 5 Minuten – Key in Server-Umgebungsvariablen, 100.000 kostenlose Anfragen/Tag, CORS inklusive.
Teil 16 von 23
Nächster
Astro Cloudflare-Deployment: Kompletter Leitfaden – SSR-Konfiguration + 3× schnellerer Zugriff aus China
Astro von null auf Cloudflare Pages deployen: SSR-Adapter in drei Modi, drei Optimierungsansätze für den Zugriff aus China (Premium-IP, CNAME, regionale DNS-Auflösung) – Latenz in Tests um das Dreifache reduziert
Teil 18 von 23
Ähnliche Beiträge
Cloudflare Free Plan Limits 2026: Free, Pro und Business richtig wählen

Cloudflare Free Plan Limits 2026: Free, Pro und Business richtig wählen
Cloudflare Pages: Statischen Blog deployen – 5 Frameworks ohne typische Fehler


Kommentare
Melde dich mit GitHub an, um einen Kommentar zu hinterlassen