Skip to content

Type de ressource : Binding Cloudflare (Queue)
Fichier source : services/form-handler/wrangler.toml, services/submission-processor/wrangler.toml
Statut : Actif

Queue Cloudflare pour le traitement asynchrone des soumissions de formulaire. Le Worker form-handler (producer) envoie les soumissions validées dans la Queue, et le Worker submission-processor (consumer) traite les messages et crée des documents dans Sanity.

  • DĂ©coupler la validation du traitement asynchrone
  • Fournir une rĂ©silience asynchrone sans bloquer l’utilisateur
  • Permettre le retry exponentiel en cas d’erreur Sanity
  • Optimiser les performances via le traitement par batch
Propriété Valeur
Type de binding Queue
Nom du binding SUBMISSIONS_QUEUE
Nom de la ressource submissions-queue-dev (dev), submissions-queue-prod (production)
Environnements Development, Production
Workers consommateurs form-handler (producer), submission-processor (consumer)
[Form Handler Worker]
│ ‱ Envoi de la soumission validĂ©e
▌
[Queue Cloudflare (submissions-queue)]
│ ‱ File d'attente asynchrone
▌
[Submission-processor Worker]
│ ‱ Consommation par batch (max 10)
▌
[Sanity CMS]
│ ‱ CrĂ©ation du document submission
Composant RĂŽle Type
form-handler Producer (envoie les soumissions) Worker L3
SUBMISSIONS_QUEUE File d’attente asynchrone Cloudflare Service
submission-processor Consumer (traite les soumissions) Worker L3
Sanity API Stockage des soumissions Service tiers
# services/form-handler/wrangler.toml (Producer)
[[queues.producers]]
queue = "submissions-queue-dev"
binding = "SUBMISSIONS_QUEUE"
[env.dev]
[[env.dev.queues.producers]]
queue = "submissions-queue-dev"
binding = "SUBMISSIONS_QUEUE"
[env.production]
[[env.production.queues.producers]]
queue = "submissions-queue-prod"
binding = "SUBMISSIONS_QUEUE"
# services/submission-processor/wrangler.toml (Consumer)
[[env.dev.queues.consumers]]
queue = "submissions-queue-dev"
max_batch_size = 10
max_batch_timeout = 30
[[env.production.queues.consumers]]
queue = "submissions-queue-prod"
max_batch_size = 10
max_batch_timeout = 30
Terminal window
# Création des Queues
wrangler queues create submissions-queue-dev
wrangler queues create submissions-queue-prod
Variable Description Obligatoire Valeur par défaut
ENVIRONMENT Environnement (dev/production) ✅ dev
// Interface Env du Worker producer (form-handler)
export interface Env {
SUBMISSIONS_QUEUE: Queue;
ENVIRONMENT: string;
}
// Interface Env du Worker consumer (submission-processor)
export interface Env {
SUBMISSIONS_QUEUE: Queue;
ENVIRONMENT: string;
SANITY_PROJECT_ID: string;
SANITY_DATASET: string;
SANITY_API_WRITE_TOKEN?: string;
}

4.2. Utilisation dans un Worker producteur (form-handler)

Section titled “4.2. Utilisation dans un Worker producteur (form-handler)”
// Envoi dans la Queue
const submission = {
name: validatedData.name,
email: validatedData.email,
message: validatedData.message,
submittedAt: new Date().toISOString(),
id: crypto.randomUUID(),
environment: env.ENVIRONMENT,
};
await env.SUBMISSIONS_QUEUE.send(submission);

4.3. Utilisation dans un Worker consommateur (submission-processor)

Section titled “4.3. Utilisation dans un Worker consommateur (submission-processor)”
export default {
async queue(batch: MessageBatch<SubmissionMessage>, env: Env): Promise<void> {
console.log(`Processing batch of ${batch.messages.length} submissions`);
const sanityClient = createClient({
projectId: env.SANITY_PROJECT_ID,
dataset: env.SANITY_DATASET,
apiVersion: '2024-01-01',
token: env.SANITY_API_WRITE_TOKEN,
useCdn: false,
});
for (const message of batch.messages) {
try {
const submission = message.body as SubmissionMessage;
console.log(`Processing submission ${submission.id} from ${submission.email}`);
// Create document in Sanity
const result = await sanityClient.create({
_type: 'submission',
name: submission.name,
email: submission.email,
message: submission.message,
status: 'pending',
submittedAt: submission.submittedAt,
processedAt: new Date().toISOString(),
});
console.log(`Successfully stored submission ${submission.id} in Sanity with ID: ${result._id}`);
// Acknowledge message
message.ack();
} catch (error) {
console.error(`Failed to process submission:`, error);
// Retry with exponential backoff
message.retry({
delaySeconds: Math.min(60, Math.pow(2, batch.messages.indexOf(message))),
});
}
}
},
};

