Belajar NestJS - Background Jobs & Scheduling
Episode 11 of 24

Belajar NestJS - Background Jobs & Scheduling

Episode ini membahas pekerjaan latar belakang di NestJS: task scheduling dengan @nestjs/schedule, queue processing dengan Bull dan BullMQ, retry policy serta delayed jobs, dan cara memonitor job serta menangani kegagalan.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

Tidak semua pekerjaan bisa diselesaikan dalam satu request HTTP. Mengirim email, memproses gambar, atau menyinkronkan data ke service lain sebaiknya berjalan di latar belakang. NestJS menyediakan alat untuk dua kebutuhan ini: scheduling terjadwal dengan @nestjs/schedule dan antrean job dengan BullMQ.

Task Scheduling dengan @nestjs/schedule

Install dan Setup

Install @nestjs/schedule
npm install @nestjs/schedule
JSMendaftarkan ScheduleModule
@Module({
  imports: [ScheduleModule.forRoot()],
})
export class AppModule {}

ScheduleModule.forRoot() mengaktifkan scheduler di seluruh aplikasi.

Cron Job

Dekorator @Cron menjalankan method pada jadwal tertentu:

JSCron job harian
@Injectable()
export class CleanupService {
  private readonly logger = new Logger(CleanupService.name);
 
  @Cron("0 3 * * *")
  handleCleanup(): void {
    this.logger.log("Membersihkan data kedaluwarsa");
  }
}

Ekspresi cron "0 3 * * *" berarti menjalankan setiap hari pukul 03.00. Sintaks ini familiar bagi yang pernah memakai cron di sistem operasi.

Interval dan Timeout

Untuk jadwal berbasis interval:

JSInterval dan timeout
@Injectable()
export class TaskService {
  @Interval(60000)
  everyMinute(): void {
    console.log("Berjalan setiap 60 detik");
  }
 
  @Timeout(5000)
  afterStartup(): void {
    console.log("Berjalan 5 detik setelah start");
  }
}

@Interval berulang terus menerus, @Timeout hanya sekali setelah aplikasi start.

Queue Processing dengan BullMQ

Install BullMQ

BullMQ adalah library antrean berbasis Redis yang populer untuk NestJS:

Install BullMQ
npm install @nestjs/bullmq bullmq

BullMQ membutuhkan Redis yang berjalan — jalankan lewat Docker dengan docker run --name redis -p 6379:6379 -d redis:7.

Mendaftarkan Queue

JSMendaftarkan queue email
@Module({
  imports: [
    BullModule.forRoot({
      connection: { host: "localhost", port: 6379 },
    }),
    BullModule.registerQueue({
      name: "email",
    }),
  ],
})
export class EmailModule {}

BullModule.registerQueue mendaftarkan queue email yang akan dipakai untuk mengirim job.

Producer dan Consumer

Producer menambahkan job ke queue:

JSProducer job email
@Injectable()
export class EmailProducer {
  constructor(@InjectQueue("email") private readonly emailQueue: Queue) {}
 
  async sendWelcomeEmail(userId: number): Promise<void> {
    await this.emailQueue.add("welcome", { userId });
  }
}

Consumer memproses job:

JSConsumer job email
@Processor("email")
export class EmailConsumer extends WorkerHost {
  async process(job: Job): Promise<void> {
    if (job.name === "welcome") {
      console.log(`Mengirim email ke user ${job.data.userId}`);
    }
  }
}

@Processor("email") menandai class sebagai worker yang memproses job dari queue email.

Retry Policy, Delayed Jobs, dan Concurrency

Retry dan Delay

BullMQ mendukung konfigurasi retry dan delay per job:

JSJob dengan retry dan delay
await this.emailQueue.add("welcome", { userId }, {
  attempts: 3,
  backoff: { type: "exponential", delay: 2000 },
  delay: 60000,
});

attempts: 3 mengulang job hingga tiga kali, backoff menambah jeda antar percobaan, dan delay menunda eksekusi pertama selama 60 detik.

Concurrency dan Monitoring

Worker bisa memproses beberapa job sekaligus dengan opsi concurrency pada @Processor, dan kegagalan bisa dipantau lewat hook @OnWorkerEvent:

JSConcurrency dan hook event
@Processor("email", { concurrency: 5 })
export class EmailConsumer extends WorkerHost {
  @OnWorkerEvent("completed")
  onCompleted(job: Job): void {
    console.log(`Job ${job.id} selesai`);
  }
 
  @OnWorkerEvent("failed")
  onFailed(job: Job, err: Error): void {
    console.error(`Job ${job.id} gagal: ${err.message}`);
  }
}

concurrency: 5 membuat worker memproses lima job secara paralel, sementara hook completed dan failed memberi sinyal hasil. Job yang gagal setelah seluruh percobaan bisa dipindahkan ke queue khusus (dead letter) atau dicatat untuk inspeksi manual. Untuk dashboard visual, tool seperti Bull Board menampilkan job yang tertunda, aktif, dan gagal.

Penutup

Episode 11 membekali kalian pekerjaan latar belakang: scheduling dengan cron, interval, dan timeout; queue processing dengan BullMQ; retry dan delayed jobs; serta monitoring dan failure handling.

Inti yang harus dibawa pulang:

  • @nestjs/schedule menangani task terjadwal dengan cron, interval, timeout.
  • BullMQ menyediakan queue berbasis Redis.
  • Producer menambahkan job, consumer memprosesnya.
  • attempts dan backoff mengatur retry otomatis.
  • delay menunda eksekusi job, concurrency mengatur paralelisme.
  • Hook event memantau job selesai dan gagal.

Di episode 12 selanjutnya kita akan membahas security dan authentication — fundamentals keamanan NestJS, autentikasi JWT dan guards, integrasi Passport dengan auth strategies, serta role-based access control dan permissions.

Belajar NestJS - Background Jobs & Scheduling | Belajar NestJS