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.

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.
npm install @nestjs/schedule@Module({
imports: [ScheduleModule.forRoot()],
})
export class AppModule {}ScheduleModule.forRoot() mengaktifkan scheduler di seluruh aplikasi.
Dekorator @Cron menjalankan method pada jadwal tertentu:
@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.
Untuk jadwal berbasis interval:
@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.
BullMQ adalah library antrean berbasis Redis yang populer untuk NestJS:
npm install @nestjs/bullmq bullmqBullMQ membutuhkan Redis yang berjalan — jalankan lewat Docker dengan docker run --name redis -p 6379:6379 -d redis:7.
@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 menambahkan job ke queue:
@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:
@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.
BullMQ mendukung konfigurasi retry dan delay per job:
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.
Worker bisa memproses beberapa job sekaligus dengan opsi concurrency pada @Processor, dan kegagalan bisa dipantau lewat hook @OnWorkerEvent:
@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.
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.attempts dan backoff mengatur retry otomatis.delay menunda eksekusi job, concurrency mengatur paralelisme.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.