아파치 카프카(Apache Kafka)는 대용량의 실시간 데이터 스트리밍을 처리하기 위해 설계된 분산 메시지 브로커 시스템이다. LinkedIn에서 개발되어 Apache Software Foundation의 오픈소스 프로젝트로 발전하였으며, 실시간 데이터 파이프라인 구축, 로그 수집, 이벤트 스트리밍 등 다양한 분야에서 널리 사용되고 있다.
개요
아파치 카프카는 고성능, 확장성, 내결함성을 갖춘 메시징 시스템으로, 대규모 데이터를 실시간으로 게시(publish) 및 구독(subscribe)할 수 있도록 지원한다. 카프카는 분산 환경에서 데이터를 안전하게 저장하고, 빠른 처리 속도로 데이터를 전송하기 위해 설계되었으며, 주로 스트리밍 데이터 처리, 로그 집계, 이벤트 소싱 등에 활용된다.
역사 및 배경
아파치 카프카는 LinkedIn에서 내부 로그 처리 시스템으로 시작되었으며, 그 후 2011년 Apache Software Foundation에 기부되어 오픈소스 프로젝트로 발전하였다.
- 초기 개발: LinkedIn에서 대규모 로그 데이터의 실시간 처리 및 전송을 위해 개발됨.
- Apache 프로젝트: 2011년 Apache Kafka로 공개되어, 다양한 산업 분야로 확산되었다.
- 발전: 이후 안정성과 성능 향상을 위해 다양한 기능(예: 스트리밍 처리, 데이터 복제, 내결함성)이 추가되었으며, 오늘날 실시간 데이터 인프라의 핵심 구성 요소로 자리 잡았다.
아키텍처 및 주요 구성 요소
아파치 카프카의 아키텍처는 분산형 시스템으로 설계되어 있으며, 다음과 같은 주요 구성 요소로 이루어진다.
- Producer
- 데이터를 카프카 토픽(topic)에 게시하는 클라이언트 애플리케이션이다.
- Consumer
- 카프카 토픽으로부터 데이터를 구독하여 처리하는 클라이언트 애플리케이션이다.
- Broker
- 카프카 클러스터의 서버 노드로, 데이터 저장, 복제, 전송 등의 역할을 수행한다.
- Topic
- 메시지가 분류되어 저장되는 논리적 채널이다. 토픽은 여러 파티션(partition)으로 구성되어 데이터 병렬 처리와 확장성을 지원한다.
- Partition
- 토픽 내에서 데이터가 분산 저장되는 단위이며, 각 파티션은 순서가 보장된 메시지 로그를 구성한다.
- Zookeeper
- 카프카 클러스터의 메타데이터 관리, 브로커 간의 조정, 리더 선출 등의 작업을 위해 사용되었으나, 최신 버전에서는 자체적인 클러스터 관리 기능으로 점차 대체되고 있다.
주요 특징
- 고성능 및 확장성
- 수십억 건의 메시지를 초당 처리할 수 있으며, 클러스터를 확장하여 성능을 향상시킬 수 있다.
- 내결함성 및 데이터 복제
- 데이터를 여러 브로커에 복제하여, 하나의 노드 장애 시에도 데이터 손실 없이 시스템을 유지할 수 있다.
- 실시간 스트리밍
- 프로듀서와 컨슈머 간의 빠른 데이터 전송을 지원하여, 실시간 데이터 파이프라인 구축에 적합하다.
- 높은 처리량 및 낮은 지연 시간
- 대규모 분산 환경에서 데이터 처리와 전송을 효율적으로 수행할 수 있다.
- 유연한 데이터 모델
- 메시지의 순서를 보장하면서, 다양한 데이터 포맷과 구조의 데이터를 처리할 수 있다.
예시
아파치 카프카를 활용한 간단한 Producer와 Consumer 예제를 아래에 제시한다.
Python 예제: Producer
from kafka import KafkaProducer
import json
# KafkaProducer 생성: localhost의 Kafka 브로커와 연결
producer = KafkaProducer(
bootstrap_servers='localhost:9092',
value_serializer=lambda v: json.dumps(v).encode('utf-8')
)
# 메시지 전송: 'test_topic' 토픽에 데이터 전송
data = {'event': 'test', 'value': 123}
producer.send('test_topic', value=data)
producer.flush()
Python 예제: Consumer
from kafka import KafkaConsumer
import json
# KafkaConsumer 생성: 'test_topic' 토픽에서 메시지 구독
consumer = KafkaConsumer(
'test_topic',
bootstrap_servers='localhost:9092',
auto_offset_reset='earliest',
value_deserializer=lambda m: json.loads(m.decode('utf-8'))
)
# 메시지 읽기
for message in consumer:
print(message.value)
이 예제는 kafka-python 라이브러리를 사용하여 간단한 메시지 전송과 소비 과정을 보여준다. 실제 환경에서는 보다 복잡한 오류 처리와 보안 설정이 필요하다.
같이 보기
참고 문헌
- Kreps, J., Narkhede, N., & Rao, J. (2011). Kafka: A Distributed Messaging System for Log Processing. In Proceedings of the NetDB.
- Apache Kafka 공식 문서, https://kafka.apache.org/documentation/
- Neha Narkhede, Gwen Shapira, Todd Palino, "Kafka: The Definitive Guide", O'Reilly Media.