Kafka Message Queue Event Stream
3줄 요약
Kafka Message Queue Event Stream 챕터는 Kafka를 단순 메시지 큐가 아니라 보관되는 event log로 보고, topic, partition, consumer group, offset을 처리 보장 관점에서 설계한다.
- 핵심은 producer key, partition 순서, consumer group 병렬성, offset commit, retry/DLQ, idempotent consumer가 한 흐름으로 맞물리는지 판단하는 것이다.
- Java/Spring 백엔드 개발자는 DB commit, Kafka publish, listener 처리, ack, 재처리 로그를 연결해 데이터 지연, 중복, 누락을 설명할 수 있어야 한다.
핵심 정리
Message Queue와 Event Stream 차이: queue는 작업을 나눠 처리하는 모델에 가깝고 stream은 보관되는 이벤트 로그에 가깝다. replay, retention, 여러 consumer group이 선택 기준이다.
Kafka Topic Partition Consumer Group: topic은 이벤트 종류, partition은 순서와 병렬성 단위, consumer group은 같은 목적의 소비자 묶음이다. partition key가 처리 순서와 skew를 만든다.
Ordering Offset Commit: Kafka의 순서는 partition 내부에서만 보장된다. offset commit은 처리 완료 선언이므로 DB 반영과 ack 순서가 장애 결과를 바꾼다.
Retry DLQ 중복 처리: retry는 일시 오류를 흡수하고 DLQ는 독성 메시지를 격리한다. 둘 다 consumer 멱등성과 재처리 절차 없이 신뢰성을 만들지 못한다.
Spring Kafka Producer Consumer: KafkaTemplate과 @KafkaListener는 입구일 뿐이다. key 선택, manual ack, error handler, DLT, 테스트가 운영 품질을 좌우한다.
- 이 챕터는 Web-Database의 단일 transaction/query 튜닝이 아니라, commit 이후 이벤트가 여러 소비자에게 늦거나 다시 도착하는 상황을 다룬다.
헷갈리는 지점
- Kafka를 큐처럼만 보면 replay와 여러 consumer group의 의미를 놓친다.
- queue는 보통 작업을 한 소비자가 가져가 처리하는 모델이고, Kafka stream은 offset을 가진 소비자 묶음마다 같은 로그를 독립적으로 읽는다.
- 그래서 결제 처리 consumer와 추천 집계 consumer는 같은 topic을 다른 group으로 읽을 수 있다.
- “Kafka는 순서를 보장한다”는 말은 절반만 맞다.
- 순서는 partition 안에서만 보장되며, topic 전체 순서를 원하면 병렬성을 거의 포기해야 한다.
- 주문별 순서가 필요하면
orderId, 사용자별 순서가 필요하면 userId처럼 순서 기준을 key로 선택해야 한다.
- offset commit을 business commit과 같은 것으로 오해하기 쉽다.
- DB 저장 전에 offset을 commit하면 누락이 생길 수 있고, DB 저장 후 commit 전에 죽으면 중복이 생길 수 있다.
- 실무 설계는 중복을 받아들이고 idempotent consumer와 dedup key로 피해를 줄인다.
확인 질문
- 이 챕터의 핵심 판단 기준은 무엇인가?
- 어떤 event key로 partition 순서를 만들고, 어느 consumer group이 어떤 SLA로 읽으며, 실패 시 어느 offset과 business key부터 다시 처리할 수 있는지다.
- Web-Database와의 경계는 무엇인가?
- Web-Database는 DB 내부 transaction과 query의 즉시 정합성을 다루고, 이 챕터는 DB commit 이후 이벤트 전달, replay, lag, consumer 멱등성을 다룬다.
- 개인 프로젝트에서 최소로 챙길 것은 무엇인가?
- topic/key 명세, consumer 처리 이력 테이블, manual ack 위치, retry/DLQ 로그, 같은 메시지 재전달 테스트다.