BullMQ is a Redis-based queue for Node.js that handles background jobs, scheduled tasks, and rate limiting.
Installation
npm install bullmq ioredis
Producer — Add Jobs
import { Queue } from "bullmq";
const emailQueue = new Queue("emails", { connection: { host: "localhost", port: 6379 } });
await emailQueue.add("welcome", {
to: "user@example.com",
subject: "Welcome!",
template: "welcome-email"
});
// Delayed job
await emailQueue.add("reminder", { to: "user@example.com" }, { delay: 3600000 });
// Repeatable job
await emailQueue.add("daily-report", {}, { repeat: { pattern: "0 9 * * *" } });
Worker — Process Jobs
import { Worker } from "bullmq";
const worker = new Worker("emails", async (job) => {
console.log(`Processing ${job.name}: ${job.data.to}`);
await sendEmail(job.data);
return { sent: true };
}, { connection: { host: "localhost" }, concurrency: 5 });
worker.on("completed", (job, result) => console.log(`Done: ${job.id}`));
worker.on("failed", (job, err) => console.error(`Failed: ${err.message}`));
Job Progress and Events
const worker = new Worker("processing", async (job) => {
for (let i = 0; i <= 100; i += 10) {
await doWork();
await job.updateProgress(i);
}
});
Flow Producer (Job Dependencies)
import { FlowProducer } from "bullmq";
const flowProducer = new FlowProducer({ connection: { host: "localhost" } });
await flowProducer.add({
name: "send-report",
queueName: "emails",
data: { type: "summary" },
children: [
{ name: "fetch-data", queueName: "data", data: { source: "api" } },
{ name: "generate-pdf", queueName: "rendering", data: { template: "report" } }
]
});
Need to extract or automate web content at scale? Check out my web scraping tools on Apify — no coding required. Or email me at spinov001@gmail.com for custom solutions.
Top comments (0)