Quota Workers gratuit insuffisant ? 7 astuces pour tenir un mois avec 100 000 requêtes

Le mois dernier, j’ai monté un hébergeur d’images avec Workers et R2 — setup parfait en apparence. En moins de 3 jours, mail de Cloudflare : quota gratuit presque épuisé.
Je ne comprenais pas : 100 000 req/j, non ? Mon petit hébergeur, combien de trafic ? Analytics : 120 000 req/j en moyenne. Impossible — quelques dizaines d’images seulement.
Deux jours de doc et de discussions communautaires plus tard, j’ai compris les pièges de la facturation Workers : sous-requêtes, lectures KV, hits cache — tout consomme discrètement.
Bonne nouvelle : une fois les règles claires, quelques optimisations ont fait passer la moyenne de 120 000 à 30 000 req/j. Quota mensuel largement suffisant, ~30 % de marge. Voici l’expérience terrain pour éviter les 5 $/mois du plan payant.
Ne vous faites pas avoir ! Les « 100 000 » ne sont pas ce que vous croyez
La doc Cloudflare « 100 000 requêtes/jour » prête facilement à confusion. Au début, je pensais : mon Worker est appelé 100 000 fois, c’est fini. Ce n’est pas si simple.
Vérité 1 : sous-requêtes non facturées séparément, mais limitées
Dans un Worker, fetch() vers une API, lecture R2, requête KV = sous-requêtes. Bonne nouvelle : pas de facturation séparée. Mauvaise : 50 sous-requêtes max par requête en gratuit, 1000 en payant.
Exemple : visite de l’hébergeur (1 requête facturée), KV pour les droits (1 sous-requête), R2 pour l’image (1 sous-requête) = 1 requête facturée malgré 2 sous-requêtes.
Service d’agrégation, 10 API par requête = 10 sous-requêtes. La limite de 50 paraît large ; en pratique, on la touche vite.
Vérité 2 : 100 000 = limite au niveau du compte, pas par Worker
Piège classique. J’ai cru pouvoir répartir sur plusieurs Workers — en fait, c’est tout le compte qui est limité à 100 000. Dix Workers = toujours 100 000 au total.
Contourner avec plusieurs Workers ? Non. La limite est par compte. Seules options : payer ou optimiser.
Vérité 3 : lectures KV et Cache API comptent aussi
Souvent ignoré. Chaque KV.get() consomme des requêtes, même sans compter dans la limite de sous-requêtes. KV à chaque visite pour les droits = +1 opération KV par visite.
Idem pour Cache API : match() et put() ont un coût, même si le cache réduit les allers-retours vers l’origine.
Les 3 pièges que j’ai touchés
C’est ce qui a fait exploser mes compteurs :
-
Piège 1 : proxy inverse sans cache, sous-requête systématique
Service relais API :fetch()à chaque fois, sans cache. Cache API ajouté, 80 % de hits, requêtes divisées par deux. -
Piège 2 : lectures KV fréquentes, paramètre cacheTtl ignoré
Chaque image :KV.get()pour les droits. Je ne savais pas pourcacheTtl. AveccacheTtl: 600(10 min), −70 % de lectures KV. -
Piège 3 : chaque saut de redirection compte
Liens courts en302. Chaîne de 3 sauts (A→B→C→cible) = 1 sous-requête par saut. URL finale directe → −2 comptages.
Ensemble, c’est pourquoi je suis passé de 100 000 à 120 000. Quota insuffisant ? Vérifiez d’abord ces pièges.
7 astuces pour étirer le quota gratuit d’un mois
Règles comprises, j’ai testé beaucoup de pistes. Ces 7 astuces sont celles qui ont le mieux marché, sans complexité excessive.
Astuce 1 : bien utiliser le cache, −80 % de requêtes dupliquées
La plus rapide. Beaucoup de projets Workers n’ont pas besoin de recalcul temps réel à chaque hit.
Avant optimisation, chaque image : validation → R2 → réponse. Après ajout de Cache API :
const cache = caches.default;
const cacheKey = new Request(request.url, request);
// Vérifier le cache d'abord
let response = await cache.match(cacheKey);
if (response) {
return response; // Hit cache, retour direct
}
// Miss cache, traiter la requête
response = await handleRequest(request);
// Mettre en cache (images statiques 1 jour)
response = new Response(response.body, {
...response,
headers: {
...response.headers,
'Cache-Control': 'public, max-age=86400',
},
});
await cache.put(cacheKey, response.clone());
return response;
Résultat : 85 % de hits. 120 000 req/j → 18 000 passent vraiment par la logique Worker, −102 000.
{{< geo:stats >}}
75% | Réduction des requêtes | De 120 000 à 30 000 req/j
85% | Taux de cache | De 0 % à 85 %
60 $ | Économie annuelle | Plan payant évité
{{< /geo:stats >}}
Astuce 2 : optimisation KV en 3 points
KV est très utilisé avec Workers, et gros poste de consommation. Trois leviers :
-
Augmenter cacheTtl
Cache edge par défaut : 60 s. Si les données changent peu :// Avant const value = await KV.get('key'); // Après (cache 10 min) const value = await KV.get('key', { cacheTtl: 600 });Mes droits changent toutes les 30 min →
cacheTtl: 1800, −70 % de lectures KV. -
Cache API pour les résultats KV
Données plus stables (config, liste noire) :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(); -
Écritures non bloquantes avec waitUntil
Écrire KV sans attendre la fin :// Retourner avant la fin de l'écriture KV event.waitUntil(KV.put('key', 'value')); return new Response('OK');
Combinées, mes opérations KV passent de ~30 000/j à ~8000/j.
Astuce 3 : réduire les sous-requêtes inutiles
Souvent optimisables. Agrégateur : 5 API externes = 5 sous-requêtes/requête. Ensuite :
- Cache 5 min pour API fréquentes
- KV 24 h pour API rares
- Prétraitement et stockage R2 si possible
80 % des requêtes sans aucune sous-requête, retour direct depuis le cache.
Astuce 4 : Request.cache pour affiner le comportement
Depuis novembre 2024, Cloudflare expose Request.cache :
// Ignorer le cache (données sensibles)
const response = await fetch(url, { cache: 'no-store' });
// Stratégie par défaut
const response = await fetch(url, { cache: 'default' });
Images privées : cache: 'no-store'. Images publiques : default, optimisation automatique Cloudflare.
Astuce 5 : optimiser les chaînes de redirection
Chaque saut 302/301 dans une chaîne = sous-requête.
Avant (liens courts) :
// Avant : 302
return Response.redirect(targetUrl, 302);
Après :
// Après : cache de l'URL finale
const cached = await cache.match(shortUrl);
if (cached) {
return cached; // URL finale en cache
}
Pour bit.ly → t.co → cible : stocker l’URL finale, éviter la chaîne à chaque visite.
Astuce 6 : Analytics pour repérer les « gouffres »
Analytics Cloudflare est gratuit — utilisez-le.
80 % du volume vient souvent de 20 % des chemins. Vous voyez :
- Chemins les plus sollicités
- Faible taux de cache
- Latence élevée
Optimiser en priorité les plus gros consommateurs. Mon /api/status : monitoring toutes les minutes, 100 appels/min, 15 % du quota/j. Cache 60 s → −15 000 req/j.
Astuce 7 : tâches non urgentes en creux
Cron Triggers pour statistiques, nettoyage, préchauffage cache.
Mon hébergeur comptait les visites dans KV à chaque hit. Désormais :
- Compteur en mémoire à la visite (pas d’écriture KV)
- Cron horaire pour agrégation
Écritures KV : ~20 000/j → 24/j.
Cas pratique : hébergeur de 120 000 à 30 000 req/j
Effet combiné ? Mon hébergeur, étape par étape.
Contexte
Hébergeur simple :
- Cloudflare Workers pour les requêtes
- R2 pour les fichiers
- KV pour métadonnées et droits
- ~2000 visites d’images/j (trafic réel)
Jour 3 : alerte Cloudflare, ~120 000 req/j, proche du plafond gratuit.
Diagnostic
Analytics + revue de code, 3 problèmes :
-
KV à chaque requête image
KV.get()pour métadonnées (nom, taille, auteur) à chaque visite. 2000 visites = 2000 lectures. Données quasi statiques. -
Pas de cache navigateur
Pas deCache-Control→ rechargement à chaque refresh. Même image, 10 requêtes = 10 appels Worker. -
Miniatures générées à la volée
Liste avec 30 vignettes = 30 traitements Worker par page. Quelques pages → explosion.
2000 visites utiles → 120 000 appels Worker.
Plan d’optimisation
Étape 1 : cache KV (gain le plus rapide)
// Avant
const metadata = await IMAGE_KV.get(imageId);
// Après
const metadata = await IMAGE_KV.get(imageId, {
cacheTtl: 600 // Cache 10 min
});
Effet : 2000 → ~300 lectures KV/j (−85 %)
Étape 2 : cache navigateur
return new Response(imageData, {
headers: {
'Content-Type': 'image/jpeg',
'Cache-Control': 'public, max-age=86400', // 1 jour
'CDN-Cache-Control': 'public, max-age=2592000' // CDN 30 jours
}
});
Effet : −60 % de revisites, 120 000 → 48 000
Étape 3 : miniatures pré-générées
À l’upload, stockage dans R2 thumbnails/ :
// À l'upload
const thumbnail = await generateThumbnail(image);
await R2.put(`thumbnails/${imageId}`, thumbnail);
// À la lecture
const thumbnail = await R2.get(`thumbnails/${imageId}`);
Effet : vignettes sans logique Worker lourde, 48 000 → 32 000
Étape 4 : couche cache Worker
const cache = caches.default;
let response = await cache.match(request);
if (response) return response;
// Traitement...
await cache.put(request, response.clone());
return response;
Effet : 78 % de hits, ~30 000 req/j stable
Résultats
| Indicateur | Avant | Après | Variation |
|---|---|---|---|
| Req/j | 120 000 | 32 000 | −73 % |
| Lectures KV | 2000 | 300 | −85 % |
| Taux cache | 0 % | 78 % | +78 % |
| Coût | +20 % quota | 70 % marge | −60 $/an |
Stable 2 mois, 30–40 000 req/j, quota gratuit OK. Plan payant 5 $/mois → 60 $ économisés/an.
Leçons
- Goulot d’abord : Analytics avant d’optimiser au hasard
- Le cache est roi : ~80 % des gains (navigateur, CDN, Worker)
- KV avec prudence : cacheTtl, précalcul
- Incrémental : 4 étapes, gain visible à chaque fois
Payer ou optimiser ? Le calcul
Optimiser ou payer 5 $/mois ? J’ai fait le calcul.
Gratuit vs payant (5 $/mois)
| Élément | Gratuit | Payant (5 $/mois) |
|---|---|---|
| Req/j | 100 000 | ~330 000 (10 M/mois) |
| Limite/min | 1000 | Pas de limite claire |
| Sous-requêtes | 50/requête | 1000/requête |
| Lectures KV | 100 000/j | 10 M/mois |
| Temps CPU | 10 ms | 50 ms |
| Coût/an | 0 $ | 60 $ |
Le payant séduit : ×3 req/j, ×20 sous-requêtes. Mais en avez-vous vraiment besoin ?
Quand upgrader ?
Trois cas où payer est raisonnable :
-
>100 000 req/j de façon stable
Pic ponctuel → optimiser. Une semaine d’affilée au-dessus → volume métier réel, payer simplifie. -
Beaucoup de sous-requêtes
Crawler, agrégateur, API gateway, 10+ API/requête : la limite de 50 est vite atteinte. Peu de marge d’optimisation ; 1000 en payant est plus adapté. -
Projet commercial : stabilité > coût
Client ou produit : ne pas économiser 5 $ sur le quota. SLA, tickets support — la stabilité vaut le prix.
Limites de l’optimisation
Parfois optimiser coûte plus cher que payer :
-
Code trop complexe
Cache, scripts, cron pour économiser 5 $ → maintenance difficile, temps > 5 $. -
Plafond atteint
Tout optimisé, quota encore insuffisant → payer. -
Temps vs 5 $
3 h d’optimisation, taux horaire > 20 € → payer est plus rentable.
Conseils :
- Perso / apprentissage : optimiser (économie + compétences)
- Petite équipe / début : optimiser au maximum, puis payer
- Commercial / client : payer directement
Optimiser après passage au payant ?
Oui. Mêmes règles. Sans optimisation, 10 M de requêtes s’épuisent aussi.
Dépassement : 0,50 $/million. 1 M req/j → ~15 $ de dépassement + 5 $ = 20 $/mois.
Conclusion
En une phrase : comprendre la facturation Workers, puis optimiser correctement.
100 000 req/j paraissent larges ; en pratique on dépasse vite. Souvent ce n’est pas le volume métier mais le manque d’optimisation.
Mon hébergeur : 2000 visites réelles, 120 000 requêtes. Cache, KV, précalcul → 30 000, marge confortable.
Quota insuffisant ? Étapes :
- Workers Analytics : chemins qui consomment
- Cache et KV en premier
- Vérifier les 3 pièges (sous-requêtes, cacheTtl, redirections)
- Combiner les 7 astuces
- Payer seulement si limite atteinte
Cloudflare est commercial : quota gratuit raisonnable. Abus → limitation ou suspension. Objectif : efficacité, pas contournement.
Si cet article vous a évité 5 $, partagez-le avec d’autres utilisateurs Workers. Exploitons le quota gratuit intelligemment.
Optimiser le quota gratuit Cloudflare Workers
De la facturation aux 7 astuces concrètes ; cas hébergeur 120 000 → 30 000 req/j, cache +80 %
Estimated time: PT2H
-
1
Step 1: Comprendre la facturation et les pièges
Règles Workers : -
2
Step 2: Vérité 1
sous-requêtes limitées mais non facturées séparément -
3
Step 3: • Gratuit
50/requête ; payant - 1000 -
4
Step 4: Vérité 2
100 000 = limite compte -
5
Step 5: Vérité 3
KV et Cache API comptent -
6
Step 6: Piège 1
proxy sans cache -
7
Step 7: • Cache API
80 % hits, requêtes ÷2 -
8
Step 8: Piège 2
KV sans cacheTtl -
9
Step 9: Piège 3
chaîne de redirections -
10
Step 10: 7 astuces : cache, KV, sous-requêtes
Astuce 1 : cache −80 % -
11
Step 11: • Avant
validation → R2 → réponse -
12
Step 12: • Cache API
85 % hits, 120 000 → 18 000 req réelles -
13
Step 13: Astuce 2
KV en 3 points -
14
Step 14: Astuce 3
moins de sous-requêtes -
15
Step 15: Astuce 4
redirections -
16
Step 16: Astuce 5
logique -
17
Step 17: Astuce 6
Analytics -
18
Step 18: Astuce 7
plan payant si besoin -
19
Step 19: Cas réel : hébergeur avant/après
Avant : -
20
Step 20: Stable 2 mois, 30–40 000 req/j. Leçons
goulot d’abord, cache roi, KV prudent, incrémental. -
21
Step 21: Payer ou optimiser
Gratuit : 100 000 req/j, 1000/min, 50 sous-req, 100 000 KV/j, 10 ms CPU, 0 $. Payant 5 $/mois : ~330 000 req/j, 1000 sous-req, 10 M KV/mois, 50 ms, 60 $/an. Upgrader si : stable >100 000, beaucoup de sous-requêtes, projet commercial. Limites : code trop complexe, plafond atteint, temps > 5 $. Après payant : toujours optimiser (dépassement 0,50 $/M). -
22
Step 22: Étapes et bonnes pratiques
1) Analytics 2) Cache et KV 3) 3 pièges 4) 7 astuces combinées 5) Payer si limite. Quota gratuit raisonnable. Comprendre la facturation, optimiser — 2000 visites → 120 000 requêtes → 30 000 avec marge.
FAQ
Comment sont calculées les 100 000 requêtes gratuites de Workers ?
Vérité 1 : les sous-requêtes ne sont pas facturées séparément mais sont limitées
• fetch() vers une API, lecture R2, requête KV dans un Worker = sous-requêtes
• Bonne nouvelle : pas de facturation séparée. Mauvaise : 50 sous-requêtes max par requête en gratuit, 1000 en payant
• Exemple : visite de votre hébergeur (1 requête facturée), KV pour les droits (1 sous-requête), R2 pour l'image (1 sous-requête) = 1 seule requête facturée
Vérité 2 : 100 000 = limite au niveau du compte, pas par Worker
• Piège courant : plusieurs Workers ne dispersent pas le quota
• 10 Workers = toujours 100 000 req/j au total
Vérité 3 : lectures KV et Cache API comptent aussi
• Chaque KV.get() consomme des requêtes, même sans limite de sous-requêtes
• Si chaque visite lit KV pour les droits, +1 opération KV par visite
• Cache API : match() et put() ont aussi un coût
Quels sont les 3 pièges les plus fréquents ? Comment les éviter ?
Piège 1 : proxy inverse sans cache, sous-requête à chaque fois
• Service API relais : fetch() systématique sans cache → sous-requête par visite
• Cache API ajouté, 80 % de hits, requêtes divisées par deux
• Solution : bien utiliser le cache, −80 % de requêtes dupliquées ; beaucoup de projets n'ont pas besoin de recalcul temps réel
Piège 2 : lectures KV fréquentes sans cacheTtl
• Hébergeur : KV.get() par image pour les droits, sans connaître cacheTtl
• cacheTtl: 600 (10 min) → −70 % de lectures KV
• Solution KV en 3 points :
1) Augmenter cacheTtl (60 s par défaut en edge)
2) Lectures groupées (Promise.all, pas en série)
3) Moins d'écritures (écriture plus coûteuse que lecture)
Piège 3 : chaîne de redirections comptée à chaque saut
• Service de liens courts : 302, chaîne A→B→C→cible = 1 sous-requête par saut
• Retour direct de l'URL finale → −2 comptages
• Solution : éviter les chaînes, renvoyer l'adresse finale
Quelles sont les 7 astuces concrètes ? Quels résultats ?
• La plus rapide à mettre en œuvre
• Avant : validation → R2 → réponse à chaque visite
• Après Cache API : 85 % de hits, 120 000 → 18 000 req/j réelles, −102 000
Astuce 2 : optimisation KV en 3 points
1) cacheTtl : 60 s par défaut, augmenter si données stables
2) Lectures groupées : Promise.all pour plusieurs clés
3) Moins d'écritures : précalculer plutôt qu'écrire en temps réel
Astuce 3 : moins de sous-requêtes
• Fusionner les appels API
• URL publique R2 pour lecture directe sans Worker
Astuce 4 : redirections raisonnables
• Éviter les chaînes, renvoyer l'URL finale
Astuce 5 : optimiser la logique
• Moins de calcul inutile, plus de cache
Astuce 6 : monitoring
• Workers Analytics : quels chemins consomment le quota
Astuce 7 : plan payant si limite atteinte
• 5 $/mois, ×3 requêtes/j, ×20 sous-requêtes
Quels résultats dans le cas réel ?
Avant :
• 120 000 req/j
• 2000 lectures KV
• 0 % cache
• +20 % au-delà du quota
Après :
• 32 000 req/j (−73 %)
• 300 lectures KV (−85 %)
• 78 % cache (+78 %)
• 70 % de marge (−60 $/an)
Stable depuis 2 mois, 30–40 000 req/j, quota gratuit largement suffisant. Plan payant 5 $/mois → 60 $ économisés/an.
Leçons :
1) Identifier le goulot d'abord (Analytics)
2) Le cache est roi (80 % des gains)
3) KV avec prudence (cacheTtl, précalcul)
4) Optimisation incrémentale (4 étapes)
Exemple : 2000 visites réelles → 120 000 requêtes. Cache, KV, précalcul → 30 000, marge confortable.
Quand payer ? Quand optimiser ?
Gratuit :
• 100 000 req/j
• 1000/min
• 50 sous-requêtes/requête
• 100 000 lectures KV/j
• 10 ms CPU
• 0 $/an
Payant :
• ~330 000 req/j (10 M/mois)
• Pas de limite claire/min
• 1000 sous-requêtes/requête
• 10 M lectures KV/mois
• 50 ms CPU
• 60 $/an
Quand upgrader :
1) >100 000 req/j de façon stable (pas un pic ponctuel)
2) Beaucoup de sous-requêtes (crawler, agrégateur, API gateway, 10+ API/requête)
3) Projet commercial : stabilité > coût (SLA, tickets support)
Limites de l'optimisation :
1) Code trop complexe pour économiser 5 $
2) Tout optimisé et quota encore insuffisant → payer
3) 3 h d'optimisation vs 5 $ : si taux horaire > 20 €, payer est plus rentable
Conseil : perso/learning → optimiser ; petite équipe → optimiser au max puis payer ; commercial → payer directement
Faut-il encore optimiser après passage au payant ?
Dépassement payant : 0,50 $/million. 1 M req/j → 15 $ de dépassement + 5 $ de base = 20 $/mois.
En résumé : comprendre la facturation Workers, puis optimiser correctement.
100 000 req/j semblent larges mais se consomment vite. Souvent ce n'est pas le volume métier mais le manque d'optimisation.
Cloudflare est une entreprise commerciale : quota gratuit à utiliser raisonnablement. Abus excessif → limitation ou suspension. Objectif : efficacité, pas contournement.
Si quota insuffisant :
1) Workers Analytics : chemins qui consomment
2) Cache et KV en premier
3) Vérifier les 3 pièges (sous-requêtes, cacheTtl, redirections)
4) Combiner les 7 astuces
5) Payer seulement si limite atteinte
9 min de lecture · Publié le: 1 déc. 2025 · Mis à jour le: 27 juil. 2026
Cloudflare Full Stack
Si vous arrivez depuis la recherche, le plus rapide est de passer à l’article précédent ou suivant de cette série.
Précédent
Clé API exposée côté frontend ? Proxy Workers en 5 minutes, 100 000 requêtes gratuites/jour
Appeler une API directement depuis le frontend expose vos clés et peut entraîner des frais frauduleux. Apprenez à déployer un proxy API gratuit avec Cloudflare Workers en 5 minutes : clé stockée côté serveur, 100 000 requêtes gratuites par jour, et résolution CORS incluse.
Partie 16 sur 23
Suivant
Guide complet Astro sur Cloudflare : configuration SSR et accès Chine ×3 plus rapide
Déployez Astro sur Cloudflare Pages de zéro, configurez les trois modes de l'adaptateur SSR, et appliquez trois stratégies d'optimisation pour l'accès depuis la Chine (IP optimisées, CNAME, résolution par opérateur) — latence réduite jusqu'à ×3 en conditions réelles
Partie 18 sur 23



Commentaires
Connectez-vous avec GitHub pour laisser un commentaire