Pernahkah Anda menghadapi situasi di mana Anda perlu menjadwalkan pekerjaan atau membuat pekerjaan berulang di NodeJS? Jika ya, maka Anda mungkin berpikir tentang metode JavaScript setInterval. Atau Anda mungkin pernah menggunakan paket npm seperti cron atau node-schedule.

Mereka melakukan pekerjaan jika hanya ada satu server yang berjalan, tetapi bagaimana jika Anda merancang sistem yang harus memiliki ketersediaan tinggi dan untuk itu, Anda memiliki beberapa server yang berjalan? Maka metode yang disebutkan di atas akan mengalami masalah konkurensi. Hal ini dapat menyebabkan pekerjaan yang sama dijadwalkan beberapa kali ketika beberapa server dimulai.
Dalam hal ini juga akan sulit untuk menangani kesalahan pada Pekerjaan yang gagal.

Konkurensi adalah alasan utama saya mulai mencari solusi lain, dan Antrian datang untuk menyelamatkan saya.

Antrean dapat digunakan dalam tiga cara berbeda —
1. Produser Pekerjaan
2. Konsumen Pekerjaan
3. Pendengar Peristiwa

Produsen akan menambahkan pekerjaan ke Antrean, Konsumen/Pekerja akan melakukan pekerjaan tersebut, dan Pendengar Peristiwa akan mendengarkan peristiwa yang terjadi dalam Antrean tersebut.
Satu contoh Antrean dapat digunakan untuk ketiga peran tersebut, dan banyak produsen, konsumen, dan pendengar dapat menggunakan Antrean yang sama pada waktu yang bersamaan.
Karena Antrean menggunakan Redis untuk berkomunikasi antara produsen dan konsumen, hal ini memecahkan masalah konkurensi pertama kita. Jika produsen dan konsumen dapat terhubung ke Redis, maka mereka dapat bekerja sama saat memproses pekerjaan tersebut.
Antrian juga menyediakan komunikasi asinkron, sehingga tidak memblokir kode.

Pengantar Antrean Banteng

Bull adalah perpustakaan Node yang mengimplementasikan Antrean berdasarkan Redis. Meskipun antrian bisa langsung diimplementasikan di Redis, perpustakaan ini menangani semua kode tingkat rendah.
Penggunaan Bull juga memecahkan masalah penanganan kesalahan karena menyediakan mekanisme RETRY. Kita dapat melewati jumlah upaya yang kita inginkan untuk suatu pekerjaan.

Bull hanya menambahkan pekerjaan unik ke Antrean. Jadi ini menyelesaikan masalah pekerjaan yang sama yang dijadwalkan beberapa kali.

Mari kita ambil contoh sederhana. Katakanlah Anda ingin mencetak jumlah semua pengguna yang ada di DB Anda setiap 10 menit. Kami akan melakukan operasi ini menggunakan perpustakaan Bull.

Menggunakan perpustakaan Bull-

npm install bull

Sekarang buat file baru, app.js, dan impor pustaka bull di file itu.

const Queue = require(‘bull’);

Kita harus mendefinisikan konfigurasi Redis jika kita menggunakan konfigurasi khusus.

let redisConf = {
    host: 127.0.0.1, 
    port: 6379, 
    username: USERNAME, 
    password: PASSWORD
};

Buat Antrean baru dengan konfigurasi Redis khusus.

let queue = new Queue(‘myQueue’, {redis: redisConf} );
// Where ‘myQueue’ is the name of Queue.

Peran produser adalah menghasilkan suatu pekerjaan, yaitu membuat jadwal. Jadwalnya bisa satu kali atau berulang. Kita dapat memiliki kedua jenis jadwal di Bull. Kami mengambil contoh jadwal berulang di postingan ini.

Karena kita ingin menjadwalkan pekerjaan selama 10 menit, kita harus menyatakan batas waktu untuk itu.

let timeout = 600000; // Time is in milliseconds
let data = {key: value};
queue.add(data, {repeat: {every: timeout} } );
//Where data is an object. 
//It can be an empty object also. 
//The value of data can be used while consuming the job. 

Peran konsumen adalah mengkonsumsi pekerjaan atau mengerjakan pekerjaan tersebut. queue.process() akan dipanggil setiap kali ada pekerjaan di Queue. Karena kita memiliki pekerjaan berulang selama 10 menit, fungsi proses akan dipanggil setiap 10 menit.

queue.process(async (job) => {
    let data = job.data;
    /* using job.data, the data object can be used which was passed   
    while creating the job */
    /* we want to print count of all user after every 10 minutes */
    let count = await db.countUsersDummyFunc();
    console.log(count);
});

Setelah pekerjaan diproses, statusnya akan diubah menjadi selesai. Kita dapat menggunakan peran Event Listener dari Queue dan mendengarkan acara yang 'selesai'.

queue.on('completed', async (job) => {
    console.log(`Job ${job.id}` completed`);
    /* Completed jobs will remain in Redis. It may cause unnecesarry memory utilization. For this we have the option to remove the job. */
    await job.remove();
});

Kami telah membahas ketiga peran Antrian di postingan ini. Kami mulai dengan menambahkan Pekerjaan ke Antrean (Peran Produser). Kemudian memproses pekerjaan itu secara berkala (Peran Konsumen). Dan pada akhirnya, kita menyimak event tentang Queue (Event Listener Role).
Kita masih belum membahas cara menangani tugas yang gagal dan menambahkan percobaan ulang pada suatu tugas. Mungkin itu akan menjadi bagian dari postingan saya berikutnya.

Terima kasih telah membaca ini. Semoga harimu menyenangkan.