오늘날, RabbitMQ 덕분에 페이지 로딩 시간을 눈에 띄게 단축시키면서, 복잡한 처리 작업을 비동기적으로 실행하는 효율적인 방법을 알아보겠습니다.
웹사이트나 애플리케이션의 안정성과 속도는 사용자의 경험에 있어 매우 중요한 요소입니다. 페이지가 로딩되기도 전에 사용자들이 사이트를 떠나는 상황을 방지하는 것이 필수적입니다.
RabbitMQ란 무엇인가?
RabbitMQ는 생산자와 소비자 사이의 원활한 통신을 가능하게 하는 확장 가능한 오픈 소스 분산 메시지 브로커입니다. 이는 마치 중개자처럼 작동합니다.
이 시스템은 애플리케이션 계층 메시징 프로토콜인 AMQP를 기반으로 합니다. AMQP는 비동기 메시지 통신을 핵심으로 하며, 브로커에서 생산자로, 다시 소비자에게 메시지 전달을 보장합니다.
RabbitMQ 작동 방식
간단히 말해, RabbitMQ는 생산자가 보낸 메시지를 저장하는 대기열을 생성합니다. 이 대기열은 소비 애플리케이션이 메시지를 받아 처리할 때까지 유지됩니다. 이 구조를 통해 시스템은 메시지를 통해 상호 작용하는 독립적인 모듈로 구성된 분산 시스템을 설계하고 구축할 수 있습니다.
모든 통신 과정에서 생산자, 메시지, 그리고 수신자가 필요합니다. RabbitMQ는 이러한 메시지가 수신자를 기다리는 중심 역할을 합니다.
메시지 교환 방식을 나타내는 ‘교환 유형’을 이해하면 작동 원리를 더 쉽게 파악할 수 있습니다.
교환 유형
RabbitMQ를 통해 메시지를 보낼 때, 메시지는 대기열로 바로 전달되지 않습니다. 대신, 메시지는 교환기로 보내지며, 교환기는 해당 메시지를 적절한 대기열로 전달하는 역할을 합니다.
이미지 출처: CloudAQMP
교환 유형은 직접, 팬아웃, 주제, 헤더 총 4가지로 나뉩니다.
직접 교환
만약 생산자가 세 명의 소비자에게 구매 확인 메시지를 보내야 한다고 가정해 보겠습니다. 즉, 구매 정보를 처리하기 위해 세 개의 시스템과 통신해야 합니다.
RabbitMQ는 각 대기열로 개별적으로 메시지를 보내는 기능을 통해 여러 시스템이 메시지를 직접 수신할 수 있도록 합니다.
교환기는 일반적으로 메시지를 대기열로 전달하지만, 때로는 모든 대기열로 메시지를 보내는 것을 원하지 않을 수 있습니다. 따라서 교환 작업에 적용할 수 있는 몇 가지 조건이 존재합니다.
특정 소비자에게만 메시지를 보내는 것이 가능합니다.
Binding Key: 대기열을 교환기에 연결하기 위해서는 ‘바인딩’이라는 연결을 생성해야 합니다. 이는 대기열과 교환기 사이의 관계를 설정하는 연결자 역할을 합니다.
라우팅 키: 바인딩 과정에서 ‘라우팅 키’라는 요소도 지정할 수 있습니다. 이 키는 메시지를 특정 대기열로 전달하는 역할을 합니다.
예를 들어, 라우팅 키 X, Y, Z가 있을 때 라우팅 키 Y가 있는 메시지는 대기열 Y로 전달되어 해당 메시지를 수신하도록 지정된 소비자에게 전달됩니다.
이러한 방식으로 교환기에 연결된 여러 대기열을 관리할 수 있으며, 동시에 라우팅 키를 사용하여 교환과 다양한 관계를 맺을 수 있습니다.
팬아웃 교환
메시지가 교환기로 전송되면, 이 메시지는 연결된 모든 대기열로 전달됩니다. 따라서 팬아웃 교환에 10개의 대기열이 연결되어 있다면, 전송된 메시지는 모든 대기열에서 수신하게 됩니다.
주제 교환
주제 교환은 가장 유연한 교환 유형 중 하나로, 주제를 기반으로 메시지를 보낼 수 있습니다. 라우팅 키의 명명 규칙에 따라 시스템 간의 규칙 및 관계 패턴을 만들 수 있습니다.
예: 라우팅 키(x.*); 라우팅 키(*.z); 라우팅 키(*.y.*).
RabbitMQ에서 AMQP란?
AMQP(Advanced Message Queuing Protocol)는 다양한 애플리케이션 간에 메시지를 전송하는 데 사용되는 개방형 메시징 프로토콜입니다. 이는 비동기 전송을 허용한다는 점을 제외하면, HTTP나 TCP와 같은 유선 수준 프로토콜과 유사합니다.
RabbitMQ가 AMQP를 구현하기로 결정한 주된 이유는 이 프로토콜이 API를 정의하는 JMS와 달리 미들웨어의 표준으로 기술된다는 점 때문입니다.
AMQP 사양은 Red Hat, Cisco Systems, Microsoft 등 국제 컨소시엄에서 작성되었으며, AMQP를 구현하는 모든 애플리케이션은 AMQP 브로커와 호환성을 갖습니다.
AMQP는 RabbitMQ에서 사용되는 유일한 프로토콜은 아닙니다. 아래 이미지는 RabbitMQ에서 구현 및 지원하는 다양한 프로토콜, 언어, API를 보여줍니다.
RabbitMQ의 주요 특징
RabbitMQ는 서로 다른 위치에서 비동기적으로 메시지를 통해 애플리케이션을 통합하는 것 외에도, 메시징 브로커 세계에서 큰 인기를 얻는 데 기여한 다양한 기능들을 제공합니다.
신뢰할 수 있는 저장
RabbitMQ는 메시지 전달을 보장하는 다양한 기능을 통합하고 있습니다. 그 중 하나는 소비자가 메시지를 받을 수 없을 때 저장 기능을 제공하는 것입니다. 이를 통해 소비자는 메시지 전달을 수락하여 메시지가 성공적으로 처리되었는지 확인할 수 있습니다.
만약 처리 과정에서 오류가 발생하면, RabbitMQ는 메시지를 다시 대기열에 넣어서 다른 소비자 인스턴스가 해당 메시지를 처리하거나, 원래 실패했던 소비자가 다시 처리하도록 할 수 있습니다.
또한, RabbitMQ는 메시지 전달 순서도 보장합니다. 즉, 메시지가 대기열에 도착한 순서대로 소비자에게 전달됩니다.
클러스터 생성
RabbitMQ는 초당 수천 개의 메시지를 처리할 수 있는 뛰어난 성능을 제공하지만, 때로는 애플리케이션 성능에 영향을 주지 않고 더 많은 메시지를 처리해야 할 필요가 있습니다.
이러한 요구를 충족시키기 위해 RabbitMQ는 생산자와 소비자 모두에게 투명한 수평 확장을 가능하게 하는 클러스터 생성을 지원합니다.
고가용성 대기열
RabbitMQ에서 대기열은 클러스터의 여러 노드에 복제될 수 있습니다. 이 덕분에 노드에 장애가 발생하거나 다운타임이 발생하더라도 브로커는 생산자로부터 메시지를 계속 수신하여 적절한 소비자에게 전달할 수 있습니다.
유연한 라우팅
RabbitMQ에서는 바인딩을 통해 교환기와 대기열 간의 메시지 라우팅을 정의할 수 있습니다. 이때, 특정 패턴을 따르더라도 유연한 라우팅 규칙을 지정할 수 있습니다.
다중 프로토콜 지원
RabbitMQ는 AMQP 프로토콜 외에도 플러그인을 통해 STOMP, MQTT, HTTP를 지원합니다. 또한, 각 브로커 구성 요소에 대한 인증 및 접근 제어 메커니즘을 통합하고 있습니다.
RabbitMQ의 실제 사용 사례
RabbitMQ의 가장 중요한 사용 사례는 애플리케이션 간 비동기성 보장, 결합도 감소, 알림 배포, 백그라운드 작업 대기열 관리 등입니다.
특히 전자상거래 분야에서, RabbitMQ는 판매 주문을 처리하고 배송 및 송장 발행 시스템과 같은 다른 부문의 시스템으로 데이터를 전달하는 데 활용됩니다.
예를 들어, 주문이 처리될 때 판매 메시지를 배송 센터나 송장 처리 영역으로 전달할 수 있습니다. 이러한 구조에서는 모든 과정이 병렬적으로 실행되며, 여러 대기열에 작업을 전송하는 비동기 패턴을 따릅니다.
고객이 구매를 완료하고 제품 배송, 운송, 송장 발행 준비가 필요할 때, RabbitMQ의 역할이 매우 중요해집니다.
각 부문은 서로 다른 시스템을 사용하므로, RabbitMQ는 이러한 모든 메시지를 해당 시스템에 전달하는 것을 목표로 합니다.
RabbitMQ 대안
RabbitMQ는 겉보기보다 훨씬 간단하며, 다음과 같은 몇 가지 대안이 존재합니다.
#1. IronMQ
IronMQ는 매우 빠른 메시지 대기열 소프트웨어입니다. 고가용성, 내구성 있는 설계, 단 한 번의 배송을 보장하는 것을 목표로 합니다. IronMQ는 현대적인 애플리케이션 아키텍처를 위한 강력한 클라우드 네이티브 솔루션입니다.
푸시 대기열, 풀 대기열, 롱 폴링을 지원하여 폴링 요청을 더 오랫동안 유지할 수 있습니다. 여러 고가용성 데이터 센터를 사용할 수 있어 확장성이 용이합니다.
클라우드, 공유 또는 전용 하드웨어, 온프레미스 환경에 배포할 수 있으며, 읽기 쉬운 문서가 포함된 다양한 클라이언트 라이브러리를 제공합니다.
#2. 아파치 카프카
Kafka는 분산 이벤트 스트리밍 분야에서 매우 강력한 플랫폼입니다. 핵심적으로, Kafka는 복제되고 분산된 영구 커밋 로그로 설계되었습니다.
이벤트 기반 마이크로서비스나 대규모 스트림 처리 애플리케이션에 적합하며, 내결함성과 고가용성을 위해 클러스터 내에서 비동기적으로 이벤트를 자동으로 복제합니다.
#3. 아파치 ActiveMQ
ActiveMQ는 Java 기반의 다중 프로토콜 메시지 브로커입니다. 이를 통해 애플리케이션 계층에서 AMQP 메시지 대기열 프로토콜을 사용하여 애플리케이션을 통합할 수 있습니다.
JMS(네이티브 Java) 및 Stomp(PHP 애플리케이션에서 사용 가능)와 같은 통합을 위한 여러 프로토콜을 구현합니다.
또한, Amazon에서는 ‘관리형’ 버전인 Amazon MQ를 제공하여 서비스를 훨씬 쉽게 사용할 수 있습니다.
마지막 말
메시징 브로커는 전통적으로 조직 아키텍처에서 중요한 역할을 해왔습니다. 그러나 다양한 채널을 통해 회사 시스템에 접근하는 사용자가 증가함에 따라, 낮은 비용으로 수평적 확장이 가능하고 초당 수많은 메시지를 처리할 수 있는 제품이 필요하게 되었습니다.
RabbitMQ와 같은 차세대 브로커는 고객에게 높은 수준의 가용성, 안정성, 상호 운용성 및 성능을 제공하고자 하는 현대 애플리케이션에서 점점 더 중요한 역할을 하고 있습니다.
애플리케이션을 위한 안정적인 RabbitMQ 호스팅 플랫폼을 고려해 보시는 것도 좋은 방법입니다.