본문 바로가기
🔥 Data Engineer/Kafka

[Kafka] - 카프카 컨슈머 그룹(Kafka Consumer Group)

by jyu_seo_ 2026. 1. 25.

 

Apache Kafka를 활용한 분산 메세징 시스템에서 컨슈머 그룹(Consumer Group)은 효율적이고 안정적인 메세지 처리를 위한 핵심 개념이다. 이 글에서는 컨슈머 그룹의 개념과 동작 원리, 그리고 실무에서 알아야 할 중요한 특징들을 살펴보겠다.

컨슈머 그룹의 정의

1. 파티션 소유권 공유

컨슈머 그룹 내의 컨슈머들은 토픽의 파티션(Partition)에 대한 소유권을 나눠서 가진다. 이는 병렬 처리와 부하 분산을 가능하게 하는 핵심 매커니즘이다.

  • 하나의 파티션은 컨슈머 그룹 내에서 오직 하나의 컨슈머에만 할당된다.
  • 하나의 컨슈머는 여러개의 파티션을 담당할 수 있다.
  • 파티션 수보다 컨슈머 수가 많으면, 일부 컨슈머는 유후 상태가 된다.

2. 메세지 중복 방지

동일한 컨슈머 그룹 내에서 각 메세지는 단 한번만 처리 된다. 레코드(Record)는 컨슈머 그룹 내의 오직 하나의 컨슈머로만 전달되므로, 메세지 중복 처리를 방지할 수 있다.

 

내결함성(Fault Tolerance)

컨슈머 그룹의 가장 강력한 장점 중 하나는 장애 대응 능력이다. 특정 컨슈머에 문제가 발생하면 다음과 같다.

  • 동일 그룹 내의 다른 컨슈머가 자동으로 해당 파티션을 인계 받는다.
  • 이 과정을 리밸런싱(Rebalancing)이라고 한다.
  • 서비스 중단 없이 지속적인 메세지 처리가 가능하다.

리밸런싱(Rebalancing)

리밸런싱은 컨슈머 그룹 내에서 파티션 소유권을 재분배하는 프로세스이다. 다음과 같은 경우에 발생한다.

  • 새로운 컨슈머가 그룹에 추가 될 때
  • 기존 컨슈머가 종료되거나 장애가 발생했을 때
  • 토픽의 파티션 수가 변경되었을 때

리밸런싱 동안에는 일시적으로 메세지 처리가 중단될 수 있으므로, 최소화 하는것이 중요하다.

 

컨슈머와 파티션의 관계

이상적인 구성

토픽 : 파티션 4개
컨슈머 그룹: 컨슈머 4개
→ 각 컨슈머가 1개의 파티션씩 담당 (최적 분산)

컨슈머가 적은 경우

토픽 : 파티션 4개
컨슈머 그룹: 컨슈머 2개
→ 각 컨슈머가 2개의 파티션씩 담당

 

컨슈머가 많은 경우

토픽 : 파티션 4개
컨슈머 그룹: 컨슈머 6개
→ 4개의 컨슈머만 활성화,2개는 유후 상태

 

Offset 관리

카프카의 컨슈머 그룹은 각 파티션에서 어디까지 메세지를 읽었는지를 Offset으로 관리한다.

  • Offset은 컨슈머 그룹별로 독립적으로 관리된다.
  • 카프카의 내부 토픽(__consumer_offsets)에 저장된다.
  • 컨슈머 장애 후 복구 시, 마지막 처리 위치부터 재개할 수 있다.
  • 동일 토픽을 구독하는 다른 컨슈머 그룹은 독립적인 Offset을 유지한다.

실무 활용 시나리오

시나리오 1: 스케일 아웃

트래픽이 증가하면 컨슈머를 추가하여 처리 용량을 확장할 수 있다.

# 초기상태
Consumer Group A: Consumer 1, Consumer 2 (파티션 4개 처리)

# 트래픽 증가 후
Consumer Group A: Consumer 1, Consumer 2, Consumer 3, Consumer 4
→ 처리 속도 2배 향상

 

시나리오 2: 멀티 애플리케이션

동일한 토픽을 여러 목적으로 사용하는 경우

# 주문 토픽을 여러 서비스가 구독
- Consumer Group "payment-service": 결제 처리
- Consumer Group "notification-service": 알림 발송
- Consumer Group "analytics-service": 데이터 분석

→ 각 그룹이 독립적으로 모든 메시지 처리

 

컨슈머 그룹 설정 예시

Java 설정

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-consumer-group");  // 컨슈머 그룹 ID
props.put("enable.auto.commit", "true");
props.put("auto.commit.interval.ms", "1000");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("my-topic"));

 

주요 설정 파라미터

  • group.id : 컨슈머 그룹의 고유 식별자
  • enable.auto.commit: Offset 자동 커밋 여부
  • auto.offset.reset: 초기 Offset 설정 (earliest, latest, none)
  • max.poll.records : 한번의 poll()에서 가져올 최대 레코드 수

정리

카프카 컨슈머 그룹은 다음과 같은 핵심 가치를 제공한다.

 

 병렬 처리: 여러 컨슈머가 파티션을 나눠서 처리
 확장성: 컨슈머 추가를 통한 손쉬운 스케일 아웃
 내결함성: 컨슈머 장애 시 자동 복구
 메시지 순서 보장: 파티션 내에서 순서 보장
 Offset 관리: 정확한 처리 위치 추적

 

카프카를 활용한 분산 시스템을 설계할 때, 컨슈머 그룹의 특성을 잘 이해하고 활용한다면 안정적이고 확장 가능한 아키텍처를 구축할 수 있다.