Iman Sugirman

Queue Menggunakan Nodejs dengan Bullmq

12 Desember 2022

Tutorial Menggunakan Queue di Nodejs menggunakan Bullmq dan integrasi dengan Redis bisa handle Proses di background job lebih smooth. Dimana saat proses lain untuk memproses kerja lainnya Queue sangat berguna untuk mengoptimalkan kinerja / proses lain untuk menghandle proses transaksi atau lainnya.

Bullmq adalah salah satu library dari nodejs yang mana library ini digunakan untuk menghandle Queue lebih stabil dan banyak fungsi. Salah satu contohnya delay dengan waktu yang diinginkan.

Proses Install Bullmq

Berikut cara install bullmq

yarn add bullmq

Buat sebuah file untuk konfigurasi Redis untuk diintegrasikan dengan Bullmq :

const redisbull = { concurrency: parseInt(process.env.QUEUE_CONCURRENCY || '1'), connection: { host: process.env.REDIS_HOST || 'localhost', port: parseInt(process.env.REDIS_PORT || '6379'), password: process.env.REDIS_PASSWORD, }, };

dan kita akan buat Queue contohnya untuk mendelay proses pengiriman email :

const { redisbull } = require('../config/redisdb'); const { Queue } = require('bullmq'); // panggil function / config redis connection const queueEmail = new Queue('sendEmailJob', redisbull); // Data user akan dipassing ke function ini const addSendEmailJobs = async (user) => { await queueEmail.add('sendEmailJob', { user }); }; module.exports = { addSendEmailJobs };

Menggunakan Queue Di Controller

Untuk mentriger pembuatan antrian queue bisa di handle di Controller contohnya seperti ini :

const { queueEmail } = require('./job/addSendEmailJobs'); const orderStore = async () => { ... const data_user = { email: 'jon@doe.com', first_name: 'Bro Jon' }; await queueMatch.add( 'sendEmailJob', { user: data_user }, { delay: 10000, // Job Di Delay dalam waktu 10 detik removeOnComplete: true, // Ini akan menghapus job ketika Job itu Sukses di ekseskusi removeOnFail: 1000, // Ini akan menghapus job ketika Job itu Gagal dalam 1000 job failed } ); ... };

Nah hanya semudah itu untuk membuat Queue di Nodejs sekarang kita akan menjalankan Worker dengan Queue tersebut dengan memanggil event workernya Bullmq

Release Job Delay dari Queue

Setelah proses diatas kita akan merilis Job yang sudah kita delay di simpan di redis menggunakan Bullmq.

Buat function untuk Worker sendEmailJob seperti berikut :

const { Worker } = require('bullmq'); const { redisbull } = require('../config/redisdb'); const sendEmailWorker = () => { const worker = new Worker( 'sendEmailJob', // ini kita dapatkan dari Queue yang sudah dibuat sebelumnya sendEmailNowToUser, // ini adalah function yang akan kita jalankan ketika ada event queue redisbull ); // Event ketika Worker Berjalan Lancar dan sukses worker.on('completed', (job) => { console.log(job.data, 'Completed'); }); // Event ketika Worker Gagal dan Error worker.on('failed', (job, err) => { console.error(`${job.id} has failed with ${err.message}`); }); };

Fungsi Pengiriman Email ke User

Untuk mengirimkan email anda perlu membuat function mengirimkan email ke customer / user

const sendEmailNowToUser = async (job) => { // Mengekstrak data yang ada di queue const { email, first_name } = job.data; // Disini fungsi anda untuk emngirimkan email await mailserver.send(...) ... };

Demikian tutorial Queue Menggunakan Nodejs dengan Bullmq semoga bermanfaat. Happy Coding..