Menggunakan Job Queue Di Express JS
Halo semuanya, Pada artikel ini kami akan mengimplementasikan antrian pekerjaan menggunakan bull dan redis di aplikasi node/express.
Jadi apa itu Job Queue?
- terkadang suatu proses/pekerjaan dapat menjadi berat dan menjalankan pekerjaan tersebut secara paralel pada mesin dengan sumber daya terbatas dapat menjadi tidak efisien.
- Juga beberapa pekerjaan memerlukan akses eksklusif ke sistem dan seperti yang kita semua tahu permintaan layanan Node/Express apis kami secara bersamaan, sehingga bisa menjadi Masalah.
Untuk mengatasi masalah ini, kami pada dasarnya memelihara Struktur Data yang disebut antrean pekerjaan yang menyimpan/cache deskripsi pekerjaan dan memproses setiap pekerjaan secara terjadwal satu per satu. (mengingat bahwa tanggapan tidak diinginkan segera)
Struktur Data
jadi untuk membuat job-queue , pertama-tama kita perlu memikirkan cara menyimpan data saat runtime/in-memory secara efisien. Redis mengerti itu.
Instal Redis (Mac):
$ brew install redis
Instal & Atur Redis (Linux):
https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04
Menjalankan Server Redis:
mac :
$ brew services start redislinux:
$ sudo systemctl status redis
Anda dapat menjalankan redis menggunakan perintah di atas sesuai dengan os Anda.
redis secara default berjalan di port 6378 . agar nantinya kita dapat mengakses redis menggunakan redis://127.0.0.1:6379
Catatan: Redis adalah penyimpanan data dalam memori, segera setelah server redis mati, Job Queue akan dihapus.
Bull : The Job Queue
Sekarang karena kami memiliki akses penyimpanan data dalam memori (redis), kami akhirnya dapat membuat a Job Queue dan menyimpannya di redis .
Untuk Menangani semua Operasi Antrean di Nodejs/Express , kami menggunakan pustaka berbasis redis yang mengagumkan bernama Bull.
Bull memungkinkan kita:
- membuat antrian pekerjaan
- tambahkan pekerjaan di dalamnya
- memproses pekerjaan
dan banyak operasi lain yang dapat Anda periksa di: https://github.com/OptimalBits/bull
Installing Bull :
npm install bull --save
Menginisialisasi Job Queue :
const Queue = require('bull');const myJobQueue = new Queue('myJob', 'redis://127.0.0.1:6379');
Menambahkan Pekerjaan
jadi mari kita asumsikan kita memiliki aplikasi ekspres dan itu adalah titik akhir POST, di mana pengguna membuat permintaan pekerjaan dengan data pekerjaan/deskripsi pekerjaan.
kita bisa menambahkan pekerjaan dengan memanggil add() pada fungsi Queue Object dengan deskripsi pekerjaan.
const Queue = require('bull');
const myJobQueue = new Queue('myJob', 'redis://127.0.0.1:6379');router.post('/job', async (req,res)=> { // your stuff try { myJobQueue.add({ jobData:req.body.jobData });
res.status(200).send({ success:true, message:"Job in queue !"} }catch(err){
res.status(200).send({ success:false } }
})
Akhirnya ! jadi kita telah berhasil menambahkan pekerjaan ke Job Queue kita. sekarang saatnya memprosesnya.
Pemroses Pekerjaan
jadi aplikasi ekspres kami memungkinkan pengguna mengisi antrian pekerjaan dengan data pekerjaan yang sesuai, kami memerlukan sesuatu untuk memprosesnya.
karenanya kami membuat prosesor pekerjaan dan menjalankannya di latar belakang sepanjang waktu.
pertama-tama kita membuat referensi ke toko antrean pekerjaan lama kita yang sama di redis .
const myJobQueue = new Queue(‘myJob’, ‘redis://127.0.0.1:6379’);
Kemudian kita memanggil fungsi process() dengan callback. Panggilan balik ini berisi operasi sebenarnya dari pekerjaan yang kami lakukan pada deskripsi pekerjaan.
Callback dipanggil dengan 2 params :
- job : berisi job-description /data , job id dll
- selesai: fungsi panggilan balik lain yang dipanggil saat Anda berhasil Melakukan pekerjaan. ini menghapus pekerjaan saat ini dari antrian pekerjaan dan memanggil fungsi proses dengan deskripsi pekerjaan baru ( jika tersedia)
// jobProcessor.js
const myJobQueue = new Queue(‘myJob’, ‘redis://127.0.0.1:6379’);
myJobQueue.process(function(job,done){
// your job complex operations
console.log(job.data.jobData)
done();
})
sekarang segera setelah job-queue memiliki beberapa pekerjaan, job-processor akan menjalankannya satu per satu. menyelesaikan pekerjaan dan mengosongkan antrian.
Untuk Menjalankan Prosesor Pekerjaan di latar belakang dan sepanjang waktu Anda dapat menggunakan pm2 :
pm2 start jobProcessor
Selamat, Anda sudah siap untuk melakukan Job Queue di aplikasi Anda. Selamat Mengoding!