Catatan Belajar NATS Bagian 2 Simple Publish Subscribe dengan Docker dan Nodejs
Instalasi nats-server menggunakan Docker dan Nodejs Sebagai client
Setelah pengenalan tentang NATS, disini saya akan memulai praktek belajar simple Publish Subscribe menggunakan NATS.js sebagai client dan instalasi nats server menggunakan Docker.
Pertama pull docker image NATS di dockerhub
$ docker pull nats:latest
Lalu jalankan nats-server menggunakan perintah docker run
. disini kita melakukan expose port 4222
dan 8222
dari container agar dapat di akses di mesin lokal kita. nats berjalan di port 4222
sementara port 8222
di gunakan untuk monitoring server nats via http.
$ docker run -d --name nats-server -p 4222:4222 -p 8222:8222 nats
Lalu cek apakah server nats telah siap digunakan atau tidak menggunakan docker logs
$ docker ps
$ docker logs -f <container-id>
Jika nats server siap di gunakan akan mengeluarkan log kurang lebih sebagai berikut
Lalu menyiapkan client nodejsnya. install dulu nats.js melalui npm di folder root projectnya.
npm install nats
Lalu kita mulai membuat client untuk publishernya. publisher akan melakukan publish angka random antara 0 - 99 ke topic jawabarat.bandung.suhu
setiap 5000 milisecond (5 detik). Disini parameter NATS.connect()
tidak di isi, maka akan automatis mengset host menjadi localhost
dan port default yaitu 4222
. Kita berinama publisher.js
#!/usr/bin/env node
'use strict'
const NATS = require('nats')
const nats = NATS.connect()
const interval = 5000
function sendRandomSuhu () {
// generate random number beetwen 0 and 99
const randomNumber = Math.floor(Math.random() * 100)
const topic = 'jawabarat.bandung.suhu'
nats.publish(topic, randomNumber.toString())
console.log(`[PUBLISHER] Publish ${randomNumber} to ${topic}`)
}
function onConnectHandler () {
console.log(`[PUBLISHER] Connected, ready for publish random suhu every ${interval/1000} Second`)
}
nats.on('connect', onConnectHandler)
// publish random number every 5 second
setInterval(sendRandomSuhu, interval)
Lalu membuat subscribernya, disini saya buat subscriber agar memiliki ID
diambil dari parameter pertama saat script dijalankan. Kegunaanya agar dapat dapat mengidentifikasi subscriber karna kita akan menjalankan lebih dari satu subscriber. Lalu berinama subscriber.js
#!/usr/bin/env node
'use strict'
const NATS = require('nats')
const nats = NATS.connect()
const ID = process.argv[2]
const TOPIC = 'jawabarat.bandung.suhu'
// check if id filled
if (typeof ID === 'undefined') {
console.error(`ID can't empty.`)
process.exit(1)
}
function onConnectHandler () {
console.log(`[SUBSCRIBER-${ID}] (${TOPIC}) Connected, ready receive message.`)
}
function handleBandungSuhuTopic (msg) {
console.log(`[SUBSCRIBER-${ID}] (${TOPIC}) Received data: ${msg}`)
}
nats.on('connect', onConnectHandler)
nats.subscribe(TOPIC, handleBandungSuhuTopic)
Setelah semuanya siap. pertama kita jalankan subscribernya. disini kita menjalankan dua subcriber untuk melihat apakah pesan diterima oleh semua subscriber atau tidak.
$ node subscriber.js 1
$ node subscriber.js 2
Lalu jalankan publishernya
$ node publisher.js
Bila tidak mengalami error, seharusnya message dapat di publish oleh publisher dan di terima oleh semua subscriber.
Bisa juga monitoring client yang sedang connect menggunakan http api, dengan mengakses http://localhost:8222/connz
Repo catatan hasil belajar ini bisa diliat di github: https://github.com/aldinp16/learn-nats/