NATS 란?
NATS 란 오픈소스 메세지 큐 서비스의 한 종류로 메인 서버는 Go 언어로 구현되어 있고, 클라이언트들은 다양한 언어에 대한 라이브러리들을 지원해주고 있다. 기본적으로 Publisher와 Subscriber로 구성되어 있으며 인코딩 된 메세지를 publisher가 송신하면 하나 또는 여러 개의 subscriber에 의해서 수신되고 디코딩 되어진다.
NATS는 환경, 언어, cloud / on-premise 시스템 등 프로그램 간의 서로 다른 환경에 상관없이 쉽게 통신할 수 있도록 구현되어 있다. Client들은 URL을 통해서 서버에 접속하고, subject를 통해 메세지를 전송한다.
NATS 서버는 at most once의 QoS를 제공한다. 만약 특정 subject에 대한 subscriber가 없는 경우, 해당 subject로 송신되는 메세지들은 전송되지 않는다. 또한 NATS core는 fire-and-forget messaging system으로 메모리에 있는 메세지만을 사용하고, 디스크에 메세지를 저장하지는 않는다. 이런 부분에서 더 많은 서비스를 제공받기 위해서는 NATS Streaming을 사용할 수 있다. NATS Streaming (STAN)은 메세지 기록/이벤트 등을 저장할 수 있으며 acks, sequence numbers와 같은 기능들을 제공한다.
메세지 전송 구조 및 기능
Subject Based Messaging
기본적으로 NATS는 message 송신과 수신으로 구성되어있다. 송수신 모두 subject를 통해서 어떤 메세지를 topic에 포함할지 결정한다. subject는 간단하게 string으로 subject의 이름과 같이 구현되어 있으며 "."을 통해서 subejct의 계층 구조를 생성할 수 있다. NATS에서는 subject들을 다룰 때 사용할 수 있는 2개의 wildcard를 제공하는데, subscriber는 이를 사용하여서 여러 subject들에게서 메세지를 수신할 수 있다.
- * : 사용된 하나의 계층에 포함된 subject tokens 포함
- > : 사용된 계층과 하위 계층의 모든 subject tokens 포함
Publisher and Subscriber
NATS는 기본적으로 publish-subscribe message distribution model for one-to-many 통신으로 구현되어 있다. publisher가 특정 subject 메세지를 송신하는 경우, 해당 subject를 수신하는 subscriber가 메시지를 수신한다.
Request and Reply
request-reply 구조는 분산 시스템에서 많이 사용되는 패턴으로 request한 시스템이 이에 대한 reply를 기다리는 구조이다. NATS에서도 publish와 subscribe에 이 패턴을 사용하고 있다. 메세지 전송 시에 reply subject를 포함해서 메세지를 송신하고, subscriber는 이에 대한 응답을 reply subject로 송신한다. reply subject는 inbox라는 requestor를 동적으로 가르키는 특수한 subject이다.
Queue group
NATS는 로드밸런싱을 위해서 분산 queue 기능을 제공한다. queue group에 포함된 subscriber들에게 메세지들을 분산 전송하여서 로드밸런싱을 관리한다. queue grouop을 생성하기 위해서는 subscriber가 queue 이름을 등록해야한다. queue 이름으로 등록된 subscriber들 끼리 queue를 구성하게 되는데, 해당 queue의 subject에 해당하는 메세지가 송신되는 경우 queue의 멤버들 중 랜덤하게 한 곳으로 메세지가 전송된다.
NATS는 queue group 설정시에 서버 쪽에서는 특정한 설정이 필요없는데, 이 부분은 시스템의 확장에 유리하다. 만약 queue에 새로운 subscriber를 등록하고 싶은 경우 새로운 application에서 해당 queue 이름으로 등록만 해주면 된다. 반면에 다시 제외하고 싶은 경우 application에서만 등록을 지워주면 된다. 이렇게 NATS는 시스템을 유연하게 관리할 수 있도록 해준다.
QoS
NATS 시스템은 기본적으로 at-most-once로 서비스를 운영하고 있다. at-most-once 에서는 메세지의 유실이 발생할 수 있는데, 이때 request-reply 구조를 사용한다면 timeout과 ack을 통해서 이러한 네트워크 문제 등을 해결할 수 있다. NATS에서 ACK는 빈 메세지로 payload를 점유하지 않는 매우 작은 메세지로 구현된다.
Sequence Numbers
ond-to-many 의 통신 구조에서는 네트워크의 문제로 유실되거나 지연되는 경우가 있다. 이러한 문제들을 해결하기 위해서 메세지에 sequence id를 사용할 수 있다. client는 수신받은 메세지의 sequence id를 통해서 메세지의 유실 여부를 판단할 수 있다.
[reference]
'기타' 카테고리의 다른 글
[Web] Rest URI 네이밍 (0) | 2022.02.18 |
---|---|
[vscode] vscode 파이썬 디버깅 (0) | 2022.01.08 |
[MQ] Message Queue란? (0) | 2021.04.07 |
테스트 주도 개발 TDD와 BDD, DDD (0) | 2021.03.28 |
[Slack Bot 만들기] 3. crontab 등록하여 자동실행하기 (0) | 2021.02.26 |