NATS Core + JetStream
메시징 시스템이 필요한 상황에서 kafka는 컴퓨터 요구사항이 너무 크기 때문에 라즈베리파이에는 어울리지 않는다. 카프카의 핵심은 이벤트 전달과 이벤트 관리에 있기 때문에 이를 대체할 수 있는 NATS를 찾았다.
기본 개념
NATS Core는 subject 기반 메시징 시스템이다.
기본적으로 메시지를 저장하지 않고, 현재 연결된 구독자에게 즉시 전달한다.
주요 기능은 Pub/Sub, Queue Group, Request/Reply
Pub - 이벤트 subject에 메세지 전달.
Sub - 이벤트 subject로 전달된 메세지 수신.
Queue Group - 한 Publish에 대한 여러 Subscriber들을 논리적으로 하나의 Subscriber으로 만드는 방법.
Queue Group를 사용하면 여러 구독자가 하나의 구독자가 되어 한 번의 메세지를 수신하게 된다.Request / Reply - 요청자/응답자 모두가 양방향 Pub/Sub을 사용하는 1회성 대화 기능.
요청자는 'subject'로 메세지를 전달하면서 'reply subject'를 함께 전달한다.
응답자는 'subject'를 구독하다가 메시지를 받으면 'reply subject'로 응답을 전달한다.
이제 여기에 JetStream을 사용하면 NATS Core에 Stream, Consumer 개념이 추가된다.
Stream - NATS 메세지에 영속성을 부여하기 위한 저장소.
하나의 Stream에 여러 subject 또는 subject 패턴의 이벤트가 저장될 수 있다.
저장된 이벤트에는 Seq가 부여된다.
Stream은 pub/sub처럼 자동 생성되지 않아 최초 1회 명시적으로 생성해야 한다.Consumer - Stream을 읽기 위한 서버 측 상태 객체.
읽은 메세지를 Subscriber에 전달하고, 어디까지 전달했고 어디까지 ACK 되었는지를 관리한다.
ACK는 메시지를 받았다는 의미가 아니라, Subscriber가 메시지 처리를 완료했다는 확인 신호다.
즉, NATS Core는 Publisher -> Subscriber 구조이고,
JetStream을 사용하는 NATS는 Publisher -> Stream -> Consumer -> Subscriber 구조다.