분산 메시지 큐(Distributed Message Queue)는 서비스 간 비동기 메시지 전달을 담당하는 내결함성 통신 미들웨어다. Apache Kafka 내부 설계를 중심으로 고처리량 메시지 큐의 핵심 원리를 다룬다.
핵심 요구사항
기능:
- 메시지 발행(Produce) / 구독(Consume)
- 소비자 그룹(Consumer Group)
- 메시지 순서 보장 (파티션 내)
- 최소 한 번(at-least-once) 전달
규모 (Kafka 수준):
- 초당 수백만 메시지 처리
- 수 TB 메시지 보관 (며칠~몇 주)
- 수평 확장 지원
아키텍처
Producer → [Broker Cluster] → Consumer Group
↕
ZooKeeper/KRaft (메타데이터, 리더 선출)
Topic: 논리적 채널
Partition: Topic의 물리적 분할 (병렬성 단위)
Offset: 파티션 내 메시지 위치 (순차 번호)
Segment: Partition의 실제 파일 단위
고처리량 달성 기법
1. 순차 디스크 I/O: 랜덤보다 10~100배 빠름
Append-only log: 항상 파일 끝에 추가
2. 제로 카피 (Zero-Copy):
일반: 디스크→커널 버퍼→유저 버퍼→소켓 버퍼
Zero-copy: 디스크→커널 버퍼→소켓 (sendfile 시스템콜)
3. 배치 처리: 여러 메시지를 묶어 한 번에 압축·전송
압축: GZIP/Snappy/LZ4
4. 파티션 병렬 처리: 소비자 수 = 파티션 수로 최적화
메시지 순서와 파티셔닝
python
producer.send(
topic='orders',
key=b'user_123', # 동일 키 → 동일 파티션 → 순서 보장
value=order_bytes
)
# 파티션 선택: hash(key) % num_partitions
# key 없으면 라운드로빈
소비자 그룹
Topic: [P0] [P1] [P2] [P3]
Group A (4 consumers): 각 파티션 1:1 할당
C1→P0, C2→P1, C3→P2, C4→P3
Group B (2 consumers): 파티션 분배
C1→P0,P1, C2→P2,P3
Rebalancing: 소비자 추가/제거 시 재분배
Eager: 일시 중단 후 재할당
Incremental Cooperative: 점진적 재할당 (다운타임 없음)
메시지 전달 보장
| 설정 | 보장 | 성능 |
|---|
| acks=0 | 보장 없음 (Fire & Forget) | 최고 |
| acks=1 | 리더 수신 확인 | 높음 |
| acks=all | 모든 ISR 수신 확인 | 낮음 |
| idempotent + acks=all | Exactly-Once | 가장 낮음 |
관련 문서
- •[kafka|Apache [Kafka]]
- •[[event-driven-architecture|이벤트 주도 아키텍처]]
- •[[distributed-job-scheduler|분산 작업 스케줄러]]