미니 프로젝트 - RabbitMQ 정리

Zyoon·2025년 8월 12일

미니프로젝트

목록 보기
35/35
post-thumbnail

📘 RabbitMQ 설정 방법 및 주요 요소 사용법


RabbitMQ 간단한 정의

  • 메시지 브로커 : 애플리케이션과 애플리케이션 사이에서 메시지를 전달, 저장, 라우팅해주는 미들웨어.
  • 비동기 통신을 지원 → Producer와 Consumer가 동시에 동작하지 않아도 메시지 전달 가능.

전체 흐름

  • Producer – 메시지 발행 (exchange, routingKey 지정)
  • Exchange – 메시지를 큐로 라우팅
  • Queue – 메시지 저장소 (소비 전까지 대기)
  • Consumer – 큐에서 메시지 소비 (처리 후 ack)
  • RoutingKey: Exchange와 Queue 바인딩 기준

발행과 소비

Producer

  • 객체(Object) 를 RabbitTemplate로 메시지를 Exchange에 발행.
  • 발행 시 Exchange 이름 + Routing Key + Object 를 지정.
public void sendToHub(MessageObject object) {
    rabbitTemplate.convertAndSend(
        "MESSAGE_EVENTS",    // Exchange
        "MESSAGE_ASSEMBLE",  // Routing Key
        object               // Object → JSON
    );
}

Cosumer

  • 큐에서 메시지(Object)를 꺼내 역직렬화(JSON → 객체)하고 처리 로직 실행.
  • Exchange 와 Queue 바인딩 처리되어 있는 경우 소비
  • Routing Key 는 Exchage 에 따라 처리 방식이 다름
  • @RabbitListener로 큐를 구독.
@RabbitListener(queues = "NOTIFICATION_QUEUE")
public void consume(NotificationObject object) {
		//메세지 처리 (
}

설정 요소

큐 (Queue)

  • 우체국으로 치면 우편함. 메시지를 저장하는 공간.
  • 소비자(Consumer)가 꺼내갈 때까지 보관.
  • 설정 시 주요 옵션:
    • durable: 서버 재시작해도 메시지 유지.
    • autoDelete: 연결 끊기면 삭제.
    • arguments: DLQ 설정 등 부가 옵션 넣는 곳.

기본 설정 예시

@Bean
public Queue notificationQueue() {
	return QueueBuilder.durable(NOTIFICATION_QUEUE)
		.withArgument("x-dead-letter-exchange", DLX_NOTIFICATION)
		.withArgument("x-dead-letter-routing-key", NOTIFICATION_SENT_DLX_KEY)
		.withArgument("x-message-ttl", NOTIFICATION_TTL_MS)
		.build();
}
  • durable → 서버 꺼져도 큐와 메시지 유지
  • x-dead-letter-exchange → 실패/만료 메시지 보낼 DLX 지정
  • x-dead-letter-routing-key → DLX에서 쓸 라우팅 키
  • x-message-ttl → 메시지 유효시간(만료 후 DLX로 이동)

익스체인지 (Exchange)

  • 우체국에서 편지의 주소를 보고 배달 구역을 정해주는 사람.
  • 메시지를 어떤 큐로 보낼지 결정.
  • 타입:
    • direct: 라우팅 키 정확히 일치해야 배달.
    • topic: .news 같이 패턴 매칭.
    • fanout: 모든 큐에 뿌림. 라우팅 키 없음.
    • headers: 메시지 헤더 기반 라우팅.

기본 설정 예시

@Bean
public TopicExchange hubExchange() {
	return ExchangeBuilder.topicExchange(MESSAGE_HUB_EVENTS)
		.durable(true)
		.build();
}
  • TopicExchange → 라우팅 키 패턴 매칭(user.*, order.# 등)으로 큐에 전달
  • durable(true) → 서버 재시작해도 익스체인지 유지
  • MESSAGE_HUB_EVENTS → 익스체인지 이름

바인딩 (Binding)

  • 우체국에서 ‘서울 → 서울센터’라는 연결 선.
  • Exchange 로부터 어떤 Queue 로 전달 받을 지 연결
  • 라우팅 키를 통해 어떤 메시지가 어떤 큐로 갈지 결정.

기본 설정 예시

@Bean
public Binding notificationBinding(
) {
	return BindingBuilder.bind(notificationQueue())
		.to(new TopicExchange(MESSAGE_HUB_EVENTS))
		.with(MESSAGE_HUB_ASSEMBLE_KEY);
}
  • 큐를 익스체인지에 연결(Binding)

데드레터 (Dead Letter)

  • 배달 실패 편지 보관소.
  • 소비자가 메시지를 처리 실패하거나, 큐에 너무 오래 머물렀거나, 큐 용량 초과 시 메시지를 다른 큐(DLQ)로 보냄.
  • 구성 요소:
    • Dead Letter Exchange (DLX): 실패 메시지를 모아줄 익스체인지.
    • Dead Letter Queue (DLQ): 실패 메시지를 모아두는 큐.
  • 주로 재처리, 모니터링, 장애 분석 용도로 사용.

팩토리 (Listener Container Factory)

  • 우체국에서 ‘편지 처리반’의 근무 방식 규칙서.
  • 메시지를 소비하는 리스너 컨테이너 설정 모음.
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(
        ConnectionFactory connectionFactory,
        MessageConverter messageConverter
) {
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
    factory.setConnectionFactory(connectionFactory);
    factory.setMessageConverter(messageConverter);

    factory.setConcurrentConsumers(2);        // 동시에 실행할 소비자 수
    factory.setMaxConcurrentConsumers(8);     // 최대 소비자 수
    factory.setPrefetchCount(20);              // 미리 가져올 메시지 수
    factory.setDefaultRequeueRejected(false); // 실패 시 재큐 방지 → DLQ로 이동
    factory.setMissingQueuesFatal(false);     // 큐 없을 때 기동 실패 방지

    return factory;
}
profile
기어 올라가는 개발

0개의 댓글