Messaging Platform RabbitMQ and Kafka

개발 끄적끄적 .. ✍️·2022년 6월 26일
0
post-thumbnail

🧐 고민

  • 현재 회사에서 비동기 작업 처리를 위한 메시징 플랫폼으로 RabbitMQ를 사용하고 있습니다. 하지만 향후 증가하게 될 부하 및 처리량에 대한 이슈를 대비하기 위해 팀 차원에서의 새로운 고민 하게 되었습니다. 가까운 미래를 안전하고 효율적으로 대비하기 위해 새로운 메시징 플랫폼 리서치를 시작하게 되었습니다.

  • 저희가 도입 고민 중인 메시징 플랫폼은 Kafka입니다. 최근 메시징 플랫폼에서 빠지지 않고 언급되며 많은 기업에서도 적용하여 사용중인 Kafka 도입을 고려하고 있지만, 신규 기술도입은 많은 리스크를 안고 있기에 보다 신중하게 접근해야합니다.

  • 가장 큰 고민은 현재도 안정적으로 운영 중인 RabbitMQ를 떠나 새로운 메시징 플랫폼인 Kafka를 도입할 가치가 있는가에 대해 고민이 입니다. 그러던 중 [NHN FORWARD 2020] RabbitMQ and Cloud Messaging Platform이라는 영상을 발견하게 되었습니다. RabbitMQ와 Kafka의 주요 컨셉부터 역할까지 잘 비교하는 영상이었고 이를 정리해보았습니다.

📭 메시징 플랫폼

1. 메시지 브로커

애플리케이션, 시스템 및 서비스가 서로 간에 통신하고 정보를 교환할 수 있도록 해주는 소프트웨어
정규 메시징 프로토콜 간에 메시지를 변환함으로써 이를 수행

  • 많은 기업들에서 메시지 기반 미들웨어 아키텍쳐에서 자주 사용
  • 미들웨어: 서비스하는 애플리케이션들을 보다 효율적으로 아키텍쳐들을 연결하는 소프트웨어(메시징 플랫폼, 인증 플랫폼, 데이터베이스 등등)
  • 메시지 처리 후 즉시 또는 짧은 시간 내에 삭제
  • 메시지 브로커는 메시지를 생산 - 처리 - 삭제
  • RedisQueue, RabbitMQ

2. 이벤트 브로커

메시지 브로커의 큐 기능을 가지고 있고 추가로 이벤트 별로 관리가 가능

  • 메시지 브로커의 역할 가능
  • 이벤트 또는 메시지라고도 불리는 레코드를 하나만 보관하고 인덱스를 통해 개별 엑세스를 관리
  • 업무상 필요한 시간동안 메시지를 관리 가능
  • 이벤트 브로커는 데이터를 삭제하지 않음
  • 이벤트 브로커는 서비스에서 나오는 이벤트를 마치 데이터베이스에 저장하듯이 이벤트 브로커의 큐에 저장
    • 저장을 통해 얻는 이점
    • 딱 한 번 일어난 이벤트 데이터를 브로커에 저장하므로서 단일 진실 공급원으로 사용 가능
    • 장애 발생시 장애가 일어난 시점부터 재 처리가 가능
    • 많은 양의 실시간 스트림 데이터를 효과적으로 처리 가능
    • 다양한 이벤트 기반 MSA에서 중요한 역할 가능
  • Kafka, AWS Kinesis

🤲 RabbitMQ vs Kafka

1. Main Concept

RabbitMQ

  • Queue
  • Queue의 메시지는 소비되면 짧은 기간 보관 또는 삭제. 일시적인 메시지 보관에 최적화
  • Queue의 생성자(producer)와 소비자(consumer)가 독집적/비동기적으로 동작할 수 있게 사이에서 큐잉버퍼의 역할
  • 메시지가 Queue에서 머무르는 시간이 짧을 수록 성능이 좋게 구현

Kafka

  • Log
  • 일반적으로 파일을 쓰는 것으로 이해하면 쉬움. 메시지를 긴 시간 혹은 영구적으로 보관가능
  • 큐와는 다르게 같은 데이터를 반복적으로 읽을 수 있음
  • 이벤트 소싱을 구현 할 때 좋은 미들웨어
  • 추가되는 메시지를 지속적으로 덧붙히는 방식. 따라서 큐와는 달리 구현 방식이 매우 간단함

2. Broker

RabbitMQ

  • Smart Broker & Dumb Consumer
  • 모든 큐와 메시지를 브로커가 직접 관리
  • 대부분의 기능을 브로커가 처리하고 컨슈머는 독립적인 구조
  • 따라서 컨슈머 애플리케이션을 구현하거나 설계할 때 엔지니어링 리소스가 적음
  • 스케일 아웃과정에서도 단순하게 컨슈머 인스턴스의 수를 늘리면 됨
  • 하지만 컨슈머가 늘어남에 따라 브로커의 역할이 커짐. 여러 컨슈머가 소비하는 메시지의 상태를 모두 관리해야함

Kafka

  • Bumb Broker & Smart Consumer
  • 메시지를 단순하게 덧붙힘. 브로커는 컨슈머가 어떤 메시지를 어디까지 읽었는지 관리하지 않음. 메시지 관리는 컨슈머에서 관리
  • 따라서 컨슈머 애플리케이션 엔지니어링 리소스가 RabbitMQ보다 큼. 개발자의 실수로 인한 장애가 발생할 가능성이 커짐
  • 스케일 아웃 과정에서도 단순하게 컨슈머만 늘리는 것이 아니라 파티션의 수도 함께 늘려줘야함
  • 이런점 때문에 컨슈머의 스케일 아웃이 브로커에 매우 의존적임

2. Queality of Service(메시지 전달 보장 수준)

At most once

  • 메시지 전달에서 손실이 발생할 수 있는 부분
  • 네트워크 문제나 기타 문제로 컨슈머가 받는 메시지 손실이 발생할 수도 있음

At least once

  • 브로커가 메시지 손실 가능성을 사라졌지만 중복 가능성이 있는 메시지가 전달될 가능성이 있음
  • 브로커는 컨슈머에서 메시지 전송 응답이 올 때까지 큐에 메시지를 저장
  • 만약 오류가 발생해 컨슈머에서 브로커에게 메시지 응답 중 연결이 끊어진다면, 큐에 남아 있는 메시지는 다른 컨슈머에게 전송되어 중복 문제가 발생할 수 있음

Exactly once

  • 메시지를 손실 중복 없이 전달하는 메시지 전달 보장 수준
  • 가장 안전하지만 일반적으로 프로듀서 - 브로커 - 컨슈머 사이에 트랜잭션을 사용하기 때문에 성능이 나쁨

4. Protocol

RabbitMQ

  • amqp, mqtt, stomp
  • 다양한 표준 프로토콜 제공

Kafka

  • 자체 전이된 tcp 기반 바이터리 프로토콜 제공
  • 400개가 넘는 커넥터가 존재하기 때문에 다른 서비스와 미들웨어에 적용하는 것이 어렵지 않음

5. Usablilty and Use cases

RabbitMQ

  • 높은 사용성
  • 설치 및 운영이 상대적으로 쉬움. 빌트인 콘솔 있음
  • 메시징 기능에 초점을 둔 전통적인 메시지 브로커

Kafka

  • 관리를 위한 별도의 도구 필요
  • 실시간 스트림 프로세싱
  • 메트릭, 이벤트 소싱 등 다양한 곳에서 사용 가능

참고자료

0개의 댓글