Hi Guys,
Apa kabar kalian semua? Pasti sehat yak? Alhamdulilah kalau begitu hehe..
Kali ini gw akan sedikit berbagi tutorial mengenai rabbitmq. Bagi yang belum mengetahui apa itu rabbitmq bisa googling sendiri ya. Pokoknya rabbitmq itu adalah messaging queue (disingkat mq) hehehe.. Ga guna banget ya penjelasan gw. Ya intinya lw harus cari sendiri di google, jangan malas lah ya. Nah tutorial gw kali ini adalah konsep rpc rabbitmq menggunakan nodejs. Sebenarnya di rabbitmq sendiri sudah ada tutorialnya cuma entah kenapa gw pengen nulis sendiri yang versi gw pakai hehe.
Berikut tutorialnya guys :
- Pastikan kalian sudah menginstall rabbitmq dulu. Jika belum install, silahkan install dlu. Gampang kok nginstallnya.
- Install dependency untuk project ini.
12345"dependencies":{"amqplib": "^0.5.1","uuid": "^3.0.1"} - Setelah install, mari buat file rpc_client.js. File ini digunakan untuk mengirim data ke server melalui perantara rabbitmq.
12345678910111213141516171819202122232425262728293031const amqp = require('amqplib');const uuid = require('uuid/v4');const amqpCon = amqp.connect('amqp://localhost');amqpCon.then(conn => conn.createChannel()).then((ch) => {ch.assertQueue('', {exclusive: true,expires: 5000,autodelete: true,}).then((q) => {const corr = uuid();const queue = 'test_pub_sub_rpc';const content = 'Hello World';ch.sendToQueue(queue, new Buffer(content), {correlationId: corr,replyTo: q.queue,});console.log(`Sent ${content}`);ch.consume(q.queue, (msg) => {const result = msg.content.toString();console.log(`Receive ${result}`);});});});Library amqplib merupakan library yang digunakan untuk koneksi dengan rabbitmq.
Library uuid merupakan library yang digunakan untuk membuat hashing yang sifatnya unik.Bagian kedua adalah memulai koneksi dengan rabbitmq via localhost. Disini gw menggunakan localhost karena gw install rabbitmq di local. Kalau mau koneksi dengan rabbitmq yang ada di server non local (cloud) juga bisa, berikut snippetnya :
1amqp://[username]:[password]@[domain/ip server cloud]Bagian ketiga adalah membuat channel di rabbitmq. Disini gw akan menggunakan promise. Kenapa pakai promise? biar ga pusing bacanya. Kalau mau callback juga silahkan. Namun cara pakainya tidak seperti yang gw tunjukkin diatas karena menggunakan library yang berbeda.
Bagian keempat adalah assert queue. Bertujuan untuk membuat callback queue ketika server meresponse ke queue yang sudah ditentukan. Nama queue nya akan kita deklarasikan di bagian sentQueue. Sebenarnya assertQueue juga bisa menerima parameter queue di parameter pertama hanya saja tidak kita gunakan. Assert queue juga memiliki properties yang cukup useful untuk kita gunakan seperti exclusives, autodelete dan expired.
Bagian kelima adalah mengirim queue tersebut ke rabbitmq. Yang perlu diperhatikan adalah properties correlation_id dan replyTo. Correlation_id sangat berguna untuk rpc request, karena parameter ini menjadi key dimana response dari rpc dikirim. Jika keynya sama maka akan diproses kalau beda ya ga usa diapa-apain hehe.
Bagian keenam adalah consume queue. Bertujuan untuk mengambil kembali response dari rabbitmq yang sesuai dengan request yang kita sebelumnya.
Untuk hasilnya sebagai berikut :
- Setelah membuat rpc_client.js, sekarang mari kita buat rpc_server.js. File ini digunakan untuk mengambil data dari rabbitmq yang dikirim oleh rpc_client.js dan mengirim kembali responsenya ke rabbitmq. Berikut snippet codenya :
1234567891011121314151617181920212223const amqp = require('amqplib');const amqpCon = amqp.connect('amqp://localhost');amqpCon.then(conn => conn.createChannel()).then((ch) => {const queue = 'test_pub_sub_rpc';ch.assertQueue(queue, { durable: false });ch.prefetch(1000);ch.consume(queue, (msg) => {const content = msg.content.toString();const replyWord = 'Hi There';console.log(content);ch.ack(msg);ch.sendToQueue(msg.properties.replyTo,Buffer.from(replyWord),{ correlationId: msg.properties.correlationId });console.log(replyWord);});});
Bagian Pertama adalah require library yang dibutuhkan yakni amqplib. Untuk yang rpc_server tidak perlu merequire uuid karena tidak akan digunakan. Jadi dihapus saja hehe.
Bagian kedua adalah memulai koneksi dengan rabbitmq via localhost. Disini gw menggunakan localhost karena gw install rabbitmq di local. Seperti yang ada di rpc_client.js. Jadi jangan clientnya ke localhost, tapi servernya ngambil dr aws. Ya ga bakal jalan programnya hehe.
Bagian ketiga adalah membuat channel di rabbitmq. Disini gw akan menggunakan promise. Kenapa pakai promise? biar ga pusing bacanya. Kalau mau callback juga silahkan. Namun cara pakainya tidak seperti yang gw tunjukkin diatas karena menggunakan library yang berbeda.
Bagian keempat adalah assert queue. Nah untuk yang disini tugasnya beda dengan assert queue yang ada di client. Disini tugasnya memastikan bahwa queue tersebut ada. Oleh karena itu parameter pertama diisi dengan nama queue yang kita panggil di rpc_client.js. Lalu properties yang digunakan adalah durable false yang berarti ga usa disimpen karena akan bikin garbage ke depannya hehe.
Bagian kelima adalah prefetch. Ini digunakan agar queue bisa menampung content yang berbeda dengan channel yang sama. Kenapa diclient tidak perlu pakai prefetch? Karena tugas client hanya menerima dan mengirim unique id yang sudah dideclare sebelumnya. Nah dari unique id itulah dibuatkan content yang berbeda-beda agar datanya tidak tertukar-tukar hehe..
Bagian keenam adalah consume. Bertujuan untuk mengambil data dari rabbitmq. Setelah itu diolah deh oleh server.
Bagian yang terakhir adalah sendToQueue. Berbeda dengan yang rpc_client. Disini kita mengirimkan data yang sudah diproses server ke callback queue yang kita dapat dari rabbitmq sebelumnya lalu memberikan correlation_id yang telah dideclare sebelumnya oleh rpc_client.
Nah untuk hasilnya seperti berikut :
Jadi flow diatas adalah rpc_client mengirim hello word ke rpc_server. rpc_server recieve hello world dan mengirim kembali bahwa server menerima datanya dengan mengirim hi there ke rpc_client. Dan pada akhirnya diterima oleh rpc_client. Semuanya lewat rabbitmq ya hehe.
Nah kalau ada yang mau coba-coba dan mau kirim-kirim tutorial pembaharuan, silahkan fork githubnya disini.
Oke demikian sedikit tutorial simple programming dari saya, semoga bisa dimengerti.. Kalau ga ngerti ya belajar ya ehehe..