Catatan Belajar NATS Bagian 2 Simple Publish Subscribe dengan Docker dan Nodejs


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/