핵심 인사이트 (3줄 요약)
- 본질: Kafka에서 오프셋(Offset)은 파티션 내 메시지의 순서 번호이고, 컨슈머 그룹(Consumer Group)은 하나의 토픽을 병렬로 소비하는 컨슈머 집합으로 파티션이 그룹 내 컨슈머에 1:1로 할당된다.
- 가치: 오프셋 기반 소비는 "메시지가 한 번 전달되면 삭제되는" 전통 MQ와 달리, 컨슈머가 자신의 소비 위치를 독립적으로 관리하므로 다른 컨슈머 그룹이 같은 메시지를 독립적으로 재소비할 수 있다. 이것이 Pub/Sub 멀티 컨슈머 패턴을 가능하게 한다.
- 판단 포인트: 오프셋 커밋(Commit)의 세 가지 의미 보장: ①At-Most-Once(최대 1회): 처리 전 커밋 → 실패 시 손실, ②At-Least-Once(최소 1회): 처리 후 커밋 → 실패 시 재처리(중복 가능), ③Exactly-Once(정확히 1회): 트랜잭션 + idempotent 프로듀서. 대부분의 실무는 At-Least-Once + 멱등 처리로 구현한다.
Ⅰ. 개요 및 필요성
┌────────────────────────────────────────────────────────┐
│ Kafka 오프셋 & 컨슈머 그룹 구조 │
├────────────────────────────────────────────────────────┤
│ │
│ 파티션 0: [msg0:off=0] [msg1:off=1] [msg2:off=2] ... │
│ ↑ │
│ Consumer A가 off=2까지 읽음 │
│ (Committed Offset = 3) │
│ │
│ Consumer Group-1: Consumer A(P0), Consumer B(P1) │
│ Consumer Group-2: Consumer X(P0), Consumer Y(P1) │
│ │
│ 두 그룹은 서로 독립 — 같은 메시지를 별도 오프셋으로 소비 │
└────────────────────────────────────────────────────────┘
- 📢 섹션 요약 비유: Kafka 오프셋은 책의 페이지 북마크다. 독자(컨슈머)마다 자신의 북마크를 독립적으로 관리하여 같은 책(토픽)을 다른 속도로 읽을 수 있다.
Ⅱ. 아키텍처 및 핵심 원리
컨슈머 그룹 파티션 할당 규칙
파티션 수 = 3, 컨슈머 수 = 2:
Consumer A → Partition 0, 1 (2개 담당)
Consumer B → Partition 2 (1개 담당)
파티션 수 = 2, 컨슈머 수 = 3:
Consumer A → Partition 0
Consumer B → Partition 1
Consumer C → (유휴 — 담당 파티션 없음)
규칙: 컨슈머 수 > 파티션 수 → 일부 컨슈머 유휴
오프셋 커밋 전략
| 전략 | 특징 | 위험 |
|---|---|---|
| Auto Commit | enable.auto.commit=true | 처리 전 커밋 → 손실 가능 |
| Manual Sync | commitSync() | 처리 후 커밋, 성능 저하 |
| Manual Async | commitAsync() | 비동기, 순서 보장 필요 |
- 📢 섹션 요약 비유: 컨슈머 그룹 파티션 할당은 바리스타 배치다. 커피 머신(파티션) 3대에 바리스타(컨슈머) 2명이면 한 명이 2대를 담당한다. 바리스타가 4명이면 1명은 할 일이 없다.
Ⅲ. 비교 및 연결
| 비교 | Kafka 오프셋 | RabbitMQ ACK | 전통 MQ |
|---|---|---|---|
| 소비 기록 | 컨슈머 측 오프셋 | 브로커 ACK | 브로커 메시지 삭제 |
| 재처리 | 오프셋 리셋 | 재전송 요청 | 불가 |
| 멀티 소비 | 그룹별 독립 오프셋 | 큐 방식 1회 | 불가 |
- 📢 섹션 요약 비유: Kafka 오프셋은 스트리밍 서비스 시청 기록이다. Netflix가 내 시청 위치를 기억해서 어디서든 이어보기가 가능하다. 전통 TV(전통 MQ)는 방송이 지나가면 다시 볼 수 없다.
Ⅳ. 실무 적용 및 기술사 판단
Consumer Lag 모니터링
- Consumer Lag = Latest Offset - Committed Offset.
- Lag이 증가 → 컨슈머 처리 속도 < 프로듀서 생산 속도.
- 대응: 컨슈머 인스턴스 수 증가 or 파티션 수 증가.
Kafka Rebalancing
-
컨슈머 추가·제거 시 파티션 재할당 발생 → 짧은 소비 중단(Rebalance).
-
최소화 방법: Sticky Assignor, Static Membership.
-
📢 섹션 요약 비유: Consumer Lag은 콜센터 대기열이다. 상담 전화(메시지)가 처리 속도보다 빠르게 쌓이면 대기 줄(Lag)이 길어진다. 상담원(컨슈머)을 더 추가하면 해소된다.
Ⅴ. 기대효과 및 결론
| 기대효과 | 내용 |
|---|---|
| 독립 소비 | 다수 컨슈머 그룹이 같은 토픽 독립 소비 |
| 재처리 가능 | 오프셋 리셋으로 과거 메시지 재소비 |
| 수평 확장 | 파티션 수에 비례한 컨슈머 병렬 확장 |
Kafka 3.x에서 도입된 KRaft 모드는 ZooKeeper 없이 Kafka 자체가 메타데이터·오프셋을 관리하며, 컨슈머 그룹 재조정 알고리즘이 더 효율적으로 개선되었다.
- 📢 섹션 요약 비유: KRaft는 도시 교통 관제 시스템이 외부 컨트롤 타워(ZooKeeper) 없이 자체 AI로 신호를 제어하는 것이다. 더 빠르고 안정적으로 컨슈머 그룹을 관리한다.
📌 관련 개념 맵
| 개념 | 연결 포인트 |
|---|---|
| 파티션 | 오프셋이 관리되는 단위 로그 |
| Consumer Lag | Committed Offset 대비 최신 오프셋 차이 |
| Rebalancing | 컨슈머 추가·제거 시 파티션 재할당 |
| Exactly-Once | 트랜잭션+멱등 프로듀서의 의미 보장 |
| KRaft | ZooKeeper 없는 자체 메타데이터 관리 |
📈 관련 키워드 및 발전 흐름도
[전통 MQ — 소비 후 메시지 삭제, 재처리 불가]
│
▼
[Kafka 오프셋 — 컨슈머별 독립 소비 위치 관리]
│
▼
[컨슈머 그룹 — 파티션 병렬 소비 + 독립 재처리]
│
▼
[Exactly-Once 의미론 — 트랜잭션 기반 중복 방지]
│
▼
[KRaft — ZooKeeper 없는 Kafka 자체 완결 관리]
👶 어린이를 위한 3줄 비유 설명
- Kafka 오프셋은 책 북마크예요! 여러 독자(컨슈머 그룹)가 같은 책(토픽)을 각자 북마크를 꽂아서 독립적으로 읽어요.
- 컨슈머 그룹은 바리스타 팀이에요 — 커피 머신(파티션) 개수만큼 바리스타를 배정해서 빠르게 주문(메시지)을 처리해요!
- 처리 속도가 느리면 대기 줄(Consumer Lag)이 길어지니 바리스타(컨슈머)를 더 추가해야 해요!