Habilidad de Worker de Cola
Worker de BullMQ con reintentos y lista de verificación de DLQ - una Habilidad de Agente para el procesamiento asíncrono de trabajos en Node.js 24 con Redis.
Busca en todas las páginas de la documentación
Worker de BullMQ con reintentos y lista de verificación de DLQ - una Habilidad de Agente para el procesamiento asíncrono de trabajos en Node.js 24 con Redis.
Produce un plan de arranque de worker: definición de cola, entrada del proceso de worker, esquema de carga útil, política de reintentos/DLQ, hooks de observabilidad y división del despliegue de la API HTTP.
| Entrada | Por qué |
|---|---|
| Nombre de la cola | email, webhooks-outbound |
| Forma de la carga útil del trabajo | Campos del esquema Zod |
| Objetivo de concurrencia | CPU del pod del worker y límites de tasa ascendentes |
| URL de Redis | Clúster compartido o Redis de cola dedicado |
| Necesidades de idempotencia | Los trabajos tipo pago necesitan claves de deduplicación |
src/queues/<name>.queue.ts - Productor de colasrc/workers/<name>.worker.ts - Consumidor de workersrc/schemas/<name>.job.ts - Esquema de carga útil Zodpackage.json: "worker:<name>": "node dist/workers/<name>.worker.js"new Worker() dentro de server.ts HTTP.maxRetriesPerRequest: null en las conexiones ioredis utilizadas por los workers de BullMQ.parse lanza una excepción → reintento de BullMQ; registra los "poison pills".removeOnComplete: true ilimitado - mantén los últimos N para depuración.await worker.close() antes de salir para trabajos en curso.jobId, attemptsMade, no la carga útil completa de PII.Tarjeta de receta de referencia rápida - lista para copiar y pegar.
# Verificación después de la salida de la habilidad
export REDIS_URL=redis://localhost:6379
npm run build
npm run worker:email &
WORKER_PID=$!
node -e "
import { emailQueue } from './dist/queues/email.queue.js';
const job = await emailQueue.add('send', { to: 'test@example.com', templateId: 'welcome' });
console.log('enqueued', job.id);
"
sleep 5
redis-cli LLEN bull:email:failed # espera 0 si tiene éxito
kill -TERM $WORKER_PID// src/schemas/email.job.ts
import { z } from "zod";
export const emailJobSchema = z.object({
to: z.string().email(),
templateId: z.string(),
vars: z.record(z.string()).default({}),
});
export type EmailJob = z.infer<typeof emailJobSchema>;// src/workers/email.worker.ts
import { Worker } from "bullmq";
import { createRedis } from "../redis.js";
import { emailJobSchema } from "../schemas/email.job.js";
import { sendEmail } from "../services/email.js";
const worker = new Worker(
"email",
async (job) => {
const payload = emailJobSchema.parse(job.data);
await sendEmail(payload);
},
{
connection: createRedis(),
concurrency: 5,
}
);
async function shutdown() {
await worker.close();
process.exit(0);
}
process.on("SIGTERM", shutdown);
process.on("SIGINT", shutdown);attempts configurados por tipo de trabajo (3-5 es típico)backoff: { type: "exponential", delay: 2000 }email-dlq O retenidos en el conjunto failedfailed en Redis/Bull BoardUsa la Habilidad de Worker de Cola:
- Cola: webhooks-outbound
- Carga útil: { url, secret, eventType, body }
- Concurrencia: 20
- Idempotencia: eventId único en Postgres
- Servicio: notifications-api (Fastify 5)El mismo repositorio está bien con npm run worker:* y K8s Deployment separados. Divide los paquetes cuando las dependencias del worker (librerías PDF) inflan el tamaño de la imagen de la API.
Apuntar a menos de 30 segundos. Un trabajo más largo debería guardar puntos de control o dividirse en trabajos encadenados. La detección de trabajos estancados de BullMQ penaliza el bloqueo de la CPU.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026