정지용
기술스택 목록
백엔드

NATS

프로젝트 1에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

가볍고 빠른 메시징을 지원하는 클라우드 네이티브 메시지 브로커

NATS는 서비스 간 메시지를 발행(publish)하고 구독(subscribe)하는 방식으로 통신하도록 설계된 오픈소스 메시징 시스템입니다. 서비스들이 서로를 직접 호출하는 대신 메시지를 주고받게 하여 결합도를 낮추고, 발신자와 수신자가 서로의 존재나 위치를 알 필요 없이 통신할 수 있게 하려는 목적으로 만들어졌습니다. 단순한 텍스트 기반 프로토콜과 작은 설치 크기를 지향하며, 클러스터 구성을 통해 확장성과 가용성을 확보할 수 있습니다.

이럴 때 사용합니다

  • 서비스 간 비동기 이벤트 전달로 결합도를 낮추고 싶을 때
  • 가볍고 설치가 간단한 메시지 브로커가 필요할 때
  • 높은 처리량과 낮은 지연이 중요한 실시간 이벤트 스트림에 적합할 때
  • 메시지 유실 없이 재처리가 필요하면 JetStream으로 신뢰성을 확장할 수 있을 때

핵심 개념

Subject
메시지를 분류하는 문자열 기반 채널 이름으로, 발행자와 구독자는 같은 subject를 기준으로 메시지를 주고받습니다.
Publish/Subscribe
발신자가 특정 subject로 메시지를 보내면(publish), 해당 subject를 구독 중인(subscribe) 모든 수신자가 메시지를 받는 기본 통신 모델입니다.
Core NATS
메시지를 저장하지 않고 즉시 전달만 하는 기본 동작 방식으로, 구독자가 없거나 오프라인이면 메시지가 유실될 수 있습니다.
JetStream
메시지를 디스크나 메모리에 저장해 재전달과 순서 보장을 지원하는 NATS의 영속화 계층으로, at-least-once 전달 같은 신뢰성을 필요로 할 때 사용합니다.
Consumer
JetStream에 저장된 메시지 스트림을 읽어가는 주체로, 각자 자신의 처리 진행 위치(ack 상태)를 유지합니다.
Queue Group
같은 subject를 구독하는 여러 인스턴스를 묶어 메시지를 한 번만 나눠 받도록 하는 부하 분산 단위입니다.

기본 발행/구독 예시

하나의 클라이언트가 특정 subject를 구독하고, 다른 클라이언트가 같은 subject로 메시지를 발행하는 최소 예시입니다.

JavaScript
import { connect, StringCodec } from "nats";

const nc = await connect({ servers: "localhost:4222" });
const sc = StringCodec();

// 구독자: "events.order" subject를 구독
const sub = nc.subscribe("events.order");
(async () => {
  for await (const msg of sub) {
    console.log(`받은 메시지: ${sc.decode(msg.data)}`);
  }
})();

// 발행자: 같은 subject로 메시지 전송
nc.publish("events.order", sc.encode("order.created"));

처음 쓸 때 흔한 함정

  • Core NATS는 메시지를 저장하지 않으므로 구독자가 없으면 메시지가 그냥 사라진다
  • 메시지 순서나 재전달 보장이 필요하면 처음부터 JetStream 사용 여부를 설계에 반영해야 한다
  • Queue Group을 설정하지 않으면 여러 인스턴스가 같은 메시지를 중복으로 처리하게 된다

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.