Rabbitmq Quorum queue

Erea
4 min readFeb 17, 2021

Overview

Quorum queue는 Raft Consensus Algorithm(https://raft.github.io/) 기반으로 HA구성이 가능한 FIFO 큐를 구현하는 RabbitMQ의 큐 유형입니다 . RabbitMQ 3.8.0부터 사용할 수 있습니다. quorum queue에 최종 목적은 안정성을 기반으로 한 신뢰성 높은 queue를 목표로 합니다

Classic queue vs Quorum queue

현재 Classic queue 에 HA 구성에 단점은 메시지가 매우 비효율적인 알고리즘을 사용하여 복제되기 때문에 성능이 생각보다 느립니다. 미러링된 큐가 작동하는 방식은 단일 master queue 와 하나 이상의 mirror queue가 있습니다. 모든 읽기 및 쓰기는 master queue를 통과하고 master는 모등 명령(wirte, read, ack, nack 등)을 mirror queue에 복제하는 방식입니다. 모든 live mirror가 메세지를 받으면 master는 publisher에게 ack(확인메시지) 를 보냅니다. 이시점에서 master가 실패하면 mirror가 master로 승격되고 queue는 데이터 손실없이 사용 가능한 상태로 유지됩니다. 미러링된 queue는 여러개인 경우 master와 mirror cluster에 분산되므로 각 브로커는 여러 master 와 mirror를 호스팅 할 수 있습니다. 문제는 브로커가 오프라인 상태가되었다가 다시 돌아 오면 미러에 있던 모든 데이터가 삭제된다는 것입니다. 또한 mirror queue가 다시 온라인 상태가 되었지만 비어 있으므로 master는 미러 동기화 여부를 결정할 수 있습니다. 이 동기화가 될때 메세지가 많으면 그동안 메시지를 소비할수 없어 메모리 부족현상이나 이상 현상이 일어날수 있습니다. 즉 요약하면 브로커가 재시작이 되면 mirror queue에 있던 모든 데이터가 삭제되는 문제가 있고 mirror queue가 재시작되거나 실패되서 다시 올라올때 동기화가 될 메시지가 많으면 그동안 쌓인 메시지로 실패지점이 일어날 수 있는 단점이 있습니다.

Classic queue 구조

Quorum queue는 Raft 프로토콜을 사용하여 mirror queue 보다 안전하고 처리량이 더 높습니다.

Raft를 사용한 메시지 복제

각 Quorum Queue는 복제 된 대기열입니다. 리더와 여러 팔로워가 있습니다.

클라이언트 (publish, consumer)는 항상 리더 복제본과 상호 작용하여 모든 명령 (쓰기, 읽기, 확인 등)을 팔로워에게 복제합니다. 팔로어는 클라이언트와 전혀 상호 작용하지 않습니다. 중복성을 위해서만 존재하므로 RabbitMQ 브로커가 실패하거나 종료되거나 재부팅 될 때 가용성을 허용합니다. 브로커가 오프라인 상태가되면 다른 브로커의 팔로워 복제본이 리더로 선출되고 서비스는 계속됩니다.

Quorum의 장점

  • 클라이언트는 게시 및 구독 방법을 변경할 필요가 없습니다.
  • 동기화 문제가 사라졌습니다. 브로커가 온라인으로 돌아올 때 데이터를 버리지 않습니다. 모든 메시지는 디스크에 남아 있으며 리더는 중단 된 위치에서 메시지를 복제합니다.

Quorum의 단점

  • Non-durable messages
  • Queue Exclusivity
  • Queue/message TTL
  • Some policies are not available. Only DLX and length limit are available.
  • Priorities
  • Lazy queues
  • No global QoS

Sample

nodejs quorum queue example

Refernce

https://www.cloudamqp.com/blog/2019-03-28-rabbitmq-quorum-queues.html

https://www.rabbitmq.com/quorum-queues.html#motivation

--

--