Conceptos básicos de colas
8 ejemplos para empezar con colas y workers para Node.js: 6 básicos y 2 intermedios.
Busca en todas las páginas de la documentación
8 ejemplos para empezar con colas y workers para Node.js: 6 básicos y 2 intermedios.
npm install bullmq ioredis
npm install -D typescript@5.6 tsxSe requiere Redis 7 para BullMQ. Consulta BullMQ para la configuración de workers en producción.
| En solicitud HTTP | En worker |
|---|---|
| Enviar correo electrónico | OK |
| Redimensionar 50 imágenes | Cola |
| Cobrar tarjeta + cumplir pedido | Cola después de la clave de idempotencia |
| Devolver resultados de búsqueda <100ms | Solo sincronización de DB |
Relacionado: BullMQ - Colas respaldadas por Redis
import { Queue } from "bullmq";
import IORedis from "ioredis";
const connection = new IORedis(process.env.REDIS_URL!, { maxRetriesPerRequest: null });
const emailQueue = new Queue("email", { connection });
app.post("/invite", async (req, res) => {
const job = await emailQueue.add("send-invite", {
to: req.body.email,
orgId: req.body.orgId,
});
res.status(202).json({ jobId: job.id });
});202 Accepted señala procesamiento asíncronoimport { Worker } from "bullmq";
import IORedis from "ioredis";
const connection = new IORedis(process.env.REDIS_URL!, { maxRetriesPerRequest: null });
new Worker(
"email",
async (job) => {
if (job.name === "send-invite") {
await sendInviteEmail(job.data.to, job.data.orgId);
}
},
{ connection, concurrency: 5 }
);concurrency limita los trabajos paralelos por pod de workerawait emailQueue.add(
"send-invite",
{ to, orgId },
{
attempts: 5,
backoff: { type: "exponential", delay: 2000 },
removeOnComplete: 1000,
removeOnFail: false,
}
);removeOnFail: false)attempts para que los mensajes venenosos finalmente se detenganRelacionado: Reintentos con retroceso
app.get("/jobs/:id", async (req, res) => {
const job = await emailQueue.getJob(req.params.id);
if (!job) return res.status(404).json({ error: "not_found" });
const state = await job.getState();
res.json({ id: job.id, state, progress: job.progress });
});waiting, active, completed, failed, delayedawait paymentsQueue.add("capture", { paymentId, idempotencyKey }, { jobId: idempotencyKey });jobId estable elimina duplicados de encolamientos repetidos del clienteapi/ -> Solo HTTP + encolamiento
worker-email/ -> Worker de BullMQ
worker-media/ -> cola de CPU pesada
Relacionado: Flota de workers de referencia
| Disparador | Herramienta |
|---|---|
| Acción del usuario | Encolar trabajo ahora |
| Cada noche a las 2 a.m. | Cron + bloqueo de líder opcional |
| Cada 5 minutos | Trabajo repetible de BullMQ |
BullMQ requiere Redis. AWS SQS es una alternativa; consulta Consumidores de AWS SQS.
Sub-50ms p95. El encolamiento es un viaje de ida y vuelta a Redis.
Los trabajos se acumulan en la cola. Alerta sobre la profundidad; escala los workers o repara el consumidor.
No. Apunta a al menos una vez con workers idempotentes.
@nestjs/bullmq envuelve módulos de BullMQ. Las mismas reglas de reintento e idempotencia.
BullMQ soporta números de prioridad. Úsalo con moderación; si se abusa, puede dejar sin servicio a las prioridades bajas.
delay: 60000 para envíos programados. Repetible para patrones cron.
Almacena el blob en S3; encola solo el ID de referencia. La carga útil del trabajo de Redis se mantiene pequeña.
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