래빗엠큐(RabbitMq)
: 래빗엠큐는 고성능의 메시지 브로커로, 시스템 간의 비동기 통신을 가능하게 해 주는 메시지 큐 시스템아다. 오픈소스로 제공되며, 특히 AMQP(Advanced Message Queuing Protocol)를 기반으로 메시지를 처리한다. 다양한 프로토콜을 지원하고 확장성이 뛰어나며, 특히 신뢰성 있는 메시지 전달과 복잡한 메시지 라우팅에 적합하다는 특징을 가지고 있다.
메시지 큐 시스템
AMQP 지원
Exchange와 Queue
※ 라우팅(Routing)
은 메시지를 목적지에 맞게 분배하거나 경로를 지정하는 과정이다. 메시지를 여러 서비스나 큐로 전송할 때, 메시지를 각 목적지에 맞게 필터링하거나 전송 규칙을 설정하여 효율적으로 분배하는 것이 라우팅이다.
Exchange 유형
RabbitMQ의 Exchange는 몇 가지 유형이 있으며, 각 유형은 메시지의 라우팅 방식을 정의한다:
Direct
: 특정 라우팅 키와 일치하는 메시지를 지정된 큐로 전달한다.Fanout
: 라우팅 키와 상관없이 모든 연결된 큐에 메시지를 전송한다.Topic
: 라우팅 키의 패턴과 일치하는 큐에 메시지를 전달한다. (예: "user.signup" 또는 "order.payment")Headers
: 라우팅 키 대신 헤더 값을 기반으로 큐에 전달한다.Binding(바인딩)
:메시지 확인 및 안정성
RabbitMQ는 메시지 전달 과정에서 메시지 유실을 방지하기 위한 다양한 안전 장치를 제공한다.
Ack/Nack (Acknowledgment)
: 컨슈머가 메시지를 수신하고 처리했음을 래빗엠큐에 확인해 줌으로써 메시지가 정확히 한 번 처리되었음을 보장한다. 만약 컨슈머가 메시지를 처리하지 못하면 Nack을 보내 재전송을 요청할 수 있다.Persistent 메시지
: 메시지를 디스크에 저장하여 래빗엠큐 서버가 재시작되더라도 메시지를 유지한다.확장성과 고가용성
플러그인 및 관리 도구
풍부한 메시징 패턴 지원
여러 유형의 Exchange (Direct, Topic, Fanout, Headers)를 지원하여 다양한 라우팅 규칙과 패턴을 사용할 수 있어 메시지를 특정 큐로 정확하게 전달하거나, 여러 큐에 동시에 메시지를 전송하는 등의 유연한 메시징이 가능하다.
높은 신뢰성과 내구성
메시지의 영구 저장과 전송 실패 시 재전송을 지원해 신뢰할 수 있는 메시지 전송이 가능하다.
데이터 유실 방지를 위해 메시지를 디스크에 저장하거나, 클러스터링을 통한 고가용성 설정이 가능하다.
다양한 프로토콜 지원
AMQP, MQTT, STOMP 등 여러 프로토콜을 지원해 다양한 시스템 및 환경에서 활용할 수 있다.
클러스터링과 고가용성
여러 노드를 클러스터링하여 하나의 메시지 큐 시스템을 확장할 수 있어, 분산 환경에서도 안정적인 운영이 가능하여 장애 발생 시 복제 및 백업을 통해 메시지의 안전성을 보장한다.
손쉬운 관리
RabbitMQ는 웹 기반의 관리 콘솔을 제공해 실시간으로 큐와 메시지 상태를 확인하고 관리할 수 있다.
확장성의 한계
RabbitMQ는 복잡한 메시지 분배를 처리하는 데 최적화되어 있지만, 카프카와 같은 높은 스루풋을 요구하는 대용량 스트리밍 처리에는 적합하지 않다.
설정과 운영의 복잡성
고가용성 및 클러스터링 설정 시 고려해야 할 사항이 많아 운영과 관리가 복잡할 수 있습니다.
메시지 처리량
빠른 순차적 메시지 처리보다 안정성과 신뢰성에 초점이 맞춰져 있어, 고속 스트리밍보다는 트랜잭션 중심의 시스템에 적합합니다.
이메일 또는 알림 시스템: 사용자 가입 시 이메일 발송, 주문 발생 시 알림 전송 등 비동기로 처리해도 되는 작업을 메시지 큐를 통해 처리함으로써 메인 프로세스의 부담을 줄인다.
비동기 데이터 처리 필요시: 이미지 처리나 데이터 분석 등 시간이 오래 걸리는 작업을 메시지 큐에 전달하여, 작업이 완료되면 결과를 전달기 때문에 유저를 마냥 기다리게 할 필요 없어 유저의 사용 편의성이 증대된다.
마이크로서비스(MSA) 간 통신: 서로 독립적으로 동작하는 마이크로서비스들이 비동기로 데이터를 교환할 때 RabbitMQ를 사용하면 메시지 손실 없이 신뢰성 있는 통신을 보장할 수 있다.
주문 처리 시스템: 결제 완료 후 주문 처리 작업을 RabbitMQ 큐에 저장하고, 다양한 백엔드 시스템에서 이를 비동기로 받아 처리함으로써 실시간성을 유지할 수 있다.