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..