NATS란?
NATS는 클라우드 기반 애플리케이션, IoT 메시징 및 마이크로서비스 아키텍처를 위해 만들어진 가벼운 메시징 서비스입니다.
NATS Server는 Go언어로 구축되어있으나 NATS에서 제공하는 툴이나 라이브러리들을 많이 제공하고 있어 Cloud native Application, IoT Messaging, MSA등에서 많이 활용할 수 있습니다. 확인하러가기
NATS는 왜 사용하는 것인가??
- 빠르다
- 가볍다
- 간편하다
- 어디에든 배포가 가능하다
- 최신 기술들 호환이 좋다
와 같은 여러가지 강점들을 가지고 있으며, 이를 토대로 kafka와 같은 Messaging 서비스들과 경쟁을 하고 있는 것 같습니다.
우선 NATS가 어떤 개념으로 작동하고, 어떤 기능들이 존재하는지에 대해 알아보도록 하겠습니다.
Subject-Based Messaging
NATS는 주제 기반 메시징을 지원하고 있습니다.
여기서 말하는 *주제는 무엇일까요?
Subject는 publisher와 subscriber가 서로를 알기 위한 문자열입니다.
이 Subject에는 몇가지 규칙이 따릅니다.
- 권장 문자: a to b, A to Z 및 0 to 9(이름은 대소문자를 구분하며 공백을 포함할 수 없다.)
- 특수문자: 마침표
.
(제목에서 토큰을 구분하는데 사용),*
,>
(각각이 와일드 카드로 사용됩니다) - 예약된 이름:
$
로 시작하는 이름은 시스템에 예약되어 있어 사용하면 안됩니다.
.
은 이름의 그룹을 분간하기 위해 사용이 됩니다.
time.kr.soul
time.kr.busan
또한 *
와>
는 이름이 매칭 부분을 조정할 수 있습니다.
*
는 단일 토큰 매칭으로 *
부분을 제외한 나머지 그룹군이 맞다면 매칭을 시켜줍니다.
>
는 여러가지 토큰을 일치시켜줄 수 있는 것으로 이는 몇가지 조건을 맞춰야 사용할 수 있습니다.
- 하나 이상의 토큰과 일치
- 제목 끝에만 명시가능
위 조건을 만족할 경우 사용하여 토큰을 매칭시킬 수 있습니다.
와일드 카드는 혼합이 가능하며 *
는 한 제목에 여러번 작성할 수 있습니다.
ex) *.*.east.>
Core NATS
NATS를 구성하는 모델들은 다음과 같습니다.
- Publish-Subscribe
- Request-Reply
- Queue Groups
1. Publish-Subscribe
Publish와 Subscribe는 각각 메시지를 발행하는 송신자와 메시지를 수신하는 수신자로 봐도 좋을 것 같습니다.
Publish가 message를 발행할경우 Publisher와 매핑되는 토큰을 가진 Subscriber들이 message들을 읽어 처리하는 식입니다.
주고 받을 수 있는 Message는 아래의 필드들로 구성되어있습니다.
- 과목
- 패이로드(byte Array)
- 헤더 필드의 수
- reply(optional)
Message사이즈는 max_payload설정으로 설정이 가능하고, 기본적으로 1MB가 할당되어있습니다.
최대 사이즈 64MB까지 설정할 수 있지만 무작정 메모리 크기를 늘리기 보다는 꼭 필요한 만큼만 사이즈를 늘려 관리하는 것을 권장하고 있습니다.
2. Request-Reply
요청과 응답 부분입니다.
사용자 즉 Client가 서버에 요청을 보낼경우 서버는 보인이 처리해야하는 로직들을 처리 후 Message를 Publish합니다.
이때, 동기방식으로 Message처리 후 응답을 기다렸다 Client에게 응답을 하는 것이 아닌
서버에서 처리할 부분이 완료될경우 Message는 Publish한 후 Client에게 응답을 하고,
나머지 Message를 받아 처리하는 부분은 Background로 처리합니다.
3. Queue Groups
NATS의 로드밸런싱 기능입니다. 이는 분산 queue기능을 통해 처리하며 이것은 동일한 그룹 내에서 한번만 처리되도록 보장하기 위한 기능입니다.
Queue Groups는 다음과 같은 특징을 가지고 있습니다.
- Load Balancing
- Message Delivery Guaratees
- Scalability
- Fallover
위와 같은 특징들은 모두 Message를 동일한 Queue Group내에서 한번만 처리되도록 하기 위해 분산 처리, 전달 보장, 장애 복구의 기능을 통해 메세지가 처리되도록 보장하고 있습니다. 또한 위와 같이 분산처리를 할 경우 K8s 환경에서 개발을 할경우 Pod를 얼마나 늘리든지 상관없이 얼마든지 확장 강능하다는 강점을 가지고 있습니다.
JetStream
NATS server에는 NATS의 기능보다 확장된 기능들을 제공하는 built-in distributed persistence system이 존재하는데 그것이 JetStream입니다.
JetStream에서 제공하는 기능은 다음과 같습니다.
- Streaming
- Replay policies
- Retention policies and limits
- Limits
- Retention policy
- Subhect mapping transformations
- Persistent and Consistent distributed storage
- Stream replication factor
- Mirroring and Sourcing between streams
- De-coupled flow control
- Exactly once semantics
- Consumers
- Fast push consumers
- Horizontaliy scalable pull consumers with batching
- Cosumer acknowledgments
- Key Value Store
이러한 기능들은 Option이므로 사용하실 때 필요한 기능들을 찾아 적용하시는 것이 좋을 것 입니다.
또한 NATS는 가볍고 빨라야하기 때문에 Event의 Message 즉 Payload가 적정선 이상으로 커지는 것을 경계하는 것으로 보입니다. Message를 설계를 할 때 Message의 크기를 8MB로 제한하고 설계한다면 NATS의 성능을 제대로 활용할 것 같습니다.
참고자료: https://docs.nats.io
'Server' 카테고리의 다른 글
REST API란? (0) | 2024.04.14 |
---|---|
[Docker] 도커로 데이터 베이스 편하게 사용하자~ (1) | 2024.04.08 |
[Docker] Docker 설치하기 (0) | 2024.04.08 |
[Docker] Docker란 무엇인가? (2) | 2024.04.08 |
[이걸 어떻게 하라고] Spring ApplicationContext Bean들을 불러와 작업해보자 (0) | 2023.03.18 |