-
[MQ] RabbitMQMQ 2024. 8. 20. 23:36반응형
이번 포스팅에서는 Message Queue 중 하나인 RabbitMQ의 특징을 설명합니다.
RabbitMQ란 AMQP 프로토콜의 메시징 모델을 기반으로 구현한 메시지 브로커로 Publisher에서 Consumer로 메시지를 전달할 때 중간에서 메시지 브로커 역할을 합니다.
AMQP란? 시스템 간 메시지를 교환하기 위해 공개 표준으로 정의한 표준 메시징 프로토콜이며 ‘메시지 브로커’라는 미들웨어를 활용해서 비동기식으로 메시지 전달이 가능합니다.
RabbiMQ는 높은 처리량보다는 지정된 수신인에게 원하는 방식으로 메시징을 신뢰성 있게 전달하는데 초점이 맞춰져 있어 대용량 트래픽에는 불리하지만 익스체인지 타입이나 라우팅 정책에 따라서 동작 방식을 선택할 수 있습니다.
- Publisher : 메시지를 생성하고 발송하는 주체.
- Consumer : 메시지를 수신하는 주체.
- Exchange : 발행한 모든 메시지가 처음 도달하는 지점. 메시지가 목적지에 도달할 수 있도록 라우팅 규칙 적용 담당.
- Queue : 메시지가 소비되기 전 대기하고 있는 최종 지점. 익스체인지 라우팅 규칙에 의해 단일 메시지가 복사되거나 다수의 큐에 도달할 수 있습니다. 컨슈머가 소비하기 전까지 메시지는 큐에 저장됩니다.
- Binding : 익스체인지와 큐의 관계. 둘이 바인딩 되어야 익스체인지가 알맞은 큐에게 메시지를 전달할 수 있습니다.
- Broker : 애플리케이션 간에 메시지를 중개하는 미들웨어 애플리케이션으로 메시지를 안전하게 저장하고, 필요할 때 소비자에게 전달합니다.
- Virtual Host : 브로커 내의 가상 영역. 보안상의 이유로 발행자와 소비자, 모든 구성 요소를 분리할 수 있습니다.
- Connection : 발행자와 소비자, 브로커 사이의 물리적 네트워크 연결로
- Channel : 발행자와 소비자, 브로커 사이의 논리적 연결로. 채널을 통해 Queue와 Exchange 연결할 수 있습니다.
RabbitMQ 동작 흐름
- Publisher(=Producer) → [ Exchange – Binding → Queue ] → Consumer
Exchange 설정
- 타입
- Direct : 라우팅 키가 정확히 일치하는 큐에게 메시지 전송
- Topic : 라우팅 키의 패턴이 일치하는 큐에게 메시지 전송
- Headers : 라우팅 키 대신 Header 값을 기준으로 일치하는 큐에게 메시지 전송
- Fanout : 해당 익스체인지에 등록된 모든 큐에게 메시지 전송
- Durability : 서버 다운 시 존재 여부(durable:존재, transient:존재x / 주로 일회성으로 사용)
- Auto-delete : 마지막 Queue 연결이 해제되면 삭제
Queue 설정
- Name : Queue 이름. amq.로 시작하는 이름은 예약어로 사용 불가
- Durability : 서버 다운 시 존재 여부(durable:존재, transient:존재x)
- Auto-delete : 최소 한 명의 소비자가 있는 대기열은 마지막 소비자가 구독을 취소하면 삭제
- Arguments : 메시지 TTL, 최대 우선 순위, Max Length 등과 같은 기능을 추가해서 사용 가능(선택사항)
- Exclusive : 여러 리스너가 동일한 큐에 대해 동시에 메시지를 처리하고 경쟁 상태가 발생할 수 있어서 exclusive 옵션을 사용하여 특정 큐에 대해 여러 개의 리스너가 동시에 메시지를 처리하지 못하도록 제한
Consumer의 메시지 소비 과정
- RabbitMQ는 소비자가 Queue에 직접 접근하여 메시지를 가져오는 것이 아니라, 메시지를 Queue에 저장하고 Queue가 소비자에게 푸시(push)하는 방식으로 메시지를 전달
- Spring Boot에서는 @RabbitListener 어노테이션과 RabbitMQ의 자동 설정을 통해 메시지를 쉽게 소비할 수 있습니다.
- RabbitMQ 서버가 설치되고 실행 중이어야 하며, Spring Boot 애플리케이션은 해당 서버에 연결하여 메시징 기능을 수행합니다.
- Exchange에 Binding된 Queue가 없을 경우
- 결합된 Queue가 없거나 라우팅 전략이 일치하는 Queue를 찾지 못할 경우 Exchange에 발행된 메시지는 아무 통보 없이 폐기(default) → 폐기 통지를 받을 수도 있는데 따로 설정 필요
RabbitMQ 메시지 손실 방지 옵션
RabbitMQ 서버가 종료 후 재기동하면 Queue는 모두 제거(메모리에 데이터를 쓰는 형식이기 때문)됩니다.
- Durable 옵션 true → 메시지가 Queue에 저장될 때, 디스크의 파일에도 동시에 저장하는 방법
- MessageProperties.PERSISTENT_TEXT_PLAIN → 메시지 영구 저장
Durability
Durability 옵션을 주어 메모리와 디스크에도 메시지를 저장하여 분실을 방지할 수 있습니다.
- Queue = true & Exchange = true → 메시지 존재
- Queue = true & Exchange = false → 메시지 존재 + Exchange 사라짐
- Queue = false & Exchange = true → 메시지 분실 + Queue 사라짐
- Queue = false & Exchange = false → 메시지 분실 + Queue 사라짐 + Exchange 사라짐
Virtual Hosts
- 여러 애플리케이션 또는 서비스를 운영하고자 할 때 가상 호스트를 사용하여 각각의 메시지 브로커를 독립적으로 관리 할 수 있습니다.
RabbitMQ의 주요 기능
- 다양한 프로토콜 지원 : AMQP, MQTT, STOMP 등 다양한 프로토콜을 지원.
- 확장성 : 수평적으로 확장 가능하여 높은 트래픽을 처리할 수 있음.
- 플러그인 시스템 : 다양한 플러그인을 통해 기능을 확장할 수 있음.
- 관리 인터페이스 : 웹 기반의 관리 인터페이스를 통해 큐 상태, 메시지 등을 모니터링 및 관리 가능.
- 높은 가용성 : 클러스터링을 통해 고가용성을 제공.
RabbitMQ 사용 예시
- 비동기 메시징 : 주문 처리 시스템에서 주문이 들어올 때마다 주문 정보를 큐에 넣고, 다른 서비스가 이를 비동기 처리.
- 장애 격리 및 복구 : 이메일 발송 서비스 다운되어도, 큐에 쌓인 이메일 발송 요청은 서비스가 복구된 후 처리 가능.
- 데이터 스트리밍 : 실시간 로그 모니터링 시스템에서 로그 데이터를 스트리밍하여 실시간 분석.
- 이벤트 소싱 : 금융 거래 시스템에서 거래 이벤트를 큐에 저장하여 거래 내역 재구성.
이상으로 RabbitMQ의 특징에 대해서 알아보았습니다.
반응형