Que fait Tâches d'arrière-plan ?
Règles
- Décharger les travaux lents vers des tâches d'arrière-plan : emails, traitement d'images, webhooks, rapports, appels IA
- BullMQ pour les files Redis auto-hébergées — Inngest ou Trigger.dev pour les solutions serverless/managées
- Chaque tâche doit être idempotente — sans danger à réexécuter sans effets secondaires (utiliser des clés d'idempotence)
- Réessayer avec backoff exponentiel : 3-5 tentatives, délais de 1s, 10s, 60s, 5min
- File d'attente morte (DLQ) : après le nombre maximal de tentatives, déplacer vers la DLQ pour investigation — ne jamais supprimer silencieusement
- Définir des limites de concurrence par file — éviter la surcharge des workers (ex. :
concurrency: 5)
- Les charges utiles des tâches doivent être petites : passer des IDs et des références, pas des objets complets
- Séparer les files par priorité :
critical (paiements), default (emails), low (analytique)
- Surveiller la profondeur de la file et le temps de traitement — alerter en cas d'accumulation dans la file
Motifs
import { Queue, Worker } from "bullmq";
const queue = new Queue("emails", { connection: redis });
await queue.add("welcome", { userId }, {
attempts: 3,
backoff: { type: "exponential", delay: 1000 },
});
const worker = new Worker("emails", async (job) => {
await sendWelcomeEmail(job.data.userId);
}, { connection: redis, concurrency: 5 });
import { inngest } from "./client";
export const sendEmail = inngest.createFunction(
{ id: "send-welcome-email", retries: 3 },
{ event: "user/created" },
async ({ event }) => { await sendWelcomeEmail(event.data.userId); }
);
À éviter
- Traiter les tâches lentes dans les gestionnaires de requêtes API — répondre rapidement, traiter en arrière-plan
- Tâches non-idempotentes — une exécution en double entraînera des doubles facturations, des doubles emails
- Concurrence illimitée — épuisera les connexions à la base de données et la mémoire
- Stocker de grandes charges utiles dans la file d'attente — passer des références à la place