Nodejs

 

NestJS RabbitMQ 연동하기 - 메시지 브로커로 전환

앞서 Redis를 이용해 서비스 간 메시징을 구현했다면, 이번에는 RabbitMQ를 이용해 더 정교한 메시지 브로커 환경을 구축하는 과정을 살펴보겠습니다.

RabbitMQ는 AMQP 프로토콜을 기반으로 동작하며, 큐 단위로 메시지를 관리할 수 있어 복잡한 마이크로서비스 아키텍처에서도 안정적인 통신을 보장합니다.

 

 

 

1. 라이브러리 추가

RabbitMQ 연동을 위해 다음 패키지를 설치합니다.

pnpm i amqplib amqp-connection-manager

 

 

2. Docker 환경 설정

docker-compose.yml에 RabbitMQ 컨테이너를 추가합니다.

services:
  rabbitmq:
    image: rabbitmq:4
    ports:
      - "5672:5672"   # AMQP 프로토콜 기본 포트
      - "15672:15672" # 관리 UI (http://localhost:15672)

???? 15672 포트를 열어두면 브라우저에서 RabbitMQ Management UI에 접속할 수 있습니다. 기본 계정은 guest / guest입니다.

 

 

3. main.ts에서 RabbitMQ 연결 설정

이전에는 Transport.REDIS를 사용했지만, 이제는 Transport.RMQ로 변경합니다.

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);

  app.connectMicroservice<MicroserviceOptions>({
    transport: Transport.RMQ,
    options: {
      urls: ['amqp://rabbitmq:5672'],
      queue: 'order_queue',
      queueOptions: {
        durable: true,
      },
    },
  });

  await app.startAllMicroservices();
}
bootstrap();

여기서 queue 이름은 서비스별로 다르게 지정해야 하며(order_queue, user_queue, payment_queue 등), durable: true 설정은 서버가 재시작되어도 큐가 유지되도록 합니다.

 

 

4. AppModule 설정

ClientsModule을 사용해 RabbitMQ 기반 마이크로서비스 클라이언트를 등록합니다.

ClientsModule.registerAsync({
  clients: [
    {
      name: USER_SERVICE,
      useFactory: () => ({
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://rabbitmq:5672'],
          queue: 'user_queue',
          queueOptions: {
            durable: true,
          },
        },
      }),
    },
    {
      name: PRODUCT_SERVICE,
      useFactory: () => ({
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://rabbitmq:5672'],
          queue: 'product_queue',
          queueOptions: {
            durable: true,
          },
        },
      }),
    },
    {
      name: PAYMENT_SERVICE,
      useFactory: () => ({
        transport: Transport.RMQ,
        options: {
          urls: ['amqp://rabbitmq:5672'],
          queue: 'payment_queue',
          queueOptions: {
            durable: true,
          },
        },
      }),
    },
  ],
  isGlobal: true,
}),

 

5. RabbitMQ의 장점

  1. 강력한 메시지 라우팅
    단순 Pub/Sub이 아니라 Exchange 타입(Direct, Fanout, Topic 등)을 활용해 메시지를 원하는 큐에만 전달할 수 있습니다.

  2. 내구성 (Durability)
    메시지를 디스크에 저장해 서버 장애에도 메시지가 유실되지 않도록 보장합니다.

  3. 확장성 (Scalability)
    여러 Consumer가 동시에 같은 Queue를 구독하여 작업을 분산할 수 있습니다.

  4. 관리 UI 제공
    http://localhost:15672 대시보드를 통해 메시지 흐름, 큐 상태, 바인딩 등을 시각적으로 관리할 수 있습니다.

 

 

6. 주의할 점

  • Queue 이름 충돌: 서비스마다 큐 이름이 고유해야 합니다. (order_queue, product_queue 등)

  • 보안 설정: 운영 환경에서는 guest 계정을 그대로 쓰지 말고 새로운 계정을 만들어야 합니다.

  • 환경 변수 관리: .env에 RabbitMQ 연결 URL을 정의해두고, ConfigService로 불러오는 것이 안전합니다.

RABBITMQ_URL=amqp://rabbitmq:5672

???? 만약 Docker 외부(로컬 PC 툴)에서 직접 접속하려면 amqp://localhost:5672를 사용하면 됩니다.

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

자기 앞에 어떠한 운명이 가로놓여 있는가를 생각하지 말고 앞으로 나아가라. 그리고 대담하게 자기의 운명에 도전하라. 이것은 옛말이지만 거기에는 인생의 풍파를 헤쳐 나가는 묘법이 있다. 운명을 두려워하는 사람은 운명에 먹히고 운명에 도전하는 사람은 운명이 길을 비킨다. -비스마르크

댓글 ( 0)

댓글 남기기

작성