본 글은 Apache Kafka에 대해서 공부한 지식을 정리한 글입니다.
Apache kafka란❓
Apache Kafka는 오픈 소스 분산 스트리밍 플랫폼으로, 대량의 데이터를 신속하고 안정적으로 처리하는 데 특화되어 있습니다.
Kafka는 원래 LinkedIn에서 개발되었으며, 현재는 Apache 소프트웨어 재단의 프로젝트로 관리되고 있습니다. Kafka는 메시지 큐와 유사하지만, 주요 목적은 데이터 스트리밍과 이벤트 소싱을 통해 실시간 데이터를 처리하는 것입니다.
Kafka의 주요 구성 요소
메세지(Message)
- 메시지는 Kafka를 통해 전달되는 데이터 단위입니다.
- 메시지는 주제(Topic)에 게시되는 데이터 조각으로, 일반적으로 문자열, JSON, Avro 등 다양한 포맷을 지원합니다.
- 메시지는 Key-Value 형태로 저장될 수 있으며, 각 메시지는 고유한 오프셋(Offset)을 가집니다.
키(Key)
- 키는 메시지를 특정 파티션에 매핑하는 데 사용되며, 메시지에는 선택적으로 키를 설정할 수 있습니다.
- 동일한 키를 가진 메시지는 항상 같은 파티션에 저장되며, 이를 통해 데이터의 순서를 보장하고 특정 데이터를 특정 파티션에서만 처리할 수 있습니다.
주키퍼(ZooKeeper)
- Kafka 클러스터를 관리하고 조정하는 데 사용되는 분산 코디네이션 서비스입니다.
- Kafka는 ZooKeeper를 사용하여 클러스터의 메타데이터와 상태를 관리합니다.
- ZooKeeper는 브로커의 상태를 추적하고, 클러스터의 브로커 간의 협조를 조정하며, 리더 선출 및 파티션 리플리케이션 상태를 관리합니다.
브로커
- Kafka 클러스터의 각 서버를 의미하며, 메시지를 저장하고 전송하는 역할을 합니다.
- Kafka 클러스터는 여러 브로커로 구성됩니다. 각 브로커는 메시지를 수신하고 저장하며, 소비자에게 전달합니다.
- 브로커는 데이터를 파티션으로 나누어 저장하고, 클러스터의 분산 처리와 확장성을 지원합니다.
주제(Topic)
- 메시지를 저장하는 장소입니다. 메시지는 토픽에 저장되었다가 소비자에게 전달됩니다.
- Kafka에서 메시지는 주제(Topic)라는 논리적인 스트림으로 그룹화됩니다.
- 주제는 데이터의 카테고리 역할을 하며, 각 주제는 여러 파티션으로 나누어져 데이터의 병렬 처리를 가능하게 합니다.
파티션(Partition)
- 파티션은 토픽을 물리적으로 나눈 단위로, 주제는 각 파티션으로 분할되어 독립적으로 메시지를 저장하고 관리합니다.
- 각 파티션은 순서가 보장된 로그이며, 독립적으로 읽고 쓸 수 있습니다.
오프셋(Offset)
- 특정 파티션 내에서 메시지의 위치를 나타내는 고유한 숫자입니다.
- 소비자는 오프셋을 기반으로 메시지를 읽으며, 이를 통해 재시작 시 메시지를
중복없이 읽을 수 있습니다.
리더(Leader) & 팔로워(Follower)
- 리더(Leader): 파티션의 모든 읽기 및 쓰기 요청을 처리하는 브로커입니다.
- 팔로워(Follower): 리더의 데이터를 복제하여 장애 복구와 고가용성을 지원하는 브로커입니다.
- 각 파티션은 리더와 여러 팔로워로 구성됩니다.
프로듀서(Producer)
- 메세지를 생성하고 Kafka 클러스터에 메시지를 전송하는 애플리케이션입니다.
- 프로듀서는 메시지를 주제(Topic)에 발행하며, 메시지를 파티션에 배치하는 정책을 결정할 수 있습니다.
- 메시지를 전송할 때 키를 사용하여 특정 파티션에 전송할 수 있습니다.
컨슈머(Consumer)
- 컨슈머는 Kafka에서 메시지를 읽어들여 처리하는 역할을 합니다.
- 컨슈머는 주제(Topic)를 구독하고, 해당 주제(Topic)의 메시지를 읽어 처리합니다.
- 컨슈머는 오프셋을 추적하여
메시지를 중복없이 처리할 수 있습니다.
RabbitMQ와 Apache kafka의 차이점
RabbitMQ와 Apache Kafka는 모두 메시지 큐 시스템이지만, 그 목적과 설계, 기능에서 중요한 차이점이 있습니다.
각각의 시스템은 특정 요구 사항에 따라 다르게 동작하며, 다양한 사용 사례에 적합합니다. 아래는 RabbitMQ와 Apache Kafka의 주요 차이점입니다.
1. 기본 설계 철학
RabbitMQ
- 메시지 브로커로 설계되었으며, 전통적인 메시지 큐 시스템입니다.
- 메시지 전송의 신뢰성과 큐잉에 중점을 둡니다.
Apache Kafka
- 분산 스트리밍 플랫폼으로 설계되었으며, 대량의 데이터 스트리밍과 이벤트 소싱에 중점을 둡니다.
- 데이터 저장과 실시간 스트리밍을 염두에 두고 설계되었습니다.
2. 메세지 지속성
RabbitMQ
- 메시지를 메모리나 디스크에 저장할 수 있으며, 일반적으로 단기 저장을 목표로 합니다.
- 메시지는 큐에서 소비되면 삭제됩니다. 메시지를 소비한 후, 해당 메시지는
더 이상 큐에 존재하지 않습니다.
Apache Kafka
- 메시지를 디스크에 저장하며, 장기 저장을 목표로 합니다. 데이터 로그는 설정된 기간 동안 보존됩니다.
- 메시지는 파티션에 저장되고, 소비자가 메시지를 읽은 후에도 일정 기간 동안 유지됩니다.
3. 메세징 모델
RabbitMQ
- 큐(Queue)를 기반으로 하며, 메시지를 큐에 쌓아서 처리합니다.
- 라우팅과 필터링을 위해 다양한 익스체인지(Exchange) 타입(Direct, Topic, Fanout 등)을 제공합니다.
Apache Kafka
- 주제(Topic)를 기반으로 하며, 메시지를 주제(Topic)에 게시하고, 파티션을 통해 데이터를 분산 저장합니다.
- 메시지는 주제에 게시되고, 소비자는 주제를 구독하여 메시지를 읽습니다.
4. 확장성
RabbitMQ
- 수직적 확장(Scal Up)이 주로 이루어지며, 노드 간의 클러스터링을 통해 수평적 확장(스케일 아웃)도 지원합니다.
- 큐의 분산 처리와 확장은 주로 큐의 복제나 클러스터링을 통해 이루어집니다.
Apache Kafka
- 수평적 확장(Scale Out)에 최적화되어 있으며, 브로커를 추가하여 클러스터의 용량과 처리 성능을 확장할 수 있습니다.
- 파티션을 통해 데이터 분산 처리와 병렬 처리가 이루어집니다.
5. 사용 사례
RabbitMQ
- 전통적인 메시징 요구 사항(예: 작업 큐, 메시지 라우팅)에 적합합니다.
- 실시간 알림, 작업 분산, 비동기 처리 등에서 많이 사용됩니다.
Apache Kafka
- 대규모 데이터 스트리밍, 이벤트 소싱, 로그 수집 및 분석 등에서 강력한 성능을 발휘합니다.
- 실시간 분석, 데이터 파이프라인, 이벤트 기반 시스템 등에서 주로 사용됩니다.
이러한 차이점을 통해, RabbitMQ와 Apache Kafka는 각기 다른 요구 사항과 사용 사례에 맞추어 선택할 수 있습니다. RabbitMQ는 메시징과 큐 기반의 처리에 적합하고, Kafka는 실시간 데이터 스트리밍과 대규모 데이터 처리에 최적화되어 있습니다.
'Kafka' 카테고리의 다른 글
[kafka] Spring Boot와 Kafka를 활용한 메시지 송수신 및 컨슈머 동작 확인하기 (1) | 2024.08.16 |
---|