Apache Kafka 기반 비동기 아키텍처 개요
Kafka는 분산 스트리밍 플랫폼으로, 높은 처리량과 낮은 지연 시간을 제공하는 이벤트 스트리밍 시스템입니다. 실시간 데이터 파이프라인과 스트리밍 애플리케이션 구축에 특화되어 있습니다.
핵심 구성 요소
1. Kafka Cluster 구조
**브로커(Broker)**는 Kafka 서버 인스턴스로, 메시지를 저장하고 클라이언트 요청을 처리합니다. 일반적으로 3개 이상의 브로커로 클러스터를 구성하여 고가용성을 확보합니다.
**토픽(Topic)**은 메시지를 분류하는 논리적 단위입니다. 예를 들어 user-events, order-processing, notification-requests 등으로 구분합니다.
**파티션(Partition)**은 토픽을 물리적으로 분할한 단위로, 병렬 처리와 확장성을 제공합니다. 파티션 수가 많을수록 더 많은 컨슈머가 동시에 처리할 수 있습니다.
2. ZooKeeper/KRaft
ZooKeeper는 클러스터 메타데이터 관리와 리더 선출을 담당합니다. Kafka 2.8 이후부터는 KRaft 모드로 ZooKeeper 의존성을 제거할 수 있습니다.
비동기 처리 패턴
1. Event Sourcing Pattern
User Action → Event Producer → Kafka Topic → Event Consumer → Business Logic
모든 상태 변경을 이벤트로 기록하여 시스템 상태를 재구성할 수 있습니다. 주문 생성, 결제 처리, 배송 시작 등 각 단계를 이벤트로 관리합니다.
2. CQRS (Command Query Responsibility Segregation)
명령(Command)과 조회(Query)를 분리하여, 쓰기 작업은 Kafka를 통해 비동기로 처리하고, 읽기 작업은 최적화된 별도 저장소에서 처리합니다.
3. Saga Pattern
분산 트랜잭션을 여러 개의 로컬 트랜잭션으로 분해하여 Kafka를 통해 조정합니다. 각 서비스는 자신의 작업을 완료한 후 다음 단계의 이벤트를 발행합니다.
Producer 설계 고려사항
1. 메시지 전송 보장
acks 설정을 통해 메시지 전송 신뢰성을 조절합니다. acks=all로 설정하면 모든 복제본이 메시지를 받을 때까지 대기하여 최고 수준의 내구성을 보장합니다.
배치 처리를 통해 성능을 최적화합니다. batch.size와 linger.ms 설정으로 배치 크기와 대기 시간을 조절합니다.
2. 파티셔닝 전략
메시지 키를 기반으로 파티션을 결정하여 관련된 이벤트들이 순서대로 처리되도록 합니다. 예를 들어 사용자 ID를 키로 사용하면 동일 사용자의 이벤트가 같은 파티션에서 순차 처리됩니다.
Consumer 설계 고려사항
1. Consumer Group
여러 컨슈머가 하나의 그룹을 형성하여 토픽의 파티션을 분산 처리합니다. 컨슈머가 추가되면 파티션이 재분배되어 자동으로 부하가 분산됩니다.
2. 오프셋 관리
자동 커밋과 수동 커밋 중 선택할 수 있습니다. 중요한 비즈니스 로직의 경우 수동 커밋을 사용하여 처리 완료 후에만 오프셋을 커밋합니다.
3. 재시도 및 에러 처리
처리 실패 시 재시도 토픽으로 메시지를 전송하거나, Dead Letter Topic으로 격리하여 별도 처리합니다.
Kafka Streams를 활용한 스트림 처리
1. 실시간 데이터 변환
입력 스트림을 실시간으로 변환하여 다른 토픽으로 출력합니다. 예를 들어 원시 이벤트를 집계하여 통계 정보를 생성합니다.
2. 윈도우 연산
시간 기반 윈도우를 사용하여 특정 시간 구간의 데이터를 집계합니다. 1분간의 주문 수량, 5분간의 평균 응답 시간 등을 계산할 수 있습니다.
모니터링 및 운영
1. 주요 메트릭
- 처리량: 초당 메시지 수 (messages/sec)
- 지연 시간: 프로듀서에서 컨슈머까지의 end-to-end latency
- 컨슈머 랙: 아직 처리하지 못한 메시지 수
- 파티션 분산: 각 파티션별 부하 분산 상태
2. 모니터링 도구
JMX 메트릭을 활용하여 Prometheus + Grafana로 대시보드를 구성하거나, Confluent Control Center, Kafka Manager 등 전용 도구를 사용합니다.
확장성 및 성능 최적화
1. 수평적 확장
브로커 추가를 통한 클러스터 확장과 파티션 증가를 통한 병렬 처리 향상이 가능합니다. 컨슈머 인스턴스를 늘려 처리 능력을 향상시킬 수 있습니다.
2. 성능 튜닝
- 압축 설정: gzip, snappy, lz4 등을 사용하여 네트워크 대역폭 절약
- 복제 팩터: 내구성과 성능의 균형점 찾기 (일반적으로 3)
- 배치 크기 최적화: 지연 시간과 처리량 사이의 트레이드오프 조절
이러한 Kafka 기반 아키텍처를 통해 대용량 실시간 데이터 처리가 가능하며, 마이크로서비스 간 느슨한 결합과 높은 확장성을 달성할 수 있습니다.
'아키텍처(Airchitecture)' 카테고리의 다른 글
| API 특징 (0) | 2025.09.02 |
|---|---|
| 온라인쇼핑몰 - 주문처리 프로세스 (0) | 2025.08.29 |
| RAG (Retrieval-Augmented Generation) (1) | 2025.08.28 |
| RAG MCP (0) | 2025.08.28 |
| GOF Design Pattern - 디자인패턴23가지 (2) | 2025.08.28 |