Changer le thème

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

Easton editorial illustration: developer problem-solving desk

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 :

  1. 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.

  2. Piège 2 : lectures KV fréquentes, paramètre cacheTtl ignoré
    Chaque image : KV.get() pour les droits. Je ne savais pas pour cacheTtl. Avec cacheTtl: 600 (10 min), −70 % de lectures KV.

  3. Piège 3 : chaque saut de redirection compte
    Liens courts en 302. 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.

85%
Amélioration du taux de cache
Hébergeur : 120 000 → 30 000 req/j, cache +80 %, 60 $ économisés/an

{{< 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 :

  1. 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.

  2. 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();
  3. É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 :

  1. KV à chaque requête image
    KV.get() pour métadonnées (nom, taille, auteur) à chaque visite. 2000 visites = 2000 lectures. Données quasi statiques.

  2. Pas de cache navigateur
    Pas de Cache-Control → rechargement à chaque refresh. Même image, 10 requêtes = 10 appels Worker.

  3. 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

IndicateurAvantAprèsVariation
Req/j120 00032 000−73 %
Lectures KV2000300−85 %
Taux cache0 %78 %+78 %
Coût+20 % quota70 % marge−60 $/an

Stable 2 mois, 30–40 000 req/j, quota gratuit OK. Plan payant 5 $/mois → 60 $ économisés/an.

Leçons

  1. Goulot d’abord : Analytics avant d’optimiser au hasard
  2. Le cache est roi : ~80 % des gains (navigateur, CDN, Worker)
  3. KV avec prudence : cacheTtl, précalcul
  4. 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émentGratuitPayant (5 $/mois)
Req/j100 000~330 000 (10 M/mois)
Limite/min1000Pas de limite claire
Sous-requêtes50/requête1000/requête
Lectures KV100 000/j10 M/mois
Temps CPU10 ms50 ms
Coût/an0 $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 :

  1. >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.

  2. 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é.

  3. 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 :

  1. Code trop complexe
    Cache, scripts, cron pour économiser 5 $ → maintenance difficile, temps > 5 $.

  2. Plafond atteint
    Tout optimisé, quota encore insuffisant → payer.

  3. 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 :

  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

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. 1

    Step 1: Comprendre la facturation et les pièges

    Règles Workers :
  2. 2

    Step 2: Vérité 1

    sous-requêtes limitées mais non facturées séparément
  3. 3

    Step 3: • Gratuit

    50/requête ; payant - 1000
  4. 4

    Step 4: Vérité 2

    100 000 = limite compte
  5. 5

    Step 5: Vérité 3

    KV et Cache API comptent
  6. 6

    Step 6: Piège 1

    proxy sans cache
  7. 7

    Step 7: • Cache API

    80 % hits, requêtes ÷2
  8. 8

    Step 8: Piège 2

    KV sans cacheTtl
  9. 9

    Step 9: Piège 3

    chaîne de redirections
  10. 10

    Step 10: 7 astuces : cache, KV, sous-requêtes

    Astuce 1 : cache −80 %
  11. 11

    Step 11: • Avant

    validation → R2 → réponse
  12. 12

    Step 12: • Cache API

    85 % hits, 120 000 → 18 000 req réelles
  13. 13

    Step 13: Astuce 2

    KV en 3 points
  14. 14

    Step 14: Astuce 3

    moins de sous-requêtes
  15. 15

    Step 15: Astuce 4

    redirections
  16. 16

    Step 16: Astuce 5

    logique
  17. 17

    Step 17: Astuce 6

    Analytics
  18. 18

    Step 18: Astuce 7

    plan payant si besoin
  19. 19

    Step 19: Cas réel : hébergeur avant/après

    Avant :
  20. 20

    Step 20: Stable 2 mois, 30–40 000 req/j. Leçons

    goulot d’abord, cache roi, KV prudent, incrémental.
  21. 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. 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 ?
La vérité sur la facturation 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 ?
Les 3 pièges les plus fréquents :

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 ?
Astuce 1 : cache pour −80 % de requêtes dupliquées
• 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 ?
Cas réel : hébergeur d'images avant/après

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 vs payant (5 $/mois) :

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 ?
Oui. Mêmes règles de facturation. Sans optimisation, 10 M de requêtes peuvent être épuisées.

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

Commentaires

Connectez-vous avec GitHub pour laisser un commentaire

Easton BlogEaston Blog