본문으로 건너뛰기

Kafka 메시지 전달 보장 (Delivery Semantics)

· 약 6분
Johny Cho
Back End Engineer @ NHN


At-most-once / At-least-once / Exactly-once

분산 시스템과 메시지 큐(Kafka, RabbitMQ 등)를 사용할 때
가장 중요한 설계 포인트 중 하나는 “메시지가 몇 번 전달될 수 있는가” 입니다.

이를 메시지 전달 보장(Delivery Semantics) 이라고 하며, 대표적으로 다음 세 가지가 있습니다.


1. At-most-once (최대 한 번 전달)

개념

메시지는 최대 한 번만 처리되며,
실패 시 메시지가 유실될 수 있다.

  • 중복 ❌
  • 유실 ⭕
  • 재시도 ❌

특징

항목설명
신뢰성낮음
성능매우 높음
구현 난이도매우 낮음
처리 속도최상

메시지를 받자마자 처리 완료로 간주하거나,
처리 전에 offset을 커밋하는 방식에서 발생합니다.
이 경우, 처리 중 장애가 발생하면 이미 커밋된 메시지는 다시 소비되지 않아 메시지 유실이 발생할 수 있습니다.


언제 사용하나?

  • 로그 수집
  • 모니터링 이벤트
  • 트래픽 분석
  • 통계성 데이터 (일부 유실 허용)

“정확성보다 속도가 중요한 경우”


예시

  • 접속 로그
  • 클릭 로그
  • 메트릭 데이터

2. At-least-once (최소 한 번 전달)

개념

메시지는 최소 한 번 이상 처리되며,
실패 시 중복 처리가 발생할 수 있다.

  • 중복 ⭕
  • 유실 ❌
  • 재시도 ⭕

특징

항목설명
신뢰성높음
성능중간
구현 난이도중간
실무 사용 빈도매우 높음

메시지 처리 후 offset을 커밋하기 때문에
실패 시 같은 메시지가 다시 처리될 수 있다.


언제 사용하나?

  • 주문 생성
  • 결제 처리
  • 푸시 발송
  • 비즈니스 이벤트 처리

“유실은 절대 안 되지만, 중복은 애플리케이션에서 처리할 수 있는 경우”


실무 포인트

실무에서는 At-least-once를 기본으로 사용하고,
Consumer 측에서 eventId 기반 멱등 처리
DB 유니크 제약을 통해 중복 처리를 방지하는 방식이 가장 일반적입니다.

즉, 메시징 레벨은 At-least-once로 두고
비즈니스 로직에서 Exactly-once에 가깝게 만드는 전략을 취합니다.


예시

  • 주문 이벤트 처리
  • 포인트 적립
  • 이메일 발송 (중복 방지 로직 포함)

3. Exactly-once (정확히 한 번 전달)

개념

메시지는 중복 없이 정확히 한 번만 처리된다.

  • 중복 ❌
  • 유실 ❌
  • 높은 비용

특징

항목설명
신뢰성최고
성능낮음
구현 난이도높음
운영 복잡도높음

Kafka의 경우 트랜잭션을 통해,
메시지 처리와 offset commit을 하나의 원자적 작업으로 묶습니다.

단, Kafka 내부 범위에서만 Exactly-once가 보장된다.

Kafka의 Exactly-once
Producer → Kafka → Consumer → Kafka(offset commit)
까지의 범위에서만 보장됩니다.

즉, DB나 외부 API까지 포함한
end-to-end Exactly-once는 Kafka 단독으로 보장되지 않으며,
이 경우 Outbox 패턴, Idempotent Consumer 설계 등이 필요합니다.


언제 사용하나?

  • 정확한 집계
  • 스트림 처리
  • 금융/정산 파이프라인
  • Kafka Streams 기반 처리

“중복이 치명적인 경우”


주의사항

  • DB, 외부 API까지 포함한 end-to-end Exactly-once는 매우 어렵다
  • 성능 비용과 운영 복잡도를 반드시 고려해야 한다

4. 한눈에 비교

구분At-most-onceAt-least-onceExactly-once
메시지 유실가능불가능불가능
메시지 중복없음가능없음
성능⭐⭐⭐⭐⭐
구현 난이도낮음중간높음
실무 사용낮음⭐⭐⭐⭐제한적

5. 실무에서의 선택 기준

“Exactly-once를 먼저 쓰지 말고,
At-least-once로 시작해 필요한 곳에만 강화하자.”

추천 전략

  • 기본: At-least-once
  • 로그/모니터링: At-most-once
  • 집계/스트림: Exactly-once (제한적)

마무리

메시지 전달 보장은 단순한 설정 문제가 아니라
비즈니스 특성과 장애 허용 범위에 대한 설계 결정입니다.

  • 유실이 허용되는가?
  • 중복이 치명적인가?
  • 성능과 정확성 중 무엇이 더 중요한가?

이 질문에 답할 수 있다면 적절한 전달 보장을 선택할 수 있습니다.

Loading comments...