보람찬 코기의 개발자 블로그
article thumbnail
반응형

RabbitMQ란?

 

RabbitMQ는 AMQP 스펙을 구현한 대표적인 오픈 소스 메시지 브로커이다. 수신 받은 메시지를 큐에 저장하고, 이를 처리하는 시스템 간에 비동기적으로 메시지를 전달하는 역할을 한다.

 

주요 기능으로는 메세지를 많은 사용자들에게 전달하거나, 요청에 대한 처리 시간이 길때, 해당 요청을 다른 API에게 위임하고 빠른 응답을 할 때 많이 사용한다.

 

예를 들어, 사용자가 파일 업로드를 요청했을 때, 그 작업을 RabbitMQ 큐에 넣어두고 빠르게 사용자에게 "작업이 접수됨" 이라는 응답을 보낼 수 있다. 실제 아키텍쳐에서 업로드 작업은 백그라운드에서 처리되며, 이를 통해 빠른 응답과 비동기 처리가 가능하다.

 


앞서 RabbitMQ는 AMQP 스펙을 구현한 대표적인 오픈 소스라고 말하였다. AMQP의 개념을 먼저 알아보자

 

AMQPAdvanced Message Queuing Protocol의 약자로, 메시지 큐 시스템 간에 메시지를 전송하는 방법을 정의하는 프로토콜이다. AMQP는 메시지 큐의 사용을 표준화하여 서로 다른 시스템 간(분산 시스템이나 마이크로서비스 아키텍처)의 통신이 원활하게 이루어질 수 있도록 한다.

 

AMQP의 주요 특징

  • 브로커 중심의 메시징: AMQP는 중앙 메시지 브로커가 메시지를 라우팅하고 큐에 저장하는 방식.
  • 메시지 큐잉: 메시지는 브로커에 의해 큐에 저장되고, 소비자가 이를 처리.
  • 확장성: AMQP는 높은 수준의 확장성을 지원하여 대규모 시스템에서도 효과적.
  • 신뢰성: 메시지가 손실되지 않도록 다양한 보장 메커니즘을 제공한다.

 

 

AMQP 동작 메커니즘

 

  • Publisher(Producer): 메시지를 보내는 주체
  • Consumer(Subscriber): 메시지를 받는(꺼내는) 주체
  • Exchange: Producer로부터 메시지를 수신하여 수신한 메시지를 큐에 설정 값에 알맞게 분배.
  • Queue: 메시지를 메모리나 디스크에 저장하는 곳. 저장 후 Consumer에게 전달.
  • Binding: Exchange와 Queue의 mapping. 1:1 또는 1:N로 바인딩 할 수 있다.

 

즉, Exchange가 Producer로부터 메시지를 받고, Queue에 전달한다. Queue는 Consumer에게 메시지를 전달한다.

 

RabbitMQ는 Exchange를 다른 Exchange와도 연결할 수 도 있다.

Exchange 종류

    • Direct Exchange
      • 라우팅 키가 특정 큐의 바인딩 키와 정확히 일치하는 Queue에 메시지 전송 (1:1)

Direct

 

 

  • Fanout Exchange
    • 해당 Exchange에 등록된 모든 Queue에 메시지 전송 (1:N)
    • 모든 큐에 동일한 메시지를 보내야 할 때 사용 (브로드캐스트)

