백엔드 개발/RabbitMQ

[RabbitMQ] RabbitMQ vs Kafka 성능 비교 논문

Razelo 2023. 10. 27. 18:10

RabbitMQ에 대해 학습하는 도중 RabbitMQ와 Kafka에 대해 비교한 흥미로운 논문을 발견했다. 

 

학사 학위 논문으로 보이는 이 논문을 읽어보고 간략하게 정리해보았다. 

 

메세지 브로커에 대한 깊은 난이도라기보다는 두 오픈소스간 성능 비교를 해본 논문이다. 

 

꽤 재밌다.

 

RabbitMQ vs Kafka에 대해 재밌게 읽을 수 있다. 커피마시면서 읽기에 딱 좋다. 

 

 


논문 링크

https://www.diva-portal.org/smash/get/diva2:1674316/FULLTEXT01.pdf

 

내용 요약

분산 시스템, MSA 구조는 컴포넌트의 결합도를 낮추는 방향임
그래서 각 디바이스로 컴포넌트가 분산되있을때,시스템 내 컴포넌트 간 통신을 위해 MOM이 필요하다. 
메세지 브로커는 MOM의 핵심이다. (MOM: message oriented middleware)

한 연구결과에서는 RabbitMQ가 쓰루풋은 카프카에 비해 낮았지만 latency는 더 낮았다고 한다. 

비교대상

  • RabbitMQ 3.3.5 vs 카프카 3.1.0
  • 추가 설정 없이 기본 설정에서 비교
  • 둘다 클러스터 없이 단일 노드로 비교
  • producer, consumer구현 언어는 Java 사용

 

비교 기준

Latency vs throughput

 

테스트
첫번째 메세지 시간과 각각 메세지를 받아서 읽은 시간을 모두 파일에 기록
producer는 각 메세지마다 timestamp를 추가하고 랜덤 바이트로 내용을 채운다. 
메세지를 보낼때의 시간과 받았을때의 시간을 비교 
각 메세지별 시각을 기록하고 ,또 첫 메세지와 마지막 메세지 의 time interval도 기록 
스루풋은 1 second 당 키로바이트로 계산

결과 
1초당 보낸 100개의 메시지 
latency  
kafka가 rabbit보다 3배 이상 느렸음 
latency가 rabbit이 더 낮았다. 

스루풋
카프카가 더 높았음 

10바이트의 1만개의 메세지인 경우 
rabbitMQ는 메세지 개수가 많아질 수록 latency가 크게 증가함 

100바이트 메세지에서도 kafka는 큰 스루풋 보임 

1000바이트 메세지에서도 같음   
카프카의 경우 많은 메세지가 보내질 경우 더 높은 스루풋을 보임 

1000바이트의 1만개 메세지 
이 경우 rabbitMQ가 더 높은 스루풋을 보인다. 


저자 결론 

empty queue 테스트 
큐가 비어있을 일이 많은 경우 rabbitMQ가 더 좋음 
disk에 로그를 쓰고 offset을 기록하는 일을 하는 카프카의 경우 이 동작이 
low latency환경에서는 최적이 아니었기 때문이다. 
rabbitMQ는 모든 메세지를 DRAM에 넣었기 때문에 empty queue가 잦은 상태에서
더 유리했던 것이다. 

메세지 사이즈, 메세지 개수 변화 시 테스트 
메세지 사이즈가 작을때 카프카는 아주 높은 스루풋을 보여줌

RabbitMQ는 10000바이트일 경우 높은 스루풋을 보였임  

commit 기반 메세지 브로커는 메세지 사이즈가 작을때만 높은 스루풋을 보임 
1000바이트 사이즈 메세지에서 kafka가 rabbitMQ보다 더 높은 latency를 가짐 
10000바이트 사이즈 메세지에서 rabbitMQ가 더 높은 스루풋과 latency를 보임 

 


최종 결과 
commit log 메세지 브로커는 AMQP 브로커보다 낮은 latency, 높은 스루풋을 달성할 수 없다. 
적어도 모든 상황에서 말이다. 
그러나 empty queue에서는 압도적으로 Rabbit이 좋다. 

 


개인적인 후기 

재밌게 읽은 논문이다. 하지만 한 가지 명확한 건 둘 중 뭐가 확실히 더 낫다는 건 아닌 것 같다. 다만 empty queue가 빈번한 상황에서 RabbitMQ를 쓰는 것이 좋다는 사실은 하나 알게 되었다. 

 

반응형