Berkenalan dengan RabbitMQ di NodeJS

Sebelum kita berbicara tentang RabbitMQ. Mari kita sedikit membahas tentang Message Broker. Apa itu Message Broker? Message Broker adalah program perantara yang mengatur pesan yang dikirimkan oleh pengirim (sender/producer/publisher) kepada penerima (receiver/consumer/subscriber).

Kapan dan kenapa kita harus mengimplementasikan Messaging Queue? Ketika kita ingin membuat system yang scalable. Misal system kita sebuah ecommerce yang memiliki fitur kirim sms/email pemberitahuan setelah user order suatu barang, maka proses tersebut bisa menghemat waktu respon ke user dengan tanpa harus menunggu selesainya kirim sms/email. Cukup kita kirimkan pesan tugas kirim email ke antrian pesan di message broker, maka oleh message broker akan mengirimkannya ke receiver, dan receiver yang akan melakukan tugas kirim email. Hal tersebut dikerjakan secara background tanpa harus menunggu selesai terlebih dahulu dan untuk receivernya bisa ada banyak. Jadi penggunaan MQ ini cocok apabila kita ingin membuat system yang scalable. Dan yang dimaksud scalable disini ialah kemampuan untuk menjaga kinerja dan performa system tetap bagus walaupun jumlah data yang disimpan semakin banyak dan jumlah usernya semakin banyak pula.

RabbitMQ merupakan salah satu dari sekian banyak Message Broker. Bisa kita analogikan sebagai kantor pos. Ketika kita ingin mengirim surat, kita memasukkan surat tersebut kedalam kotak pos. Dari kotak pos surat akan diproses terlebih dahulu di kantor pos untuk difilter dan disortir sesuai dengan wilayah atau daerah penerima surat. Dan selanjutnya pihak kantor pos akan menugaskan tukang pos untuk mengirimkan surat tersebut kepada penerima. Nah dalam analogi ini, RabbitMQ adalah kotak pos, kantor pos, dan tukang pos. Yang bertugas menerima pesan, mengatur pesan untuk dikirimkan kemana, sekaligus mengirimkannya ke penerima. Dan umumnya pesan di RabbitMQ yang dikirimkan ke receiver digunakan untuk memicu suatu pekerjaan yang akan dilakukan oleh receiver. Misal RabbitMQ menyimpan antrian pesan yang berisi alamat email dan isi email. Ketika RabbitMQ mengirim pesan tersebut ke receiver, maka receiver akan mengirim email dengan tujuan dan isi email sesuai dengan pesan yang diterima dari RabbitMQ.

Message Broker Diagram

Instalasi

Untuk instalasi RabbitMQ bisa kita lihat disini https://www.rabbitmq.com/download.html lalu pilih instruksi sesuai dengan platform yang kita gunakan.

Istilah

Sebelum memulai, ada beberapa istilah yang harus kita ketahui pada RabbitMQ.

Producing. Producing tidak beda dengan mengirim. Program yang mengirimkan pesan disebut dengan producer.

Queue. Queue bisa disebut dengan antrian yaitu nama untuk kotak pos yang ada didalam RabbitMQ. Banyak producer bisa mengirim banyak pesan ke satu antrian. Dan banyak consumer dapat menerima data dari satu antrian.

Consuming. Consuming sama saja dengan menerima. Consumer adalah program yang menunggu untuk menerima pesan.

Sebagai catatan producer, consumer, dan broker tidak harus berada pada satu host yang sama.

Permulaan

Sebagai permulaan kita akan membuat program sederhana yang akan mengirimkan pesan kepada penerima. Sebelum memulai, pastikan RabbitMQ sudah terinstall dan sudah berjalan. Lalu buat directory baru dan npm init didalamnya.

Kode

Install amqp.node dengan npm install amqplib lalu buat file baru producer.js yang nantinya akan berperan sebagai producer.

Import package amqp.node tadi

const amqp = require('amqplib')

Hubungkan ke RabbitMQ server dan buat channel baru

...
amqp.connect('amqp://localhost').then(conn => conn.createChannel())

Mendeklarasikan queue sehingga kita dapat mengirimkan pesan ke queue tersebut.

...
conn.createChannel().then(ch => {
const q = 'hello'
const msg = 'Hello world!'
const ok = ch.assertQueue(q, { durable: false })
ok.then(() => {
ch.sendToQueue(q, Buffer.from(msg))
console.log('- Sent', msg)
return ch.close()
})
})
...

Kode lengkap producer.js


Selanjutnya membuat file baru consumer.js yang akan berperan sebagai consumer. Import amqp.node lalu hubungkan ke RabbitMQ server dan buat channel baru.

const amqp = require('amqplib')
amqp.connect('amqp://localhost').then(conn=> {
return conn.createChannel().then(ch => {})
})

Mendeklarasikan nama queue dan membuat callback yang akan dieksekusi ketika RabbitMQ mengirim pesan ke consumer. Sebagai catatan, jika nama queue yang dideklarasikan sudah ada, maka broker tidak akan membuat queue baru tetapi menggunakan queue yang sudah ada.

conn.createChannel().then(ch => {
const ok = ch.assertQueue('hello', { durable: false })
ok.then(() => {
return ch.consume('hello', msg => console.log('- Received', msg.content.toString()), { noAck: true })
})

Kode lengkap consumer.js

Uji Coba

Untuk uji coba dari kode yang kita buat diatas menggunakan terminal dan kita jalankan producer terlebih dahulu node producer.js

Menjalankan producer

Lalu kita jalankan consumer untuk menerima pesan Hello world! yang dikirimkan oleh producer node consumer.js

Menjalankan consumer

Dapat kita lihat sesaat setelah kita menjalankan consumer akan tercetak tulisan — Received Hello world!


Cukup sekian artikel berkenalan dengan RabbitMQ dari saya. Sebenarnya masih banyak lagi fitur-fitur dari RabbitMQ. Barangkali ada kesempatan bisa saya lanjut di artikel selanjutnya. Sampai jumpa dan semoga bermanfaat.


Like what you read? Give Alif Rizki a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.