ADR: Utilisation de Cloudflare Queue pour le traitement asynchrone des formulaires
- Statut : Accepté
- Date : 2026-09-16
- Auteur : Devin
1. Contexte et Problématique
Section titled â1. Contexte et ProblĂ©matiqueâLe formulaire de contact du site doit ĂȘtre capable de traiter les soumissions de maniĂšre fiable et performante. Lâarchitecture de la couche L3 (Backend) repose sur Cloudflare Workers, qui ont des limites de ressources (RAM, CPU time) et ne peuvent pas bloquer lâutilisateur pendant des traitements potentiellement longs (ex: envoi vers un CRM, crĂ©ation de documents Sanity).
Les exigences sont :
- RĂ©ponse immĂ©diate Ă lâutilisateur (pas de timeout)
- Résilience en cas de panne de services tiers (Sanity, CRM)
- Scalabilité pour gérer les pics de soumissions
- Traitement asynchrone sans bloquer le frontend
2. Décision Architecturale
Section titled â2. DĂ©cision ArchitecturaleâNous dĂ©cidons dâutiliser Cloudflare Queue pour dĂ©coupler la validation des soumissions de leur traitement asynchrone.
Lâarchitecture adoptĂ©e est la suivante :
- Worker form-handler (Producer) : Valide les donnĂ©es via Zod, crĂ©e un objet de soumission avec mĂ©tadonnĂ©es, et lâenvoie dans la Queue.
- Queue Cloudflare (submissions-queue) : Stocke les soumissions en file dâattente asynchrone.
- Worker submission-processor (Consumer) : Consomme les messages de la Queue par batch (max 10), crée les documents dans Sanity, et gÚre les erreurs avec retry exponentiel.
3. Justification du choix
Section titled â3. Justification du choixâ3.1. Pourquoi Cloudflare Queue ?
Section titled â3.1. Pourquoi Cloudflare Queue ?â- DĂ©couplage des responsabilitĂ©s : La validation (form-handler) est sĂ©parĂ©e du traitement (submission-processor), permettant une maintenance facilitĂ©e.
- Résilience asynchrone : En cas de panne de Sanity ou du CRM, les soumissions restent dans la Queue et seront réessayées automatiquement.
- Performance utilisateur : Lâutilisateur reçoit une rĂ©ponse immĂ©diate (success/400) sans attendre le traitement complet.
- Scalabilité : Cloudflare Queue absorbe les pics de trafic sans saturation, avec un traitement par batch optimisé.
- Retry exponentiel : Le systÚme de retry intégré permet de gérer les erreurs temporaires sans code complexe.
3.2. Pourquoi pas dâautres approches ?
Section titled â3.2. Pourquoi pas dâautres approches ?â- Traitement synchrone : Exclu car bloquerait lâutilisateur et pourrait timeout les Workers.
- Worker direct vers Sanity : Exclu car aucune résilience en cas de panne Sanity.
- Base de donnĂ©es intermĂ©diaire : Exclu car Cloudflare Queue est plus adaptĂ© au pattern message-based et Ă©vite la gestion dâune DB supplĂ©mentaire.
4. Conséquences de la décision
Section titled â4. ConsĂ©quences de la dĂ©cisionâEffets Positifs (Avantages)
Section titled âEffets Positifs (Avantages)â- RĂ©ponse immĂ©diate : Lâutilisateur reçoit une confirmation en < 100ms, amĂ©liorant lâUX.
- Résilience automatique : Les erreurs Sanity sont gérées par retry exponentiel (max 60s).
- Traitement par batch : Le consommateur traite jusquâĂ 10 messages par batch, optimisant les coĂ»ts et performances.
- Observabilité : Chaque soumission a un ID unique pour le traçage.
Effets Négatifs (Inconvénients & Risques)
Section titled âEffets NĂ©gatifs (InconvĂ©nients & Risques)â- ComplexitĂ© additionnelle : NĂ©cessite de gĂ©rer deux Workers (producer et consumer) au lieu dâun seul.
- Pas de Dead Letter Queue (DLQ) : Les messages qui échouent définitivement ne sont pas déplacés vers une DLQ (à implémenter si nécessaire).
- DĂ©lai de traitement : Le traitement nâest pas instantanĂ© (quelques secondes selon la charge de la Queue).
- Observabilité limitée : Pas de monitoring configuré pour surveiller la profondeur de la Queue.
5. Alternatives Exclues
Section titled â5. Alternatives Excluesâ- Traitement synchrone dans form-handler : Exclu car bloquerait lâutilisateur et pourrait timeout.
- Worker direct vers Sanity sans Queue : Exclu car aucune résilience en cas de panne.
- Base de donnĂ©es intermĂ©diaire (D1) : Exclu car Cloudflare Queue est plus adaptĂ© au pattern message-based et Ă©vite la gestion dâune DB supplĂ©mentaire.
- Webhook vers service tiers : Exclu car ajouterait une dépendance externe et une complexité inutile.