Apache Kafka란?
Apache Kafka는 LinkedIn에서 개발한 분산 스트리밍 플랫폼으로, 대용량의 실시간 데이터 스트림을 안정적으로 처리하기 위해 설계되었습니다. 현재는 Apache 재단의 오픈소스 프로젝트로 운영되며, Netflix, Uber, Airbnb 등 수많은 글로벌 기업에서 핵심 인프라로 사용하고 있습니다.
Kafka의 핵심 개념
1. 메시징 시스템의 진화
전통적인 메시징 시스템(RabbitMQ, ActiveMQ)과 달리 Kafka는 다음과 같은 특징을 가집니다:
- 높은 처리량: 초당 수백만 건의 메시지 처리 가능
- 확장성: 클러스터에 브로커를 추가하여 수평 확장
- 내구성: 디스크에 메시지를 저장하여 데이터 손실 방지
- 분산 처리: 여러 서버에 데이터를 분산 저장
2. Kafka 아키텍처
Producer (생산자)
데이터를 Kafka에 전송하는 애플리케이션입니다. 메시지를 특정 토픽으로 발행(publish)합니다.
Consumer (소비자)
Kafka로부터 데이터를 읽어오는 애플리케이션입니다. 하나 이상의 토픽을 구독(subscribe)하여 메시지를 처리합니다.
Broker (브로커)
Kafka 서버를 의미합니다. 여러 브로커가 클러스터를 구성하여 높은 가용성을 제공합니다.
Topic (토픽)
메시지를 분류하는 카테고리입니다. 파일 시스템의 폴더와 유사한 개념입니다.
Partition (파티션)
토픽을 여러 파티션으로 나누어 병렬 처리와 확장성을 제공합니다.
Kafka를 사용하는 이유
1. 마이크로서비스 아키텍처(MSA)
MSA 환경에서 서비스 간 비동기 통신을 위한 이상적인 솔루션입니다.
주문 서비스가 Kafka를 통해 재고 서비스, 알림 서비스, 로그 서비스와 통신할 수 있습니다.
2. 실시간 데이터 파이프라인
대용량 데이터를 실시간으로 수집하고 처리할 수 있습니다:
- 로그 수집: 애플리케이션 로그를 중앙화
- 메트릭 수집: 시스템 모니터링 데이터 통합
- 이벤트 소싱: 모든 상태 변경을 이벤트로 기록
3. 스트림 프로세싱
Kafka Streams API를 활용하여 실시간 데이터 처리가 가능합니다:
- 실시간 분석 및 집계
- 데이터 변환 및 필터링
- 윈도우 기반 처리
Kafka 실전 활용 예제
Producer 예제 (Python)
from kafka import KafkaProducer
import json
producer = KafkaProducer(
bootstrap_servers=['localhost:9092'],
value_serializer=lambda v: json.dumps(v).encode('utf-8')
)
data = {
'user_id': 12345,
'action': 'purchase',
'product_id': 'PROD-001',
'amount': 50000
}
producer.send('user-events', value=data)
producer.flush()
Consumer 예제 (Python)
from kafka import KafkaConsumer
import json
consumer = KafkaConsumer(
'user-events',
bootstrap_servers=['localhost:9092'],
value_deserializer=lambda m: json.loads(m.decode('utf-8')),
group_id='event-processor'
)
for message in consumer:
event = message.value
print(f"User {event['user_id']} performed {event['action']}")
Kafka vs 다른 메시징 시스템
RabbitMQ와 비교
Kafka는 매우 높은 처리량을 가지며 디스크에 메시지를 영구 저장합니다. 대용량 스트리밍에 최적화되어 있습니다.
RabbitMQ는 중간 수준의 처리량을 가지며 메모리 기반으로 동작합니다. 복잡한 라우팅에 적합합니다.
AWS SQS와 비교
Kafka는 온프레미스와 클라우드 모두에서 사용 가능하며 높은 커스터마이징이 가능합니다.
SQS는 완전 관리형 서비스로 AWS 생태계에 최적화되어 있습니다.
Kafka 운영 시 고려사항
1. 파티션 설계
파티션 수는 처리량과 직결됩니다. 적절한 파티션 수 선정이 중요합니다.
- 너무 적으면: 처리량 제한
- 너무 많으면: 오버헤드 증가
2. Replication Factor
데이터 안정성을 위해 복제본(replica)을 설정합니다. 일반적으로 3개를 권장합니다.
3. Consumer Group
동일한 그룹의 컨슈머들은 파티션을 나누어 처리하여 병렬 처리를 구현합니다.
4. 메시지 보존 기간
디스크 용량과 비즈니스 요구사항을 고려하여 retention 정책을 설정합니다.
실제 사용 사례
Netflix
매일 수조 개의 이벤트를 Kafka로 처리하여 실시간 추천 시스템과 모니터링을 구현했습니다.
Uber
실시간 위치 추적, 요금 계산, 알림 등 핵심 기능에 Kafka를 활용합니다.
LinkedIn
원래 개발 목적대로 활동 스트림, 메트릭, 로그 집계 등에 사용하고 있습니다.
결론
Apache Kafka는 대용량 실시간 데이터 처리를 위한 강력한 플랫폼입니다. MSA 환경에서의 이벤트 기반 아키텍처, 실시간 데이터 파이프라인, 스트림 프로세싱 등 다양한 시나리오에서 핵심적인 역할을 수행합니다.
초기 학습 곡선이 있지만, 대규모 시스템에서 안정적이고 확장 가능한 메시징 인프라가 필요하다면 Kafka는 최고의 선택이 될 것입니다.
반응형
728x90