728x90
Apache Kafka는 LinkedIn에서 시작되어 현재는 Apache Software Foundation에서 관리하는 분산 스트리밍 플랫폼입니다.
이 글에서는 Kafka의 개념부터 메시지 수신, 처리 실패 시 흐름, 그리고 실무에서 꼭 알아야 할 메시지 처리 구조를 정리합니다.
📨 1. Kafka란?
Kafka는 메시지를 로그처럼 저장하고, 이를 다수의 소비자가 순차적으로 읽어가는 구조의 분산 메시지 시스템입니다.
기존 큐 방식과 달리 메시지를 삭제하지 않고 보존하기 때문에 스트리밍 처리와 재처리에 매우 유리합니다.
✅ 특징 요약
- 고성능, 고가용성, 수평 확장에 특화
- 메시지를 로그 형태로 저장
- 소비자 그룹 기반 병렬 처리
- 토픽(Topic), 파티션(Partition), 오프셋(Offset) 구조
⚙️ 2. 메시지 흐름 구조 (기본 처리 흐름)
▶️ Step 1. 메시지 전송 (Producer → Topic)
- **생산자(Producer)**는 메시지를 특정 Topic으로 전송
- 메시지는 Topic 내의 **파티션(Partition)**에 저장됨
- 저장된 메시지는 삭제되지 않고 설정한 기간만큼 유지됨 (기본 7일, 설정 가능)
[Producer] → send(record) → [Topic:PartitionN (로그 저장)]
▶️ Step 2. 메시지 수신 (Consumer Group → Partition)
- **소비자(Consumer)**는 Topic을 구독하고 메시지를 읽음
- 각 소비자 그룹은 **자신의 오프셋(offset)**을 관리하며 메시지를 순차적으로 처리
- 파티션 수와 소비자 수를 조합하여 병렬 처리 가능
[Consumer] → poll() → [Partition 내 offset 순서로 메시지 수신]
▶️ Step 3. 메시지 처리 완료
- 메시지를 성공적으로 처리한 경우, offset을 commit하여 Kafka에 처리 완료를 알림
- offset을 커밋하지 않으면, 이후에도 같은 메시지를 반복 수신할 수 있음
[Consumer] → commit(offset) → [메시지 처리 완료 표시]
❗ 3. 메시지 처리 실패 시 동작
Kafka는 메시지를 삭제하지 않기 때문에, 처리 실패 시에도 메시지는 파티션에 계속 남아 있습니다.
✅ 실패 처리 흐름
- 메시지 수신 후 처리 실패
- offset을 commit하지 않으면 → 같은 메시지를 다시 읽음
- 재시도는 소비자 코드 또는 프레임워크에서 직접 구현 필요
- 고급 구성에서는 Retry Topic, Dead Letter Topic(DLT) 등을 도입하여 처리
📦 4. Dead Letter Topic(DLT)이란?
Kafka에서는 반복 실패한 메시지를 별도 토픽으로 분리해 저장할 수 있습니다. 이를 **Dead Letter Topic(DLT)**라고 부릅니다.
✅ 예시:
- 처리 실패 → Retry Topic으로 전송 (지연 큐로 동작)
- 지정 횟수 이상 실패 시 → DLT로 이동 → 로그, 알림, 수동 처리
Spring Kafka의 @RetryableTopic, @DltHandler를 활용하면 구현이 쉬워집니다.
🧩 5. 전체 흐름 요약 다이어그램 (텍스트 기반)
[Producer]
↓
send(record)
↓
[Topic: PartitionX (로그 저장)]
↓
[Consumer Group]
↓
poll()
↓
process()
↓
[성공?]
├─ Yes → commitOffset → 다음 메시지 처리
└─ No
↓
offset 유지됨 → 같은 메시지 재수신
↓
지속 실패 시 → Retry Topic → DLT
✅ 실무에서 유용한 Kafka 설정
항목설명
enable.auto.commit | 자동 커밋 여부 (false 권장) |
max.poll.interval.ms | poll 호출 간 최대 허용 시간 |
acks / retries | Producer의 전송 안정성 보장 |
partitions / replication | 병렬 처리 + 내결함성 설정 |
retention.ms | 메시지 로그 보존 기간 (기본 7일) |
✅ 마무리: Kafka는 언제 쓰면 좋을까?
Kafka는 다음과 같은 상황에서 강력한 선택입니다:
- 실시간 로그 수집 및 분석
- 대용량 트래픽의 이벤트 스트리밍 처리
- 마이크로서비스 간 이벤트 기반 통신
- 데이터 파이프라인 구성 (Kafka → Spark/Flink/DB)
728x90
'BackEnd' 카테고리의 다른 글
Kafka + Spring Boot 완전 연동기: Apache Kafka 실패부터 Bitnami Kafka 성공까지 (0) | 2025.06.19 |
---|---|
[MQ]메시지 큐 3개 비교: Amazon SQS vs Apache Kafka vs RabbitMQ (0) | 2025.06.17 |
[MQ] SQS란? (0) | 2025.06.17 |
[Monitoring]Promtail + Loki 설치 및 연결(Docker 기반) (0) | 2025.06.14 |
[Monitoring] Loki와 Promtail이란? (0) | 2025.06.14 |