DEV Community

Alex Spinov
Alex Spinov

Posted on

BullMQ Has a Free API — Here's How to Handle Background Jobs in Node.js

BullMQ is a Redis-based queue for Node.js that handles background jobs, scheduled tasks, and rate limiting.

Installation

npm install bullmq ioredis
Enter fullscreen mode Exit fullscreen mode

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 * * *" } });
Enter fullscreen mode Exit fullscreen mode

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}`));
Enter fullscreen mode Exit fullscreen mode

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);
  }
});
Enter fullscreen mode Exit fullscreen mode

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" } }
  ]
});
Enter fullscreen mode Exit fullscreen mode

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)