Redis와 Kafka를 활용한 대규모 트래픽 처리 시스템 설계하기
Consumer Group 알아보기
Consumer Group 알아보기
- Consumer Group 알아보기
Kafka Consumer Group 알아보기
Kafka를 처음 접하면 Producer, Topic, Consumer 정도는 쉽게 이해할 수 있다.
하지만 Kafka가 대규모 트래픽을 처리할 수 있는 진짜 이유는 Consumer Group이라는 개념에 있다.
Consumer Group은 여러 Consumer가 협력하여 메시지를 처리할 수 있도록 만들어진 Kafka의 핵심 기능이다. 이를 통해 Kafka는 높은 처리량과 확장성을 제공할 수 있다.
Consumer Group이란?
Consumer Group은 여러 Consumer를 하나의 그룹으로 묶어 메시지를 처리하는 단위이다.
Kafka는 Consumer를 개별적으로 관리하지 않고 Group 단위로 관리한다.
예를 들어 다음과 같은 구조를 생각해볼 수 있다.
flowchart LR
Topic["test-topic"]
C1["Consumer-1"]
C2["Consumer-2"]
C3["Consumer-3"]
Topic --> C1
Topic --> C2
Topic --> C3
이 Consumer들이 모두 같은 Group ID를 사용한다면 Kafka는 하나의 Consumer Group으로 인식한다.
group-id = order-group
Consumer Group이 필요한 이유
Consumer가 하나만 존재한다면 모든 메시지를 혼자 처리해야 한다.
flowchart LR
Topic --> Consumer
메시지가 적다면 문제가 없지만,
- 주문 이벤트
- 결제 이벤트
- 로그 이벤트
- 알림 이벤트
처럼 초당 수천 건 이상의 메시지가 발생한다면 하나의 Consumer로는 감당하기 어렵다.
그래서 Kafka는 여러 Consumer가 협력해서 처리할 수 있도록 Consumer Group을 제공한다.
Consumer Group의 핵심 특징
Consumer Group은 다음과 같은 특징을 가진다.
병렬 처리
Consumer Group 내 Consumer들은 Topic의 Partition을 나누어 처리한다.
flowchart LR
P0["Partition 0"]
P1["Partition 1"]
P2["Partition 2"]
C1["Consumer 1"]
C2["Consumer 2"]
C3["Consumer 3"]
P0 --> C1
P1 --> C2
P2 --> C3
각 Consumer는 서로 다른 Partition을 담당하므로 병렬 처리가 가능하다.
Group ID 기반 관리
Consumer Group은 고유한 Group ID를 가진다.
order-group
payment-group
notification-group
Kafka는 Group ID를 기준으로 Consumer들의 상태와 Offset을 관리한다.
메시지 중복 방지
같은 Group 내에서는 하나의 메시지를 하나의 Consumer만 처리한다.
flowchart LR
Message --> Consumer1
Consumer2
Consumer3
즉,
하나의 메시지
→ 하나의 Consumer
원칙으로 동작한다.
Partition과 Consumer Group의 관계
Kafka는 Partition 단위로 메시지를 분배한다.
예를 들어 Topic이 다음과 같이 구성되어 있다고 가정해보자.
flowchart LR
Topic
P0["Partition 0"]
P1["Partition 1"]
P2["Partition 2"]
Topic --> P0
Topic --> P1
Topic --> P2
Consumer가 3개라면:
flowchart LR
P0 --> C1["Consumer1"]
P1 --> C2["Consumer2"]
P2 --> C3["Consumer3"]
각 Consumer가 하나씩 담당하게 된다.
Consumer 수가 적은 경우
Partition 3개
Consumer 2개
flowchart LR
P0 --> C1["Consumer1"]
P1 --> C2["Consumer2"]
P2 --> C2
Consumer2는 두 개의 Partition을 처리하게 된다.
Consumer 수가 많은 경우
Partition 3개
Consumer 5개
flowchart LR
P0 --> C1
P1 --> C2
P2 --> C3
C4["Idle"]
C5["Idle"]
Partition보다 Consumer가 많으면 일부 Consumer는 아무 일도 하지 못한다.
Consumer Group의 동작 방식
Kafka는 Partition을 Consumer에게 자동으로 할당한다.
대표적인 할당 전략은 다음과 같다.
Range Assignor
Partition 범위를 나누어 할당
Consumer1 → P0, P1
Consumer2 → P2, P3
Round Robin Assignor
순서대로 균등 분배
Consumer1 → P0, P2
Consumer2 → P1, P3
Cooperative Sticky Assignor
최대한 기존 할당을 유지하면서 재분배
최근 Kafka에서 많이 사용되는 방식이다.
Rebalancing이란?
Consumer Group에서 가장 중요한 개념 중 하나가 Rebalancing이다.
다음 상황이 발생하면 Rebalancing이 수행된다.
- Consumer 추가
- Consumer 제거
- Consumer 장애
- Partition 변경
예를 들어:
flowchart LR
P0 --> C1
P1 --> C2
C3["새로운 Consumer"]
새 Consumer가 추가되면 Kafka는 Partition을 다시 분배한다.
Rebalancing 과정
sequenceDiagram
participant Kafka
participant C1
participant C2
participant C3
C3->>Kafka: Group Join
Kafka->>C1: Partition Revoke
Kafka->>C2: Partition Revoke
Kafka->>C1: Reassign
Kafka->>C2: Reassign
Kafka->>C3: Assign
Rebalancing 중에는 잠시 메시지 처리가 멈출 수 있다.
그래서 실무에서는 Rebalancing을 최소화하는 것이 중요하다.
Offset이란?
Kafka는 메시지의 순서를 Offset으로 관리한다.
Offset 0
Offset 1
Offset 2
Offset 3
Offset 4
Consumer는 자신이 어디까지 읽었는지 Offset을 저장한다.
Offset 저장 위치
Kafka는 Consumer Offset을 내부 Topic에 저장한다.
__consumer_offsets
Kafka Cluster가 Consumer Group의 읽기 위치를 기억할 수 있는 이유가 바로 이 Topic 때문이다.
Offset Commit 방식
Auto Commit
enable.auto.commit=true
주기적으로 자동 저장
장점
- 사용이 간단
단점
- 메시지 유실 가능
Manual Commit
consumer.commitSync();
개발자가 직접 Commit
장점
- 안정성 높음
단점
- 구현 복잡도 증가
실무에서는 중요한 데이터 처리 시 Manual Commit을 사용하는 경우가 많다.
Consumer Group 데이터 처리 모델
단일 Consumer Group
하나의 Group이 Topic을 처리한다.
flowchart LR
Topic --> GroupA
GroupA --> C1
GroupA --> C2
메시지는 그룹 내에서 한 번만 처리된다.
다중 Consumer Group
여러 Group이 같은 Topic을 구독한다.
flowchart LR
Topic
GroupA
GroupB
GroupC
Topic --> GroupA
Topic --> GroupB
Topic --> GroupC
각 Group은 독립적으로 메시지를 읽는다.
즉 동일 메시지가 여러 Group에 전달될 수 있다.
Consumer Group 활용 사례
로그 분석 시스템
log-topic
- Group A → 실시간 모니터링
- Group B → 통계 분석
- Group C → 장기 저장
주문 처리 시스템
order-topic
- 주문 저장
- 결제 처리
- 알림 전송
각 작업을 별도 Consumer Group이 담당할 수 있다.
Consumer Group 장점
확장성
Consumer 수를 늘려 병렬 처리 가능
유연성
Group 단위로 비즈니스 로직 분리 가능
중복 방지
같은 Group에서는 동일 메시지가 한 번만 처리됨
장애 대응
Consumer 장애 시 다른 Consumer가 Partition을 인계받음
Consumer Group 단점
Rebalancing 비용
Consumer 추가·삭제 시 처리 지연 발생
Partition 수 제한
Consumer 수는 Partition 수 이상으로 확장할 수 없음
Offset 관리 필요
Manual Commit 사용 시 관리 복잡도 증가
정리
Consumer Group은 Kafka의 병렬 처리와 확장성을 가능하게 만드는 핵심 기능이다.
Kafka는 Partition 단위로 메시지를 분배하며, 같은 Group 안에서는 메시지가 한 번만 처리된다.
또한 여러 Consumer Group이 동일 Topic을 구독할 수 있기 때문에 하나의 이벤트를 여러 비즈니스 영역에서 독립적으로 활용할 수 있다.
한 줄 요약
Consumer Group은 여러 Consumer가 협력하여 Topic의 Partition을 분산 처리하도록 만드는 Kafka의 핵심 기능이며, Kafka의 확장성과 병렬 처리 능력의 중심에 있는 개념이다.