Mengapa Menggunakan Job Queue?
Tidak semua pekerjaan harus dilakukan langsung dalam request HTTP. Proses seperti mengirim email, generate laporan, resize gambar, memproses video, atau sinkronisasi data dapat membutuhkan waktu cukup lama.
Jika pekerjaan tersebut dijalankan langsung oleh server, pengguna harus menunggu hingga proses selesai. Dengan job queue, aplikasi dapat segera memberikan response sementara pekerjaan berat diproses secara asynchronous di background.
Setup BullMQ dan Redis
Install BullMQ dan Redis client menggunakan:
npm install bullmq ioredis
BullMQ menggunakan Redis untuk menyimpan dan mengelola job dalam queue.
Secara umum, terdapat tiga komponen utama:
-
Queue untuk menambahkan pekerjaan ke antrian
-
Worker untuk mengambil dan memproses job
-
QueueEvents untuk memantau perubahan status job
Pemisahan ini membuat proses background lebih mudah dikembangkan dan diskalakan.
Menambahkan Job ke Queue
Job dapat ditambahkan dari controller atau service ketika aplikasi menerima request.
await emailQueue.add("send-welcome", {
userId,
email
});
Data job akan disimpan di Redis hingga diproses oleh worker.
BullMQ juga menyediakan berbagai opsi seperti delay, priority, attempts, dan backoff. Misalnya, pengiriman email yang gagal dapat dicoba kembali secara otomatis dengan jeda tertentu.
Worker untuk Memproses Job
Worker bertugas mengambil job dari queue dan menjalankan pekerjaan sebenarnya.
const worker = new Worker("email", async (job) => {
await sendWelcomeEmail(job.data.email);
});
Worker sebaiknya dijalankan sebagai proses terpisah dari aplikasi utama. Dengan cara ini, proses background tidak terlalu membebani server yang menangani request pengguna.
BullMQ juga mendukung concurrency, sehingga beberapa job dapat diproses secara paralel sesuai kapasitas server.
Retry dan Error Handling
Pekerjaan background dapat mengalami kegagalan karena berbagai faktor seperti network error, service pihak ketiga bermasalah, atau database tidak tersedia.
Gunakan attempts dan backoff untuk menentukan jumlah percobaan ulang dan jeda antar percobaan.
Strategi ini membantu sistem menjadi lebih resilient tanpa mengharuskan pengguna mengulangi request secara manual.
Job Lifecycle dan Monitoring
Job BullMQ memiliki beberapa status seperti waiting, active, completed, failed, dan delayed.
Untuk monitoring, gunakan Bull Board agar tim dapat melihat antrean, memeriksa job yang gagal, melakukan retry, dan memantau throughput secara lebih mudah.
Monitoring penting terutama ketika jumlah job semakin besar dan aplikasi mulai menangani banyak proses background.
Graceful Shutdown
Worker harus menangani proses shutdown dengan benar. Jangan langsung menghentikan worker ketika masih terdapat job yang sedang diproses.
Gunakan signal handling seperti SIGTERM dan panggil worker.close() agar worker dapat berhenti secara graceful setelah pekerjaan aktif selesai.
Kesimpulan
BullMQ dan Redis merupakan kombinasi yang praktis untuk membangun background job queue pada aplikasi Node.js. Dengan queue, worker, retry mechanism, monitoring, dan graceful shutdown, pekerjaan berat dapat diproses secara asynchronous tanpa menghambat request utama pengguna.