이번 글에서는 RabbitMQ의 플러그인중에 하나인 Consistent hash exchange에 대해서 알아보고, 실제로 사용해보도록 하겠다.
ㄱㄱ 🔥
특정 큐에 대해서 높은 처리량을 확보하려면, 많은 컨슈머가 붙어서 처리 작업을 하는 것을 생각해볼 수 있다. 처리량을 높일 수는 있긴 하지만, 하나의 큐에 여러 컨슈머가 붙어서 직렬적으로 처리하는 것이므로 다양한 이슈가 공유된다는 단점이 있다.
Consistent hash exchange는 Routing key값을 해싱해서 해시를 기준으로 메세지 자체를 여러 큐에 구분해서 보낸다. 이를 통해서 병렬적으로 메세지를 처리할 수 있게 되는 것이다. 더불어서, 하나의 큐에서 발생한 장애 상황이 다른 큐와 공유되지 않는다는 장점 또한 가질 수 있게 된다.
병렬 처리는 기본적으로 제공되는 Headers exchange나 Topic exchange로도 구현할 순 있지만, 병렬 처리량을 증가 또는 감소시켜야할 때, 굉장히 복잡한 과정을 거칠 수도 있게 된다. 하지만, Consistent hash exchange는 Routing key에 대한 해시를 기반으로 메세지를 분배하기 때문에 큐를 늘리거나 줄이는 것에 있어서 사람이 해줄 일이 매우 적어진다는 장점이 있다.
하나의 Hash exchange에 3개의 큐를 바인딩하였고, 바인드의 Routing key를 이렇게 설정해주었다. 여기서 Routing key는 Weight(메세지를 할당받을 비중)을 의미한다. 즉, 평균적으로 1:1:2의 비중으로 메세지를 할당받게 된다는 것이다.
하지만, 해싱 알고리즘을 사용해서 메세지를 분배하므로 같은 Routing key를 갖고 있는 메세지는 무조건 같은 큐에 할당되게 된다는 특징이 있다.
docker exec -it {Docker 컨테이너 이름} bin/bash
rabbitmq-plugins enable rabbitmq_consistent_hash_exchange
새로운 Exchange를 만들려고 할 때, x-consistent-hash
타입이 추가되어 있으면 플러그인이 정상적으로 설치된 것이다.
x-consistent-hash
를 타입으로 선택하고, Exchange를 하나 만들어준다.
원하는 이름으로 Classic 큐를 2개 이상 만들어준다. 나는 3개를 만들어주었다.
바인드의 Routing key를 메세지를 할당받을 가중치로 생각하고, 원하는 대로 Routing key를 설정해서 위에서 생성한 큐들을 바인딩해준다. 나는 골고루 배분될 수 있도록 모두 1
로 설정하였다.
나는 Routing key를 1~90까지 바꿔가면서 메세지를 Publish했고, 결과는 이렇게 되었다. 좀 더 많은 양의 메세지로 테스트했다면, 1:1:1에 가까운 결과가 나왔을 것이다.
간단한 컨슈머 애플리케이션을 만들 수 있는 사람은 컨슈머 애플리케이션에서 대량의 메세지를 Publish해봐도 좋을 것 같다. 🤓