[RabbitMQ] RabbitMQ vs Kafka 성능 비교 논문
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를 쓰는 것이 좋다는 사실은 하나 알게 되었다.