BackEnd

[MQ] Kafka란?

Raconer 2025. 6. 17. 19:21
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는 메시지를 삭제하지 않기 때문에, 처리 실패 시에도 메시지는 파티션에 계속 남아 있습니다.

✅ 실패 처리 흐름

  1. 메시지 수신 후 처리 실패
  2. offset을 commit하지 않으면 → 같은 메시지를 다시 읽음
  3. 재시도는 소비자 코드 또는 프레임워크에서 직접 구현 필요
  4. 고급 구성에서는 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