[Kafka]Kafka vs RabbitMQ vs ActiveMQ


이 글은 카프카, 데이터 플랫폼의 최강자 고승범/공용준 님의 책을 공부하며
정리하는 글입니다.

[Kafka]Kafka vs RabbitMQ vs ActiveMQ

Kafka vs RabbitMQ vs ActiveMQ 차이점을 알아보자 왜 우리 프로젝트는 Kafka를 선택했는가?에 대한 물음에 답해보자

먼저, 메시지 큐란?

  • 메시지 지향 미들 웨어(MOM)은 비동기 메시지를 사용하는 다른 응용프로그램의 데이터 송수신을 말합니다.
  • 메시지큐(MQ)는 프로그래밍에서 프로세스 또는 프로그램 인스턴스가 데이터를 서료 교환할 때 사용하는 방법입니다.
  • 이 때 데이터를 교환 시 시스템이 관리하는 메세지 큐를 이용하는 것이 특징입니다.
  • MOM은 MQ을 포괄하고 있고 MQ에는 Kafka, RabbitMQ, ActiveMQ 등이 있습니다.

메시지 큐의 장점

  • 비동기(Asynchronous) : Queue에 넣기 때문에 나중에 처리 할 수 있다.
  • 비동조(Decoupling) : 애플리케이션과 분리 할 수 있다.
  • 탄력성(Resilience) : 일부가 실패 시 전체에 영향을 받지 않는다.
  • 과잉(Redundancy) : 실패 할 경우 재실행 가능
  • 보증(Guarantees) : 작업이 처리된 걸 확인 할 수 있다.
  • 확장성(Scalable) : 다수의 프로세스들이 큐에 메시지를 보낼 수 있다.

메시지 큐 사용처:

  • 다른 곳의 API로부터 데이터 송수신 가능
  • 다양한 애플리케이션에서 비동기 통신을 할 수 있음
  • 이메일 발송 및 문서 업로드 가능
  • 많은 양의 프로세스들을 처리할 수 있다

JMS vs AMQP

  • AMQP는 ISO 응용 계층의 MOM 표준이다.
  • JMS는 MOM를 자바 에서 지원하는 표준 API 이다. (JMS ≠ AMQP)
  • JMS는 다른 자바 애플리케이션들끼리 통신이 가능하지만 다른 MOM의 통신은 불가능하다. (AMQP, SMTP등)
  • ActiveMQ의 JMS라이브러리를 사용한 자바 애플리케이션들 끼리 통신이 가능하다 그러나 다른 자바 애플리케이션(ActiveMQ를 사용 안함)의 JMS와는 통신 할 수 없다.
  • AMQP는 프로토콜만 맞다만 다른 AMQP를 사용한 애플리케이션 끼리 통신이 가능하다 같은 라인인SMTP 하고도 가능.
  • JMS 라이브러리엔 AMQP를 지원하지 않는다.
  • 참고: http://zzong.net/post/3

Kafka vs RabbitMQ vs ActiveMQ ?

  • (공통)3가지 전부 비동기 통신을 제공하고, 보낸 사람과 받는 사람을 분리합니다.
  • 하지만 업무에 따라서 다른 목적을 가지고 있습니다
  • Kafka(Apache)는 처리량이 많은 분산 메시징 시스템
  • RabbitMQ, ActiveMQ(Apache)는 신뢰할 수 있는 메시지 브로커 입니다.
    • 물론 Kafka도 신뢰할 수 있음. 상대적으로 두개가 아직은 더 신뢰성이 높다는 뜻
  • RabbitMQ 는 빠르고 쉽게 구성 할 수 있으며 직관적.
    • AMQT 프로토콜을 구현해놓은 프로그램, 신뢰성, 유연한 라우팅, 관리 UI의 편리성
  • Kafka 는 확장성, 고성능 및 높은 처리량.
    • 대용량 실시간 로그 처리에 특화, 단순한 메시지 헤더를 지닌 TCP 기반의 프로토콜 사용으로 오버헤드 감소
    • 분산 시스템으로 인해 분산 및 복제 구성 장점
    • 그리하여 노드 장애에 대한 대응성을 가지고 있음
    • 프로듀서는 각 메시지를 배치로 broker에게 전달하여 TCP/IP 라운드 트립을 줄임
    • 기본적으로는 파일시스템에 저장을 통해 영속성(혹은 수명)을 보장 = 오류시 오류 지점부터 복구가 가능
    • Kafka, Kinesis(aws)는 window 단위의 데이터를 넣고 꺼낼 수 있다
  • ActiveMQ 는 효율적이고 사용하기 쉬운 오픈 소스.
    • 자바로 만든 오픈소스 메시지 브로커
    • 다양한 언어와 프로토콜을 지원(Java, C, C++, C#, Ruby, Perl, Python, 그리고 PHP 클라이언트)
  • 프로젝트에서 Kafka를 선택한 이유
    • 우리가 실시간으로 처리 할 용량이 꽤 클 것으로 예상(실시간 데이터보다 배치로 처리 할 양 -> 물론 데이터 양을 파악 할 것이다. 현재는 데이터에 대한 파악을 하는 중)
    • 클라우드 기반에서 사용할 때 무료크레딧을 써서 작은 공간이나 작은 메모리 여러개를 사용하려 함.
    • 프로젝트가 버전업 될 때마다 멀티 아웃으로 추가 할 기술스택이 많아서 확장성을 고려해야 했다.

용어정리
오버헤드: 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리