NATS!
개요
https://docs.nats.io/ https://docs.nats.io/nats-concepts/what-is-nats
https://github.com/nats-io/nats-server
go 로 개발된 PubSub 기반의 메세지 스트리밍 서비스
아래와 같이 서비스 수행 중간에 Pub/Sub
가 수시로 이루어질 수 있다.
dispatcher.subscribe(subject) {subjectHandler(it)}
dispatcher.unsubscribe(subject)
Kafka
나 RabbitMQ
와 같이 구독/발행 구조의 메세지 브로커 역할을 하지만
서비스 실행 초반에 큐/파티션 등을 만드는 브로커와 다르게 가볍고 빠르게 Pub/Sub
이 가능하다.
NATS 는 기본적으로 At most once QoS(fire-and-forget)
기반으로 동작하며 메시지를 메모리에만 보관하고 디스크에 작성하지 않는다.
서버/클라이언트 설치
$ 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
신뢰성 있는 메세지 전송, 메세지 유실에 대한 보존정책 등, 안정성을 위한 개념으로 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