마이크로서비스 RabbitMQ 분석: 배포부터 사용까지 전체 가이드

목차

  1. RabbitMQ란?
  2. MQ의 개념
  3. RabbitMQ 주요 기능과 사용 이유
  4. Docker를 활용한 설치
  5. 핵심 구성 요소
  6. SpringBoot 통합 구현

1. RabbitMQ란?

1.1 MQ의 정의

MQ(Message Queue)는 메시지 전송 과정에서 메시지를 보관하는 컨테이너입니다. 메시지 큐는 비동기 통신을 가능하게 하여 시스템 간 결합도를 낮추고 처리 효율성을 향상시킵니다.

1.2 RabbitMQ 특징

RabbitMQ는 Advanced Message Queuing Protocol(AMQP)을 구현한 오픈소스 메시지 브로커입니다. Erlang 언어로 작성되었으며, 오픈 텔레ком 플랫폼 프레임워크 기반으로 클러스터링과 장애 복구 기능을 제공합니다. 주요 프로그래밍 언어를 위한 클라이언트 라이브러리가 풍부하게 지원됩니다.

2. RabbitMQ 사용이 필요한 이유

  • 결합도 분리: 생산자와 소비자가 직접 의존하지 않고 독립적으로 작동
  • 트래픽 균등화: 급격한 요청 증가 시 메시지 버퍼링을 통해 시스템 과부하 방지
  • 메시지 관리: 다양한 메시지 패턴과 라우팅 전략 지원
  • 확장성: 분산 시스템架构에서 유연한 확장 가능

3. Docker를 활용한 설치

Docker 환경(버전 20.10.23 기준)에서 RabbitMQ를 실행합니다.

docker run -d --name rabbitmq 
-p 5671:5671 -p 5672:5672 
-p 4369:4369 -p 25672:25672 
-p 15671:15671 -p 15672:15672 
rabbitmq:3.9.9-management

참고: management 태그 버전은 웹 관리 콘솔이 포함된 이미지입니다.

접속 정보

  • 웹 콘솔: http://[호스트IP]:15672
  • 애플리케이션 연결 포트: 5672
  • 기본 계정: guest / guest

방화벽 설정에 주의하시기 바랍니다.

docker start rabbitmq
docker ps | grep rabbitmq

4. 핵심 구성 요소

4.1 큐(Queues)

큐는 메시지를 저장하는 논리적 저장소입니다.

4.1.1 포인트 투 포인트(Point-to-Point)

단일 생산자가 메시지를 생성하고 단일 소비자가 처리하는 방식입니다. 예시로 작성자가 특정 독자에게 이메일을 보내는 상황을 들 수 있습니다.

4.1.2 토픽/펍-섭scriber 패턴

하나의 생산자가 생성한 메시지를 여러 구독자가 수신하는 방식입니다. 뉴스레터나 공지사항 배포와 유사합니다.

4.2 익스체인지(Exchange)

익스체인지는 물리적 스위치와 유사한 역할을 하며, 메시지를 적절한 큐로 라우팅합니다.

4.2.1 익스체인지 생성

일반적으로 관리자 화면보다 코드를 통해 익스체인지를 생성합니다.

4.2.2 큐 바인딩

익스체인지와 큐之间的关系을 설정합니다.

4.2.3 주요 익스체인지 유형

  • direct:精确 매칭 기반 라우팅. 라우팅 키와 完全一致的 큐에만 메시지 전달
  • fanout: 브로드캐스트 방식. 연결된 모든 큐에 메시지 배포
  • topic: 와일드카드 기반 매칭. 패턴 매칭을 통해 조건부 메시지 라우팅

* headers 타입은 비효율적이어서 잘 사용되지 않습니다.

라우팅 키(Routing Key)

메시지 라우팅을 위한 문자열 식별자입니다. 일반적으로 word1.word2.word3 형태의 점 구분 포맷을 사용합니다.

4.3 브로커(Broker)

RabbitMQ 서버 인스턴스입니다. 분산 환경에서 메시지 중개 역할을 담당합니다.

4.4 커넥션과 채널(Connections & Channels)

  • 커넥션: 애플리케이션과 RabbitMQ 서버 간의 TCP 연결
  • 채널: 커넥션 내의 가상 통신 경로. 다중 채널을 통해 효율적인 리소스 사용

4.5 가상 호스트(Virtual Host)

논리적 분리 단위로, 독립적인 환경 구성이 가능합니다. 사용자 권한 관리와 리소스 격리에 사용됩니다.

5. SpringBoot 통합 구현

5.1 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

5.2 RabbitMQ 활성화

@EnableRabbitMQ
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

5.3 설정 파일 구성

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /

5.4交换机、큐、바인딩 생성

5.4.1交换机 생성

@Configuration
public class RabbitConfig {
    
    @Bean
    public DirectExchange noticeExchange() {
        return new DirectExchange("notice.exchange");
    }
    
    @Bean
    public TopicExchange eventExchange() {
        return new TopicExchange("event.exchange");
    }
    
    @Bean
    public FanoutExchange broadcastExchange() {
        return new FanoutExchange("broadcast.exchange");
    }
}

5.4.2 큐 생성

@Configuration
public class QueueConfiguration {
    
    @Bean
    public Queue emailQueue() {
        return QueueBuilder.durable("email.queue")
                .build();
    }
    
    @Bean
    public Queue smsQueue() {
        return QueueBuilder.durable("sms.queue")
                .build();
    }
    
    @Bean
    public Queue logQueue() {
        return QueueBuilder.durable("log.queue")
                .build();
    }
}

5.4.3 바인딩 설정

@Configuration
public class BindingConfiguration {
    
    @Autowired
    private DirectExchange noticeExchange;
    
    @Autowired
    private Queue emailQueue;
    
    @Bean
    public Binding emailBinding() {
        return BindingBuilder.bind(emailQueue)
                .to(noticeExchange)
                .with("notification.email");
    }
}

5.5 메시지 전송 구현

5.5.1 문자열 메시지 전송

@Service
public class MessageProducer {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendTextMessage(String message) {
        rabbitTemplate.convertAndSend(
            "notice.exchange",
            "notification.email",
            message
        );
    }
}

5.5.2 객체 메시지 전송

@Service
public class EventProducer {
    
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    public void sendNotification(NotificationEvent event) {
        rabbitTemplate.convertAndSend(
            "event.exchange",
            "event.notification",
            event
        );
    }
}

5.6 메시지 수신 구현

@Service
public class MessageConsumer {
    
    @RabbitListener(queues = "email.queue")
    public void handleEmailMessage(String message) {
        System.out.println("수신된 이메일 메시지: " + message);
    }
    
    @RabbitListener(queues = "sms.queue")
    public void handleSmsMessage(String message) {
        System.out.println("수신된 SMS 메시지: " + message);
    }
}

위와 같은 설정으로 포인트 투 포인트, 토픽, fanout 등 다양한 메시징 패턴을 구현할 수 있습니다.

태그: RabbitMQ MessageQueue SpringBoot AMQP microservices

7월 1일 18:22에 게시됨