Contexte : Le Worker form-handler utilise une Queue pour traiter les soumissions de formulaire de maniĂšre asynchrone.

Configuration :

  • Nom de la Queue : submissions-queue-dev (dev), submissions-queue-prod (production)
  • Binding : SUBMISSIONS_QUEUE
  • Batch size : 10 messages
  • Batch timeout : 30 secondes
  • Rationale : RĂ©silience asynchrone sans bloquer l’utilisateur

Flux :

  1. User soumet le formulaire via Astro
  2. Astro envoie vers /api/submit
  3. /api/submit délÚgue à form-handler
  4. form-handler valide via Zod
  5. form-handler envoie dans la Queue
  6. submission-processor consomme la Queue
  7. submission-processor crée le document Sanity
Binding AccĂšs Rationale
SUBMISSIONS_QUEUE Workers uniquement Pas d’accùs direct depuis le client
  • ✅ Les bindings sont accessibles uniquement depuis les Workers (pas depuis le navigateur)
  • ✅ Les Queues ne sont pas accessibles publiquement (Workers uniquement)

Non applicable - aucun secret n’est utilisĂ© dans ce binding.

Binding Limite Rationale
Queue 5 000 messages/s, 10 MB max par message Quota Cloudflare
  • ✅ Utiliser les Queues pour le traitement asynchrone (Ă©vite les timeouts)
  • ✅ Traitement par batch (max 10 messages)
  • ✅ Retry exponentiel pour les erreurs (max 60s)
Binding ModÚle de coût Estimation mensuelle
Queue $0.40/1M messages ~$1-2

Non implĂ©mentĂ© - aucune mĂ©trique ou alerte n’est configurĂ©e.

Terminal window
# Inspection Queue
wrangler queues info submissions-queue-dev
# Logs en temps réel
wrangler tail form-handler
wrangler tail submission-processor
SymptĂŽme Cause probable Solution
“Binding not found” Binding mal configurĂ© dans wrangler.toml VĂ©rifier la configuration et redĂ©ployer
“Queue full” Consommateur trop lent Augmenter max_batch_size ou ajouter des consommateurs
Messages non consommés Consumer non déployé Vérifier le déploiement de submission-processor
Terminal window
# Test Queue (envoi manuel via curl)
curl -X POST http://localhost:8789/test-direct \
-H "Content-Type: application/json" \
-d '{"name":"Test","email":"test@example.com","message":"Test message"}'
  • ✅ Utiliser les Queues pour le traitement asynchrone (formulaires, webhooks)
  • ✅ SĂ©parer les queues par environnement (production, staging)
  • ✅ Documenter les bindings dans ce fichier
  • ✅ Typer strictement les bindings dans l’interface Env
  • ✅ GĂ©rer les erreurs de maniĂšre explicite (try/catch)
  • ✅ Logger les opĂ©rations critiques pour l’audit
  • ✅ Utiliser le retry exponentiel pour les erreurs temporaires
  • ✅ Utiliser les Queues pour Ă©viter les timeouts
  • ✅ Traitement par batch pour optimiser les performances
  • ✅ Surveiller les mĂ©triques de performance (latence, dĂ©bit)
  • ✅ Ne jamais exposer les bindings cĂŽtĂ© client
  • ✅ Les Queues ne sont pas accessibles publiquement
  • Configuration de monitoring (mĂ©triques, alertes)
  • Ajout d’une Dead Letter Queue (DLQ) pour les messages Ă©chouĂ©s
  • Ajout de mĂ©triques de profondeur de queue
  • ❌ Les Queues ont une limite de 10 MB par message
  • ❌ Pas de Dead Letter Queue (DLQ) configurĂ©e
  • ❌ Pas de monitoring configurĂ©
  • Documentation Cloudflare Queues : Getting Started
  • Workers consommateurs :
    • services/form-handler/
    • services/submission-processor/
  • Fichiers concernĂ©s :
    • services/form-handler/wrangler.toml
    • services/submission-processor/wrangler.toml
    • Configuration Dashboard Cloudflare → Queues
Date Version Description Auteur
2026-09-15 1.0 Création initiale Devin
Edit page

Last updated: