Apache Pulsar vs. RabbitMQ

Apache Pulsar와 RabbitMQ는 메시징 시스템으로서 각각 고유한 강점과 약점을 가지고 있으며, 사용 사례에 따라 적합한 선택이 달라질 수 있다.

기본 개념 및 역사

Apache Pulsar

Apache Pulsar는 2016년 Yahoo에서 개발되어 2018년 Apache 소프트웨어 재단의 최상위 프로젝트가 되었다. Pulsar는 처음부터 클라우드 네이티브 환경과 대규모 분산 시스템을 위해 설계되었으며, 높은 처리량과 낮은 지연 시간을 모두 달성하는 메시징 및 스트리밍 플랫폼이다.

RabbitMQ

RabbitMQ는 2007년 Rabbit Technologies Ltd.에서 개발되었으며, 현재는 VMware의 일부인 Pivotal Software에서 관리되고 있다. Erlang으로 작성된 RabbitMQ는 AMQP(Advanced Message Queuing Protocol)를 구현한 가장 널리 사용되는 오픈 소스 메시지 브로커 중 하나이다. 신뢰성, 유연성, 상호 운용성에 중점을 두고 설계되었다.

아키텍처 비교

Pulsar는 독특한 다계층 아키텍처를 가지고 있다:

  1. 스토리지와 컴퓨팅의 분리: Pulsar의 가장 큰 아키텍처적 특징은 메시지 처리(컴퓨팅)와 메시지 저장(스토리지)이 분리되어 있다는 점이다.
  2. 구성 요소:
    • 브로커(Broker): 클라이언트 요청을 처리하고 메시지 전달을 관리한다.
    • 북키퍼(BookKeeper): 분산 로그 저장소로, 실제 메시지 저장을 담당한다.
    • 북키(Bookie): BookKeeper의 개별 저장 노드이다.
    • ZooKeeper: 클러스터 메타데이터 관리와 조정을 담당한다.
  3. 세그먼트 기반 스토리지: 메시지는 세그먼트 단위로 저장되고 관리된다.
  4. 계층적 네임스페이스: 테넌트(Tenant) > 네임스페이스(Namespace) > 토픽(Topic)의 계층 구조를 가진다.

RabbitMQ는 보다 전통적인 메시지 브로커 아키텍처를 가지고 있다:

  1. 단일 통합 아키텍처: RabbitMQ에서는 메시지 처리와 저장이 모두 브로커 내에서 이루어진다.
  2. 구성 요소:
    • Exchange: 프로듀서로부터 받은 메시지를 적절한 큐로 라우팅한다.
    • Queue: 메시지가 저장되는 버퍼이다.
    • Binding: Exchange와 Queue 사이의 관계를 정의한다.
    • Virtual Host: 분리된 리소스 그룹으로, 다중 테넌시를 지원한다.
  3. 메모리 및 디스크 저장: 메시지는 기본적으로 메모리에 저장되며, 필요한 경우 디스크로 이동된다.
  4. 클러스터링: 고가용성을 위해 여러 노드를 클러스터링할 수 있다.

메시징 모델

Pulsar는 다양한 메시징 패러다임을 지원한다:

  1. 발행-구독(Publish-Subscribe): 여러 소비자가 동일한 메시지를 받을 수 있다.
  2. 큐(Queue): 메시지는 소비자 그룹의 단일 소비자에게만 전달된다.
  3. 구독 유형:
    • Exclusive: 단일 소비자만 토픽을 구독할 수 있다.
    • Shared: 여러 소비자가 메시지를 공유한다(로드 밸런싱).
    • Failover: 주 소비자가 실패하면 대기 소비자가 메시지를 받는다.
    • Key_Shared: 동일한 키를 가진 메시지는 항상 같은 소비자에게 라우팅된다.
  4. 세그먼트 기반 저장소: 메시지는 추가만 가능한(append-only) 로그에 저장된다.
  5. 메시지 보존: 메시지는 소비 여부와 관계없이 구성된 보존 정책에 따라 저장된다.

RabbitMQ는 AMQP를 기반으로 한 메시징 모델을 제공한다:

  1. Exchange 타입:
    • Direct: 라우팅 키와 정확히 일치하는 큐로 메시지를 전달한다.
    • Fanout: 연결된 모든 큐에 메시지를 브로드캐스트한다.
    • Topic: 와일드카드를 포함한 패턴 매칭을 통해 메시지를 라우팅한다.
    • Headers: 메시지 헤더 속성을 기반으로 라우팅한다.
  2. 메시지 인지(Acknowledgment): 소비자는 메시지 처리 후 확인을 보내며, 확인이 없으면 메시지가 다시 큐에 추가된다.
  3. 메시지 삭제: 메시지는 소비되면 기본적으로 큐에서 제거된다.
  4. 메시지 우선순위: 메시지에 우선순위를 설정할 수 있다.
  5. TTL(Time-to-Live): 메시지와 큐에 대한 TTL을 설정할 수 있다.

성능 및 확장성

Apache Pulsar의 성능 및 확장성

  1. 스토리지와 컴퓨팅 분리: 독립적으로 확장 가능하다.
  2. 성능 특성:
    • 매우 높은 처리량 지원
    • 일관적으로 낮은 지연 시간
    • 수백만 토픽 지원
  3. 확장 방식:
    • 브로커 확장: 처리 용량 증가
    • 북키 확장: 스토리지 용량 증가
    • 독립적인 수평적 확장
  4. 티어드 스토리지: 오래된 메시지를 저비용 스토리지(S3, GCS 등)로 자동 이동하여 비용 효율적으로 대용량 데이터 저장 가능

RabbitMQ의 성능 및 확장성

  1. 성능 특성:
    • 중간 수준의 처리량
    • 매우 낮은 지연 시간(특히 작은 메시지의 경우)
    • 수천 개의 큐 처리에 최적화
  2. 확장 방식:
    • 클러스터링: 여러 노드에 큐 분산
    • 미러링: 고가용성을 위한 큐 복제
    • 주로 수직적 확장에 의존
  3. 메모리 요구사항: 활성 메시지는 주로 메모리에 저장되므로 대용량 메시지 저장 시 메모리 압박 발생 가능

내구성 및 신뢰성

Apache Pulsar의 내구성 및 신뢰성

  1. 복제 전략:
    • BookKeeper의 쿼럼 기반 복제
    • Write Quorum과 Ack Quorum 설정 가능
    • 읽기 및 쓰기에 대한 쿼럼 보장
  2. 장애 처리:
    • 브로커 장애: 영향 최소화(데이터는 BookKeeper에 저장됨)
    • 북키 장애: 자동 장애 복구 및 데이터 재조정
  3. 트랜잭션 지원: 멀티 토픽 트랜잭션 가능
  4. 정확히 한 번 처리: 보장된 메시지 전달 의미론 지원

RabbitMQ의 내구성 및 신뢰성

  1. 복제 전략:
    • 미러링 큐: 모든 노드에 동일한 큐 복제
    • 퀴럼 큐: Raft 합의 알고리즘 기반 복제
  2. 장애 처리:
    • 노드 장애: 미러링된 큐로 자동 장애 복구
    • 네트워크 파티션: 파티션 감지 및 처리 정책
  3. 메시지 지속성: 디스크에 메시지 저장 설정 가능
  4. 확인 모드: 다양한 확인 모드로 신뢰성 수준 조정 가능

주요 기능 비교

  1. 다중 테넌시
    Pulsar:

    • 내장된 테넌트 및 네임스페이스 개념
    • 강력한 리소스 격리
    • 테넌트별 인증 및 권한 관리

    RabbitMQ:

    • Virtual Host를 통한 기본적인 테넌트 분리
    • 완전한 리소스 격리를 제공하지는 않음
  2. 프로토콜 지원
    Pulsar:

    • 자체 바이너리 프로토콜
    • Kafka 프로토콜 어댑터
    • WebSocket 지원

    RabbitMQ:

    • AMQP 0-9-1 (기본)
    • MQTT
    • STOMP
    • HTTP
    • WebSocket
  3. 지역 간 복제
    Pulsar:

    • 내장된 지역 간 복제 기능
    • 네임스페이스 또는 토픽 단위 복제 설정
    • 비동기 복제로 성능 영향 최소화

    RabbitMQ:

    • 내장된 지역 간 복제 기능 없음
    • 페더레이션 플러그인이나 솔로우(Shovel) 플러그인을 통해 제한적으로 구현 가능
  4. 스키마 관리
    Pulsar:

    • 내장된 스키마 레지스트리
    • Avro, JSON, Protobuf 등 다양한 형식 지원
    • 스키마 진화 및 호환성 검사

    RabbitMQ:

    • 내장된 스키마 관리 기능 없음
    • 메시지 형식에 대한 제약 없음
  5. 처리 기능
    Pulsar:

    • Pulsar Functions: 서버리스 스타일의 경량 처리
    • Pulsar IO: 외부 시스템과의 커넥터
    • Pulsar SQL: 저장된 데이터에 대한 SQL 쿼리

    RabbitMQ:

    • 내장된 처리 기능 제한적
    • 주로 메시지 브로커 역할에 집중

운영 및 관리

  1. 구성 및 배포
    Pulsar:

    • 복잡한 다계층 아키텍처로 초기 설정이 복잡
    • 여러 구성 요소(ZooKeeper, BookKeeper, Broker) 관리 필요
    • Kubernetes 및 클라우드 환경 지원

    RabbitMQ:

    • 비교적 간단한 설정 및 배포
    • 단일 구성 요소로 관리 용이
    • 다양한 환경에서의 배포 지원
  2. 모니터링 및 관리 도구
    Pulsar:

    • Pulsar Manager: 웹 기반 관리 도구
    • REST API
    • Prometheus 메트릭
    • 상대적으로 덜 성숙한 관리 도구

    RabbitMQ:

    • 포괄적인 내장 관리 UI
    • 풍부한 플러그인 에코시스템
    • 상세한 모니터링 및 알람 기능
    • 성숙한 관리 도구
  3. 커뮤니티 및 지원
    Pulsar:

    • 성장하는 활발한 커뮤니티
    • Apache 재단 지원
    • 상대적으로 새로운 프로젝트

    RabbitMQ:

    • 오랜 역사와 안정적인 커뮤니티
    • VMware의 상업적 지원
    • 풍부한 문서와 사용 사례

사용 사례 비교

  • Apache Pulsar에 적합한 사용 사례

    1. 대용량 이벤트 스트리밍: 높은 처리량과 대용량 데이터 처리가 필요한 경우
    2. 다중 테넌트 환경: 여러 팀이나 애플리케이션이 동일한 메시징 인프라를 공유하는 경우
    3. 하이브리드 메시징 패턴: 발행-구독과 큐 기반 메시징을 모두 필요로 하는 경우
    4. 지역 간 메시징: 전 세계적으로 분산된 시스템 간 메시지 교환이 필요한 경우
    5. 장기 메시지 보존: 메시지를 장기간 보존하고 재생해야 하는 경우
    6. IoT 및 센서 데이터 처리: 대량의 센서 데이터를 수집하고 처리해야 하는 경우
  • RabbitMQ에 적합한 사용 사례

    1. 복잡한 라우팅 요구사항: 다양한 조건에 따른 메시지 라우팅이 필요한 경우
    2. 마이크로서비스 간 통신: 서비스 간 비동기 통신 채널이 필요한 경우
    3. 작업 분배: 백그라운드 작업을 여러 작업자에게 분배해야 하는 경우
    4. 우선순위 큐: 메시지 처리 우선순위가 중요한 경우
    5. RPC(Remote Procedure Call) 패턴: 요청-응답 패턴의 비동기 통신이 필요한 경우
    6. 낮은 지연 시간 요구사항: 메시지 전달의 지연 시간이 매우 중요한 경우

Apache Pulsar vs. RabbitMQ 비교

특성Apache PulsarRabbitMQ
개발 시작2016년 Yahoo2007년 Rabbit Technologies
프로그래밍 언어Java/C++Erlang
아키텍처다계층(스토리지와 컴퓨팅 분리)단일 통합 아키텍처
스토리지 엔진Apache BookKeeper(분산 로그)메모리와 디스크(Mnesia)
주요 프로토콜자체 바이너리 프로토콜AMQP, MQTT, STOMP, HTTP
메시징 패러다임발행-구독 및 큐발행-구독 및 큐
토픽/큐 구조계층적(테넌트/네임스페이스/토픽)평면적(Virtual Host/Queue)
다중 테넌시강력한 내장 지원Virtual Host를 통한 기본 지원
복제 모델쿼럼 기반 복제미러링 큐, 퀴럼 큐
구독 유형Exclusive, Shared, Failover, Key_Shared기본적으로 경쟁 소비자 모델
메시지 라우팅기본적인 라우팅다양한 Exchange 타입으로 풍부한 라우팅
메시지 보존영구 저장, 티어드 스토리지메모리+디스크, 소비 후 일반적으로 삭제
스키마 관리내장된 스키마 레지스트리지원하지 않음
최대 처리량매우 높음(수백만 메시지/초)중간(수십만 메시지/초)
지연 시간매우 낮음(밀리초 단위)매우 낮음(특히 작은 메시지의 경우)
지역 간 복제내장 기능플러그인을 통한 제한적 지원
트랜잭션지원(멀티 토픽)제한적 지원
처리 기능Pulsar Functions, Pulsar IO, Pulsar SQL제한적, 주로 외부 처리에 의존
메시지 우선순위제한적 지원강력한 지원
확장성수평적 확장 우수수직적 확장에 더 의존적
리소스 요구사항상대적으로 높음상대적으로 낮음
설정 복잡성높음중간
관리 도구Pulsar Manager, REST API포괄적인 내장 관리 UI, 풍부한 플러그인
커뮤니티 성숙도성장 중매우 성숙함
적합한 워크로드대용량 스트리밍, 장기 데이터 보존복잡한 라우팅, 낮은 지연 시간 요구사항
클라이언트 언어 지원Java, Python, Go, C++, Node.js 등Java, Python, Ruby, PHP,.NET, Node.js 등
배포 방식자체 호스팅, 클라우드 네이티브자체 호스팅, 클라우드, 서비스형 제공
오픈소스 라이선스Apache License 2.0Mozilla Public License

선택 가이드

  1. Apache Pulsar를 선택해야 하는 경우

    • 매우 높은 처리량과 대용량 메시지 처리가 필요한 경우
    • 장기간 메시지 보존이 중요한 경우
    • 다중 테넌트 환경을 구축하려는 경우
    • 지역 간 메시징이 필요한 경우
    • 스토리지와 컴퓨팅을 독립적으로 확장하고 싶은 경우
    • 다양한 구독 패턴이 필요한 경우
    • 미래 지향적인 클라우드 네이티브 솔루션을 찾는 경우
  2. RabbitMQ를 선택해야 하는 경우

    • 복잡한 메시지 라우팅 패턴이 필요한 경우
    • 다양한 메시징 프로토콜 지원이 필요한 경우
    • 설정과 관리의 단순성이 중요한 경우
    • 리소스 요구사항이 제한적인 경우
    • 성숙하고 검증된 솔루션이 필요한 경우
    • 우선순위 큐와 같은 특화된 메시징 기능이 필요한 경우
    • 기존 AMQP 기반 시스템과의 통합이 필요한 경우

용어 정리

용어설명

참고 및 출처