Fanout

  • Topic Exchange
    • 라우팅 키 패턴이 일치하는 Queue에 메시지 전송
    • 와일드카드 문자 (*, #)를 사용하여 복잡한 라우팅을 한다. 예를 들어, *.orange.*라는 라우팅 키는 quick.orange.rabbit과 일치하지만 lazy.orange.elephant와도 일치한다.

  • Headers Exchange
    • [key:value]로 이루어진 header값을 기준으로 일치하는 Queue에 메시지 전송
    • 메시지의 헤더를 기반으로 메시지를 라우팅합니다.
    • 이 방식은 라우팅 키를 사용하지 않고, 대신 헤더를 사용해 라우팅 조건을 설정.

 

 

AMQP 사용 이유 (느슨하게 결합된 아키텍쳐 달성)

예를 들어, 서버에 로그인할 때 사용자의 접속 시간을 여러 DB에 업데이트해야 한다고 가정해보자.
만약 여러 DB를 사용하고 있다면, 각 DB에 쿼리를 보내는 데 시간이 소요되어, 자연스럽게 로그인 처리 시간이 길어진다.

또한, 로그인 로직이 여러 DB에 강하게 결합되어 있다면, 중간에 하나의 DB에 문제가 생길 경우 로그인 자체가 불가능해지는 문제가 발생할 수 있습니다.

 

이때, 메시지 지향 미들웨어(MQ)를 활용하면, 로그인 처리 중 DB 업데이트 작업을 분리하여 DB 업데이트가 완료될 때까지 기다리지 않고도 로그인을 신속하게 진행할 수 있다.

 

즉, 로그인 처리 과정에서 DB 업데이트는 별도의 메시지 큐를 통해 비동기적으로 처리된다. 이렇게 하면 로그인과 DB 업데이트가 독립적으로 이루어지며, 각 DB에 대한 업데이트는 큐를 통해 전달되어 처리된다.

 

이 방식은 장애 발생 시 복구와 유지보수가 쉬워지는 장점이 있다. 예를 들어, 하나의 DB에서 문제가 발생하더라도 해당 DB만 복구하면 되며, 다른 DB는 영향을 받지 않는다. 또한, 로그인이 빠르게 이루어지기 때문에 사용자 경험이 향상된다.

 

 

시스템 아키텍쳐

 

 

RabbitMQ의 장점

또한 AMQP기반의 오픈소스중 RabbitMQ의 장점은 다음과 같다.

 

경량성 (Lightweight)

  • RabbitMQ는 경량 메시지 브로커로 설계되어, 낮은 하드웨어 요구 사항에서도 효율적으로 동작한다.(필자는 라즈베리파이 환경에서 극한 테스트를 해보았다.) 즉, 클라우드 환경이나 리소스가 제한된 환경에서도 가능하다.
  • 설치와 설정이 간단하며, Docker에서도 최소한의 리소스로 메시지 브로커를 빠르게 실행할 수 있다.
  • 기본적으로 관리 인터페이스와 메시징 시스템이 분리되어 있어, 운영 및 확장이 용이하다.

다양한 클라이언트 라이브러리 지원

  • RabbitMQ는 다양한 프로그래밍 언어를 지원하는 클라이언트 라이브러리를 제공한다. 이는 다양한 언어로 작성된 애플리케이션 간의 메시징 통합이 용이하다.
    • 공식 클라이언트 라이브러리는 Java, .NET, Python, Ruby, JavaScript, PHP 등 여러 언어를 지원한다.
    • 추가적으로, AMQP 표준을 지원하는 서드파티 라이브러리도 활용할 수 있다.
  • RabbitMQ를 사용하면 높은 호환성과 유연성 극대화 달성

플러그인 시스템

 

RabbitMQ는 플러그인 기반의 확장성을 제공하여, 사용자 요구에 맞춰 커스터마이징할 수 있다.

  • Shovel: 메시지를 한 RabbitMQ 브로커에서 다른 브로커로 전송하는 플러그인.
  • Federation: 여러 RabbitMQ 브로커 간에 메시지를 전달할 수 있도록 지원하는 플러그인.
  • Management Plugin: 웹 기반의 UI를 제공하여 브로커 상태, 큐 상태, 메시지 흐름 등을 시각적으로 모니터링 가능.
  • Authentication 및 Authorization Plugins: LDAP, OAuth, JWT 등의 인증 메커니즘을 추가 지원.
  • MQTT 및 STOMP: RabbitMQ를 AMQP 외의 다른 프로토콜에서도 사용할 수 있게 지원.

플러그인을 통해 RabbitMQ는 기본 기능뿐 아니라 분산 메시징, 클러스터링, 데이터 백업 및 복구 등 고급 기능까지 확장 가능하다

 

보안 계층

 

RabbitMQ는 다양한 보안 프로토콜 및 메커니즘을 지원하여 데이터의 기밀성, 무결성, 인증을 보장한다.

  • TLS/SSL 지원: 전송 계층 보안을 통해 메시지가 네트워크에서 암호화된 상태로 전송되도록 보장.
  • 사용자 인증 및 권한 부여:
    • 기본 사용자-비밀번호 인증.
    • LDAP, OAuth2 같은 외부 인증 시스템과의 통합 가능.
    • 각 사용자나 애플리케이션에 대해 세분화된 액세스 제어를 설정할 수 있음.
  • 방화벽 및 액세스 제어: IP 기반의 연결 허용/차단 설정.
  • 이러한 보안 계층은 RabbitMQ를 고도의 보안 요구사항이 있는 시스템에서 안정적으로 사용할 수 있게 한다.

 


다음 포스팅은 이해를 바탕으로 해당 소프트웨어를 Python으로 구현하고자 한다.

반응형
profile

보람찬 코기의 개발자 블로그

@BoChan

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!