RabbitMQ, 마이크로서비스 간 비동기 통신을 위한 핵심 기술
RabbitMQ는 비동기 통신(Asynchronous Communication)을 위한 오픈소스 메시지 브로커로, 마이크로서비스 간의 데이터 교환(Data Exchange)을 용이하게 함
메시지 큐(Message Queue)를 통해 주문 처리, 이메일 전송, 재고 업데이트 등 다양한 백그라운드 작업(Background Tasks)을 효율적으로 처리
익스체인지(Exchange), 바인딩(Binding), 라우팅 키(Routing Key)를 활용하여 메시지를 특정 큐로 전송하는 유연한 라우팅 시스템 제공
ACK(Acknowledgement), TTL(Time To Live), 프리페치(Prefetch) 등의 기능을 통해 메시지 처리의 신뢰성(Reliability)과 성능(Performance)을 향상시킴
댓글에서는 NATS와 RabbitMQ의 비교, 메시지 브로커 선택에 대한 고민(Consideration)을 공유함
RabbitMQ의 핵심 구성 요소
RabbitMQ는 프로듀서(Producer), 메시지(Message), 컨슈머(Consumer), 큐(Queue), 익스체인지(Exchange), 바인딩(Binding)으로 구성된다. 특히 익스체인지는 메시지를 특정 큐로 라우팅하는 핵심 요소로, 다양한 라우팅 규칙을 지원한다. 다이렉트(Direct), 팬아웃(Fanout), 토픽(Topic) 익스체인지 타입을 통해 유연한 메시지 라우팅을 구현할 수 있다.
메시지 신뢰성 확보를 위한 ACK, TTL, 프리페치
RabbitMQ는 ACK(Acknowledgement)를 통해 메시지 처리의 신뢰성을 보장한다. 컨슈머가 메시지를 처리한 후 ACK를 보내면 메시지가 삭제되고, 그렇지 않으면 큐에 다시 반환된다. TTL(Time To Live)은 메시지 만료 시간을 설정하여 지연된 작업이나 임시 알림에 활용된다. 프리페치(Prefetch)는 컨슈머에게 한 번에 전송되는 메시지 수를 제한하여 워커의 과부하를 방지하고, 공정한 분배를 가능하게 한다.
RabbitMQ 워커 모델과 수평적 확장성
RabbitMQ는 워커 모델(Worker Model)을 사용하여 여러 컨슈머 인스턴스가 동일한 큐에서 메시지를 소비하도록 지원한다. 각 메시지는 하나의 워커에게만 전달되어 경쟁 컨슈머(Competing Consumers) 간의 작업 분담이 이루어진다. 트래픽 증가 시 워커 인스턴스를 추가하여 수평적 확장(Horizontal Scaling)을 쉽게 구현할 수 있다. 이는 코드 변경 없이 시스템의 처리 능력을 향상시키는 핵심 요소이다.
RabbitMQ 연결 및 채널 관리
RabbitMQ에서 연결(Connection)은 애플리케이션과 RabbitMQ 서버 간의 TCP 연결을 의미하며, 채널(Channel)은 연결 내의 가벼운 가상 연결이다. 연결은 비용이 많이 들기 때문에, 애플리케이션은 일반적으로 하나의 연결을 공유하고 여러 채널을 생성하여 메시지를 발행/소비한다. 이러한 구조는 시스템의 성능(Performance)과 안정성(Stability)을 향상시키는 데 기여한다.