사용자에게 최적의 서비스를 제공하기 위한 시스템을 구성하기 위해 선택하는 메시징 시스템의 선택은 간단하지가 않다. 각 메시징 시스템은 각자 자신의 고유한 특성을 가지고 있고 그 특성에 따라 구성된 시스템의 성능이나 안정성이 크게 달라질 수가 있다. 따라서 메시징 시스템의 선택은 모든 방면에 대해 고려하여 자신이 서비스할 시스템의 특성에 맞게 해야한다.
여기서는 Apache Kafka 와 RabbitMQ 을 간략하게나마 비교해보려고 한다.
메시징 시스템에서의 broker는 producer와 consumer라는 두 개 타입의 프로세스와 연결되어 있는데, 보통 메시징 시스템에서는 consumer가 각 메시지의 최종 목적지이며, consumer의 메시지 처리 속도가 메시징 시스템을 사용하는 전체 시스템의 성능과 직결된다.
Kafka와 RabbitMQ 를 특징면에서 비교해보기 위해 다음과 같은 환경이 있다고 하자.
여기서는 비교적 메시지 처리 속도가 빠른 “fast” 한 consumer 및 처리 속도가 느린 “slow” consumer가 있다.
그럼 이러한 컨셉에서 Kafka와 RabbitMQ 를 비교해보자.
Kafka는 RabbitMQ에 비해 강력한 성능을 뽐낸다. apache-kafka-vs-rabbitmq 에서도 볼 수 있겠지만 Kafka가 RabbitMQ에 비해 우월한 성능을 보이고 있다.
이 것은 다음과 같이 디자인된 Kafka의 특성에 기인한다.
따라서 보통 Kafka를 사용한다면 시스템에 “fast” consumer 가 있을 때 유리하다. 메시지를 빠르게 처리하는 환경에서는 Kafka의 장점을 100% 활용할 수 있기 때문이다. 물론 “slow” consumer 가 있어도 메시징 처리에는 Kafka가 빠른 처리 속도를 보일 수는 있다. 하지만 Kafka에서는 한 consumer group에서 어느 특정 consumer만이 partition에 접근할 수 있으므로, “slow” consumer 가 메시지를 처리하는 동안 그 consumer가 바라보는 (즉 어떤 partition의 leader 일 때) partition의 메시지 처리가 블록이 된다는 것을 의미한다. 하지만 Kafka의 구성을 어떻게 하느냐에 따라 다른 consumer group의 consumer가 그 메시지를 처리하게 할 수는 있다. (물론 이 메시지를 중복 처리할 때의 문제점이 없거나 해소할 경우에만, Kafka는 consumer group 들 사이에서는 브로드캐스팅하는 발행-구독 모델이다.)
RabbitMQ는 Kafka에 비해 비교적 성숙한 메시징 시스템이고, 사용하기 쉬울 뿐더러 운영면에서도 편한 점이 많다. 비록 위의 그래프에서와 같이 메시지 처리 속도는 Kafka 이 비해 열세랄지라도 서버 추가를 통해 성능을 높일 수도 있다.
RabbitMQ는 다음과 같은 디자인을 따르고 있다.
RabbitMQ도 “fast” 한 consumer가 있을 때에 더 좋겠지만, 만약 우리 시스템에서 consumer의 속도가 “slow” 할 때 다음과 같은 장점을 지닐 수 있다. 만약 consumer의 메시지 처리 속도가 느려 그 다음 메시지를 처리하지 못하고 큐에 쌓이는 경우에, 그 큐에 메시지를 처리할 consumer를 추가하는 것만으로도 이 문제를 해결할 수 있다. (물론 이 것은 두 메시지 간의 처리 순서가 상관없을 때의 이야기이다.)
Kafka와 RabbitMQ, 두 메시징 시스템 모두 좋은 시스템이지만 다음과 같은 선택을 고려해볼 수 있다.
만약 단위 시간 당 처리해야할 메시지의 수가 많고, consumer가 메시지를 처리하는 것이 빠른 시스템을 구축하고자 할 때는 RabbitMQ를 쓰는 것보다 Kafka를 사용하여 높은 성능의 시스템을 구축할 수 있을 것이다. Consumer가 메시지를 처리하는 것이 느리고, 메시지를 처리하는 순서는 상관이 없을 때는 RabbitMQ를 써서 시스템의 자원을 최대한 활용하도록 하는 것이 좋을 것이다.
Kafka or RabbitMQ: depends on your messages nature
Apache Kafka v/s RabbitMQ – Message Queue Comparison
Why Kafka so fast (stackoverflow)