DEV Community

Cover image for Scaling Background Jobs With BullMQ and Redis in Node.js
HexShift
HexShift

Posted on

Scaling Background Jobs With BullMQ and Redis in Node.js

Scaling Background Jobs With BullMQ and Redis in Node.js

In Node.js applications, handling time-consuming tasks like sending emails, processing images, or interacting with third-party APIs can be offloaded to background jobs. BullMQ, backed by Redis, is a modern and performant queueing solution perfect for production-scale applications.

Why Use BullMQ?

BullMQ is a Node.js job queue built on top of Redis. It's the successor to Bull, with a modular architecture and support for robust job management, repeatable jobs, rate-limiting, and more.

Step 1: Install Dependencies

First, add BullMQ and Redis to your project:

npm install bullmq ioredis

Step 2: Set Up the Queue

Create a queue instance using BullMQ:

// queue.js
const { Queue } = require('bullmq');
const connection = { host: 'localhost', port: 6379 };

const emailQueue = new Queue('emailQueue', { connection });

module.exports = emailQueue;

Step 3: Add Jobs to the Queue

You can enqueue jobs like this:

// addJob.js
const emailQueue = require('./queue');

emailQueue.add('sendWelcomeEmail', {
  to: 'user@example.com',
  subject: 'Welcome!',
  body: 'Thanks for joining us!'
});

Step 4: Process Jobs

Now create a worker to handle job processing:

// worker.js
const { Worker } = require('bullmq');
const connection = { host: 'localhost', port: 6379 };

const worker = new Worker('emailQueue', async job => {
  const { to, subject, body } = job.data;
  console.log(`Sending email to ${to} with subject "${subject}"`);
  // simulate email sending
}, { connection });

worker.on('completed', job => {
  console.log(`Job ${job.id} completed`);
});

Step 5: Monitor With Bull Board (Optional)

Use bull-board to monitor and manage your queues via a web UI:

npm install @bull-board/api @bull-board/express
// monitor.js
const express = require('express');
const { createBullBoard } = require('@bull-board/api');
const { BullMQAdapter } = require('@bull-board/api/bullMQAdapter');
const { ExpressAdapter } = require('@bull-board/express');
const emailQueue = require('./queue');

const serverAdapter = new ExpressAdapter();
const app = express();

createBullBoard({
  queues: [new BullMQAdapter(emailQueue)],
  serverAdapter,
});

serverAdapter.setBasePath('/admin/queues');
app.use('/admin/queues', serverAdapter.getRouter());
app.listen(3000, () => console.log('Dashboard running at localhost:3000'));

Conclusion

With BullMQ and Redis, you can scale job processing efficiently and reliably in Node.js. It’s a modern solution for asynchronous workflows, built for performance and flexibility.

If this post helped you, consider supporting me: buymeacoffee.com/hexshift

Top comments (0)