NATS!

개요

https://docs.nats.io/ https://docs.nats.io/nats-concepts/what-is-nats
https://github.com/nats-io/nats-server

go 로 개발된 PubSub 기반의 메세지 스트리밍 서비스

nats

아래와 같이 서비스 수행 중간에 Pub/Sub 가 수시로 이루어질 수 있다.

dispatcher.subscribe(subject) {subjectHandler(it)}
dispatcher.unsubscribe(subject)

KafkaRabbitMQ 와 같이 구독/발행 구조의 메세지 브로커 역할을 하지만 서비스 실행 초반에 큐/파티션 등을 만드는 브로커와 다르게 가볍고 빠르게 Pub/Sub 이 가능하다.

NATS 는 기본적으로 At most once QoS(fire-and-forget) 기반으로 동작하며 메시지를 메모리에만 보관하고 디스크에 작성하지 않는다.

서버/클라이언트 설치

https://hub.docker.com/_/nats

$ docker pull nats
$ docker run --name nats \
 -p 4222:4222 \
 -p 8222:8222 \
 nats --http_port 8222
brew tap nats-io/nats-tools
brew install nats-io/nats-tools/nats
$ nats sub msg.test # Terminal1 구독

$ nats pub msg.test nats-message-1 # Terminal2 발행
$ nats pub msg.test "NATS MESSAGE 2"  # Terminal2 발행

배치 테스트: https://docs.nats.io/using-nats/nats-tools/nats_cli/natsbench

토픽

일반적인 토픽 구성은 영숫자를 사용하는 것을 권장 a-z, A-Z, 0-9

와일드카드 역할을 하는 특수문자 또한 제공됨

.: 토픽 구분 *: 한 토픽 단위에 대한 와일드카드 (for Matching A Single Token) >: 이하 모든 토픽 단위에 대한 와일드 카드 (for Matching Multiple Tokens)

*.*.east.> 믹싱 가능

$SYS, $JS, $KV 예약어

메세지 구조

  • subject
  • payload (byte array)
    • 기본크기는 max_payload=1MB 로 지정되어 있지만 64MB 까지 확장 가능.
    • 8MB 이하를 권장함.
  • header
  • reply address(선택사항)
    • 메세지가 정상 송신되었을 경우 reply 될 주소
    • 메세지의 비구독 여부를 쉽게 알 수 있음
PUB <subject> [reply-to] <#bytes> [payload]

Jetstream

https://docs.nats.io/nats-concepts/jetstream

신뢰성 있는 메세지 전송, 메세지 유실에 대한 보존정책 등, 안정성을 위한 개념으로 STAN(aka NATS Streaming) 의 후속 개념이다.

Jetstream 을 한문장으로 built-in distributed persistence system(분산 지속형 시스템) 으로 부르며
메세지 스트리밍 기술의 여러 특수한 기능들을 모두 지원한다고 쓰여있다.

MQTT

https://docs.nats.io/running-a-nats-service/configuration/mqtt
https://github.com/nats-io/nats-server/blob/main/server/README-MQTT.md

NATS 2.2 Jetstream 에서 MQTT 3.1.1 지원

QoS 0(fire-and-forget) 이라 할지라도 NATS 서버는 토픽당 하나의 메세지는 유지한다.

데모코드

스프링부트에서 nats 를 사용하는 방법

https://www.baeldung.com/nats-java-client https://github.com/Kouzie/spring-boot-demo/tree/main/nats-demo

카테고리:

업데이트: