Quorum 큐는 최근에 공식적으로 추가된 큐이다.
기존에는 HA-mode를 활용한 Classic 큐로 데이터 미러링을 구축했었는데, 이 방식에서 데이터의 안정성과 미러링 성능을 향상시킨 큐이다.
Quorum 큐는 보다 안전하고 심플한 형태로 미러링을 하도록 하고, 브로커가 죽는 상황과 같은 실패 상황에 대한 처리를 강화하여서, 데이터 전달의 안정성이 높다.
Quorum 큐에서는 Raft consensus 알고리즘을 사용해서 미러링을 한다고 되어 있는데, 이 알고리즘을 통해서 기존의 HA-mode를 사용한 클래식 큐에서 발생하던 불필요한 RabbitMQ 노드 간의 통신을 줄여서, 빠르고 효율적인 데이터 미러링이 가능하다고 한다.
또, 기존의 미러링방식은 리더 큐에 들어온 메세지를 복제해서 팔로워에도 전달하던 방식이었다면, Quorum 큐에서는 메세지가 들어오는 대로 이 알고리즘을 통해서 연결된 모든 노드에 각각 저장하므로, 노드가 다운되면서 발생할 데이터 유실의 위험이 매우 적다.
Quorum 큐를 사용함으로써 데이터의 안정성을 증대 시킬 수 있을 뿐만 아니라, 데이터의 처리량 또한 늘릴 수 있게 된다. 하나의 리더 큐와 N개의 팔로워 큐에 컨슈머가 붙어서 처리할 수 있으므로 1+N 만큼 병렬 처리가 가능하기 때문이다.
Quorum 큐는 Classic 큐를 사용하는 것에 비해서 보다 높은 메모리 사용량이 발생한다. 또, 디스크 용량이 좀 더 많이 필요하고, 디스크 I/O도 좀 더 많이 발생해서 단일 큐의 성능은 좀 떨어질 수 있다.
그리고, 비교적 최근에 추가된 큐여서, 여러 기능들이 지원되지 않을 수 있다.
Quorum 큐를 제대로 사용하려면, RabbitMQ 클러스터링을 해줄 필요가 있다. 나는 3개의 RabbitMQ노드를 하나의 클러스터로 묶어보겠다.
하는 방법은 이전에 썼던 클러스터링 관련 글을 참고하자.
마스터 노드에서 Quorum 큐를 하나 만들어주자.
그러면, 리더/팔로워 정보를 갖고 있는 Quorum 큐가 하나 만들어지는 것을 확인할 수 있다.
그리고, 이 큐에 메세지를 발행해보자. Quorum 큐는 무조건 디스크에 저장되는 형태이므로, Durable
을 선택하는 옵션이 없다.
메세지가 잘 쌓여있는 것을 확인할 수 있다.
docker exec -it {중지할 RabbitMQ 컨테이너 이름} rabbitmqctl start_app
Quorum 큐의 동작을 확인하기 위해서는 아무 RabbitMQ 노드를 중지해보면 된다.
그랬을 때, Leader 큐가 원활히 교체되는지, Publishing한 메세지가 남아 있는 노드에서 조회 가능한지, 다운시킨 노드를 재부팅했을 때 다시 Quorum 큐에 잘 묶이는지를 확인해보면 된다.