🚀 Handling Cron Jobs in NestJS with Multiple Instances using Bull
Juan Castillo

Juan Castillo @juan_castillo

About: Full Stack Developer | Building scalable apps with modern tech | Passionate about crafting clean code, solving complex problems, and sharing knowledge with the dev community.

Joined:
Jan 14, 2025

🚀 Handling Cron Jobs in NestJS with Multiple Instances using Bull

Publish Date: Mar 23
1 1

Introduction

Cron jobs are essential when you need to execute scheduled tasks in your application. But what happens when you have multiple instances running? 🤯 Without proper handling, each instance might execute the job simultaneously, causing duplicate processing and potential data inconsistencies.

A solid solution is using Bull (a Node.js queue library based on Redis) to ensure that only one instance executes the cron job at a time. In this article, we'll explore how to achieve this using NestJS and Bull.


🛠 Setting Up Bull in NestJS

1️⃣ Install Dependencies

First, install Bull and Redis client:

npm install --save @nestjs/bull bull ioredis
Enter fullscreen mode Exit fullscreen mode

2️⃣ Configure BullModule

In your app.module.ts, configure Bull to use Redis:

import { Module } from '@nestjs/common';
import { BullModule } from '@nestjs/bull';
import { MyCronJobProcessor } from './cron.processor';
import { MyCronJobService } from './cron.service';

@Module({
  imports: [
    BullModule.forRoot({
      redis: {
        host: 'localhost', // Use the Redis host
        port: 6379, // Default Redis port
      },
    }),
    BullModule.registerQueue({
      name: 'cronQueue',
    }),
  ],
  providers: [MyCronJobProcessor, MyCronJobService],
})
export class AppModule {}
Enter fullscreen mode Exit fullscreen mode

Note: Ensure Redis is running locally or use a cloud-hosted Redis service.


🎯 Implementing the Cron Job

3️⃣ Creating the Cron Job Service

We’ll create a service that adds jobs to the queue at scheduled intervals.

import { Injectable } from '@nestjs/common';
import { InjectQueue } from '@nestjs/bull';
import { Queue } from 'bull';
import { Cron } from '@nestjs/schedule';

@Injectable()
export class MyCronJobService {
  constructor(@InjectQueue('cronQueue') private cronQueue: Queue) {}

  @Cron('*/5 * * * * *') // Runs every 5 seconds
  async scheduleJob() {
    await this.cronQueue.add('processData', {});
    console.log('Cron job added to the queue ✅');
  }
}
Enter fullscreen mode Exit fullscreen mode

The @Cron decorator schedules the job at a fixed interval, ensuring that the task is queued rather than executed by every instance.


4️⃣ Processing the Cron Job

Only one instance should process the job at a time. Bull takes care of that for us! 🎉

import { Process, Processor } from '@nestjs/bull';
import { Job } from 'bull';

@Processor('cronQueue')
export class MyCronJobProcessor {
  @Process('processData')
  async handleCronJob(job: Job) {
    console.log('Processing cron job... 🤖', job.id);
    // Your task logic here (e.g., database cleanup, report generation)
  }
}
Enter fullscreen mode Exit fullscreen mode

📦 Create a Docker compose

If you run multiple instances of your NestJS app, only one instance will process the queued job, thanks to Redis locking mechanisms in Bull.

version: '3.8'

services:
  redis:
    image: redis:6.2
    restart: always
    ports:
      - '6379:6379'
    networks:
      - app-network

  worker:
    image: node:18
    working_dir: /app
    volumes:
      - .:/app
    command: ["npm", "run", "start"]
    environment:
      - NODE_ENV=production
      - REDIS_HOST=redis
    networks:
      - app-network
    deploy:
      replicas: 3  # Example: Run 3 instances of the worker
      restart_policy:
        condition: on-failure

networks:
  app-network:
    driver: bridge
Enter fullscreen mode Exit fullscreen mode

Run:

docker-compose up -d
Enter fullscreen mode Exit fullscreen mode

Now, your Redis instance is ready to use! 🚀


✅ Conclusion

Using Bull with Redis in NestJS, we’ve ensured that:

✔️ Cron jobs are scheduled only once per interval
✔️ Multiple instances don’t trigger duplicate executions
✔️ Scalability is achieved with a queue-based approach

Now you’re ready to handle scheduled tasks like a pro! 💪🔥

Happy coding! 🚀

Comments 1 total

  • Tyler Patrick Hadson
    Tyler Patrick HadsonApr 3, 2025

    Recovering Stolen Crypto

    As a leading expert in cryptocurrency recovery, Wise Data Tech Recovery has a proven track record of successfully reclaiming digital assets for clients worldwide. Combining cutting-edge technology with expert knowledge, their team precisely tackles complex crypto recovery challenges.

    The recovery process begins with a thorough analysis of the loss circumstances, whether due to hacking, forgotten passwords, or fraudulent schemes. Utilizing advanced blockchain analytics, Wise Data Tech Recovery traces asset movements, identifies stolen coin paths, and collaborates with exchanges and law enforcement to secure optimal outcomes.

    What sets Wise Data Tech Recovery apart is its commitment to personalized recovery strategies tailored to each case. Understanding unique situation details creates effective plans to maximize recovery chances.

    Prioritizing client confidentiality and satisfaction, Wise Data Tech Recovery has built a reputation as a reliable partner for reclaiming lost or stolen BTC.

    Need professional help recovering lost or stolen coins? Contact Wise Data Tech Recovery today.

    Contact Information
    Email : infowisedatatechrecoveryservice@pr...
    WhatsApp: +1[641]2190773
    wisedatatech.online

Add comment