Kafka Consumer

2024. 11. 27. 22:20DATA/Kafka

반응형

Kafka Consumer(카프카 컨슈머)는 Kafka Topic에 저장된 데이터를 읽어오는 역할을 하는 애플리케이션 또는 프로세스이다.


1. Kafka Consumer의 역할

  • Read/Subscribe:
    • Kafka 컨슈머는 토픽(Topic)에 저장된 데이터를 읽어오는 행위를 수행한다.
    • Kafka의 Publish-Subscribe 모델에서 Subscriber(구독자) 역할을 한다.
  • 데이터 소비:
    • 데이터가 Kafka에 기록(Publish)되면, 컨슈머는 이를 읽어 애플리케이션 또는 시스템으로 전달한다.
    • 데이터는 실시간 스트리밍이나 배치(batch) 처리에 활용된다.

2. Kafka Consumer의 데이터 흐름

Kafka 컨슈머는 다양한 데이터 소스와 대상 시스템을 연결하며, 아래의 흐름으로 동작한다.

데이터 소스와 통합:

  • 데이터베이스:
    • MySQL, Oracle 등에서 변경 데이터를 수집해 Kafka로 전달.
    • 예: CDC(Change Data Capture) 도구를 사용하여 DB 이벤트를 Kafka로 전달.
  • 애플리케이션:
    • 애플리케이션(App1, App2)이 직접 데이터를 Kafka에 기록(Publish).

Kafka에서 데이터 소비:

  • Kafka 컨슈머가 토픽을 구독(Subscribe)하여 데이터를 읽다.
  • 데이터를 읽는 방식은 실시간 스트리밍 또는 지연 허용 배치 처리로 나뉜다.

데이터 활용:

  • 분석 및 저장:
    • 데이터를 Hadoop, Data Warehouse(DW), 또는 Search Engine(예: Elasticsearch)으로 전달.
  • 모니터링:
    • 데이터를 모니터링 시스템으로 전송하여 실시간 감시 및 경고 생성.
  • 애플리케이션 활용:
    • App1, App2에서 실시간으로 데이터를 처리 및 활용.

3. Kafka Consumer의 특징

  1. 그룹(Group) 기반 데이터 소비:
    • 컨슈머는 컨슈머 그룹으로 묶여 동작한다.
    • 동일한 그룹에 속한 컨슈머는 데이터를 파티션 단위로 나누어 읽다.
    • 각 파티션은 컨슈머 그룹 내의 하나의 컨슈머에 의해 처리된다.
  2. Offset 관리:
    • Kafka는 데이터를 읽은 위치를 나타내는 오프셋(Offset)을 관리한다.
    • 컨슈머가 데이터를 읽을 때, 현재 읽고 있는 위치(Offset)를 저장하여 다음 읽기를 이어갈 수 있도록 한다.
    • commit을 통해 오프셋을 수동으로 업데이트할 수도 있다.
  3. 장애 허용 및 재처리:
    • Kafka는 컨슈머 장애 상황에서 데이터를 다시 읽거나 복구할 수 있는 메커니즘을 제공한다.
    • At-least-once 또는 Exactly-once 전달 보장이 가능하다.
  4. 부하 분산:
    • 컨슈머 그룹 내의 컨슈머 수와 토픽의 파티션 수를 기반으로 데이터를 병렬로 처리한다.
    • 병렬 처리를 통해 높은 처리량을 제공한다.

4. Kafka Consumer의 응용 예

  • 데이터 웨어하우스(DW):
    • 컨슈머는 Kafka에서 데이터를 읽어 ETL(Extract, Transform, Load) 파이프라인을 통해 데이터 웨어하우스로 전달.
  • 모니터링 시스템:
    • 컨슈머가 로그 데이터를 읽어 모니터링 대시보드에 표시하거나 경고 시스템에 전달.
  • 검색 엔진:
    • 컨슈머가 데이터를 읽어 Elasticsearch 같은 검색 엔진으로 전송하여 검색 가능하도록 구성.

5. Kafka Consumer의 주요 설정

  1. Auto Commit:
    • enable.auto.commit 설정으로 오프셋 자동 커밋 여부 결정.
    • True: 컨슈머가 주기적으로 오프셋을 자동으로 커밋.
    • False: 컨슈머가 명시적으로 오프셋을 커밋.
  2. Group ID:
    • 컨슈머 그룹을 식별하기 위한 ID.
    • 동일한 그룹 ID를 사용하는 컨슈머는 데이터 소비를 분담.
  3. Poll Timeout:
    • 컨슈머가 데이터를 읽을 때 대기할 최대 시간.

Kafka Consumer는 Kafka의 강력한 확장성유연성을 활용하여 다양한 시스템과 통합되어 실시간 데이터 처리를 지원한다. Pub-Sub 모델에서 데이터 소비를 효율적으로 처리하고 관리하는 중요한 역할을 수행한다.

 

 

 

 

Polling 구조와 Kafka의 차별성

Kafka는 Polling 방식을 사용하여 데이터를 소비한다. 이는 RabbitMQ와 같은 푸시 기반 메시지 큐 시스템과 차별화되는 Kafka의 핵심 특징이다. 다음은 Kafka의 Polling 구조를 설명한 내용이다.


1. Polling 방식과 Push 방식의 차이

  • Push 방식 (RabbitMQ 등 메시지 큐):
    • 브로커가 데이터를 생성 즉시 컨슈머에게 푸시한다.
    • 컨슈머의 처리 속도와 상관없이 데이터를 전달하며, 과부하 위험이 있다.
  • Polling 방식 (Kafka):
    • 컨슈머가 브로커로부터 데이터를 요청(Poll)한다.
    • 컨슈머가 소비 가능한 만큼의 데이터만 가져오기 때문에, 처리 속도에 맞춘 데이터 소비가 가능하다.

2. Kafka의 Polling 구조

Kafka 컨슈머는 Polling 방식을 통해 브로커와 상호작용하며 데이터를 소비한다.

작동 원리:

  1. Consumer 요청:
    • 컨슈머는 Kafka 브로커에 주기적으로 데이터를 요청(poll() 메서드 호출).
    • 이 요청은 특정 토픽(Topic)과 파티션(Partition)을 기반으로 이루어진다.
  2. Broker 응답:
    • Kafka 브로커는 요청받은 파티션에 저장된 메시지를 컨슈머에게 전달한다.
    • 컨슈머는 전달받은 데이터를 처리하고, 오프셋(Offset)을 관리한다.
  3. 오프셋 관리:
    • 컨슈머는 데이터를 읽은 위치를 나타내는 오프셋을 커밋(commit)하여 다음 Polling 시점의 데이터를 정확히 가져올 수 있도록 한다.

3. Kafka Polling 구조의 장점

  1. 컨슈머 중심 제어:
    • 컨슈머가 처리 가능한 속도에 따라 데이터를 요청할 수 있다.
    • 과부하 없이 안정적으로 데이터 소비가 가능하다.
  2. 유연한 데이터 소비:
    • 컨슈머는 특정 토픽과 파티션의 데이터를 선택적으로 요청할 수 있다.
    • 데이터를 누락 없이 읽거나, 필요한 데이터를 재처리할 수 있다.
  3. 높은 처리량:
    • Kafka의 Polling 구조는 배치 데이터 처리를 통해 네트워크 효율성을 극대화한다.
    • 한 번의 요청으로 여러 메시지를 가져오는 방식으로, 대량의 데이터를 처리할 수 있다.

4. Kafka Polling 구조와 구성 요소

Kafka Polling 구조는 아래와 같은 주요 구성 요소로 이루어져 있다.

Producer:

  • 데이터를 Kafka의 특정 토픽에 기록(Write)한다.

Broker:

  • Kafka의 데이터 저장소 역할을 한다.
  • 각 토픽은 여러 파티션(Partition)으로 나뉘며, 메시지는 순서대로 저장된다.

Consumer:

  • poll() 메서드를 호출하여 브로커로부터 데이터를 읽다.
  • KafkaProperties를 통해 브로커와 통신 설정을 정의한다.

5. Polling 구조에서 고려 사항

  1. 주기적인 Polling:
    • 컨슈머는 heartbeat와 함께 주기적으로 데이터를 요청해야 한다.
    • Polling이 일정 시간 이상 멈추면, Kafka는 컨슈머가 죽었다고 간주하고, 파티션 할당을 다른 컨슈머로 이전한다.
  2. Batch 크기 조정:
    • fetch.min.bytes, fetch.max.wait.ms와 같은 설정을 통해 한 번에 가져올 데이터 양과 대기 시간을 조정할 수 있다.
    • 네트워크 효율과 처리 성능 사이의 균형을 고려해야 한다.
  3. 오프셋 관리:
    • 컨슈머는 읽은 데이터를 기반으로 오프셋을 커밋하여, 다음 Polling 시 중복 소비 또는 데이터 누락을 방지해야 한다.

6. Polling 구조 시각화

  1. Producer와 Broker:
    • Producer → Kafka Broker (토픽에 데이터 쓰기)
  2. Consumer와 Broker:
    • Consumer → Kafka Broker (poll() 요청)
    • Kafka Broker → Consumer (데이터 응답)

Polling 방식은 Kafka의 확장성, 높은 처리량, 안정적인 데이터 소비를 가능하게 하는 핵심 메커니즘이다. 컨슈머 중심 설계를 통해 효율적인 데이터 스트리밍 환경을 제공한다.

 
 
 

Kafka 컨슈머 그룹

Kafka의 컨슈머 그룹(Consumer Group)은 데이터 소비를 관리하고 병렬성을 향상시키기 위한 중요한 구조이다. 컨슈머 그룹을 활용하면 각 컨슈머가 협력하여 데이터를 처리하면서도 서로 독립적으로 작동할 수 있다.


컨슈머 그룹의 핵심 개념

  1. 컨슈머 그룹의 정의:
    • 컨슈머 그룹은 하나 이상의 컨슈머를 묶어 관리하는 단위이다.
    • 동일한 토픽에서 데이터를 읽는 컨슈머들이 그룹으로 묶여 협력적으로 데이터를 처리한다.
  2. 토픽과 파티션:
    • Kafka 토픽은 여러 파티션으로 나뉘며, 각 파티션은 컨슈머 그룹 내의 하나의 컨슈머에게만 할당된다.
    • 하나의 컨슈머는 하나 이상의 파티션을 처리할 수 있다.
  3. 컨슈머 그룹의 독립성:
    • 서로 다른 컨슈머 그룹은 독립적으로 동작하며, 동일한 토픽 데이터를 소비할 수 있다.
    • 각 컨슈머 그룹은 다른 컨슈머 그룹의 동작에 영향을 받지 않다.

Kafka의 컨슈머 그룹 동작 원리

  1. 컨슈머와 파티션 할당:
    • 컨슈머 그룹 내의 각 컨슈머는 특정 파티션의 데이터를 읽다.
    • Kafka는 파티션을 컨슈머에게 자동 할당하며, 그룹 내 컨슈머 수가 파티션 수보다 많으면 일부 컨슈머는 유휴 상태가 된다.
  2. 병렬 처리:
    • 파티션이 컨슈머들에게 나누어 처리되므로, 데이터 처리 속도확장성이 향상된다.
  3. 오프셋 관리:
    • 컨슈머 그룹은 데이터를 읽은 위치(오프셋)를 그룹 단위로 관리한다.
    • Kafka는 각 컨슈머 그룹의 오프셋을 개별적으로 저장하며, 이를 통해 재처리중복 방지가 가능하다.

Kafka 컨슈머 그룹의 장점

  1. 독립적인 데이터 소비:
    • 서로 다른 컨슈머 그룹은 동일한 데이터를 개별적으로 소비할 수 있다.
    • 예: 한 그룹은 실시간 분석, 다른 그룹은 데이터 백업 용도로 사용할 수 있음.
  2. 확장성과 병렬성:
    • 컨슈머 그룹 내 컨슈머 수를 늘려 데이터 소비 성능을 높일 수 있다.
    • 단, 컨슈머 수는 파티션 수를 초과하지 않는 것이 권장된다.
  3. 안정성과 복구:
    • 컨슈머가 중단되거나 추가될 경우, Kafka는 리밸런싱을 통해 파티션을 재배치하여 처리가 지속되도록 보장한다.

Kafka 컨슈머 그룹의 동작 예시

설정된 구조:

  • 토픽 A는 3개의 파티션으로 나뉨:
    • Partition 0, Partition 1, Partition 2
  • 컨슈머 그룹 1에 3개의 컨슈머가 존재:
    • Consumer 0, Consumer 1, Consumer 2
  • 프로듀서는 토픽 A에 메시지를 전송.

파티션 할당:

  • Partition 0 → Consumer 0
  • Partition 1 → Consumer 1
  • Partition 2 → Consumer 2

데이터 소비 흐름:

  1. 프로듀서가 Partition 0, 1, 2에 데이터를 쓰면,
  2. 컨슈머 그룹 1의 각 컨슈머가 할당된 파티션에서 데이터를 읽음.
  3. 그룹 내의 모든 컨슈머가 병렬적으로 데이터를 처리.

Kafka 컨슈머 그룹의 유의점

  1. 컨슈머 수와 파티션 수:
    • 컨슈머 수가 파티션 수보다 많으면 유휴 상태인 컨슈머가 발생.
    • 컨슈머 수를 파티션 수 이하로 유지하여 자원을 효율적으로 활용.
  2. 리밸런싱 비용:
    • 컨슈머 그룹 내 컨슈머가 중단되거나 추가되면, Kafka는 파티션을 재배치하는 리밸런싱(rebalancing) 과정을 수행.
    • 리밸런싱 중에는 데이터 소비가 중단될 수 있음.
  3. 오프셋 커밋:
    • 오프셋 커밋을 잘못 관리하면 데이터 누락 또는 중복 소비가 발생할 수 있음.
    • 자동 커밋(enable.auto.commit) 설정을 신중히 다룰 것.

Kafka 컨슈머 그룹의 구조

 
 

 

Kafka
  
  +-- Topic A (3 Partitions: 0, 1, 2)
        
        +-- Consumer Group 1
             
             +-- Consumer 0 → Partition 0
             +-- Consumer 1 → Partition 1
             +-- Consumer 2 → Partition 2
        
        +-- Consumer Group 2
              
              +-- Consumer 3 → Partition 0
              +-- Consumer 4 → Partition 1
              +-- Consumer 5 → Partition 2
  • 컨슈머 그룹 1컨슈머 그룹 2는 동일한 데이터를 각기 독립적으로 소비.
  • 각 그룹 내에서 병렬적으로 데이터 처리.

 

 

Kafka 컨슈머 그룹과 파티션 및 리밸런싱

Kafka 컨슈머 그룹과 파티션의 관계, 리밸런싱 동작, 그리고 그룹 코디네이터의 역할 


컨슈머 그룹과 파티션의 관계

  1. 컨슈머 그룹 내의 컨슈머와 파티션:
    • Kafka는 토픽 데이터를 파티션으로 나누고, 각 컨슈머는 특정 파티션을 읽는다.
    • 컨슈머 그룹 내 컨슈머 수가 파티션 수와 동일하거나 적으면 모든 파티션이 하나의 컨슈머에 매핑되어 처리된다.
    • 컨슈머 수가 파티션 수보다 많으면 일부 컨슈머는 유휴 상태가 된다.
  2. 파티션 리더와 레플리카:
    • Kafka의 파티션 리더는 실제 데이터를 클라이언트에게 전달하며, 리더는 브로커 내에서 동작한다.
    • 각 파티션에는 여러 레플리카가 존재하며, 장애가 발생하면 리더가 다른 레플리카로 승격된다.

리밸런싱(Rebalancing)

리밸런싱은 컨슈머 그룹 내 컨슈머와 파티션 간의 매핑을 재조정하는 과정이다.

  1. 리밸런싱 트리거:
    • 컨슈머가 추가되거나 제거될 때.
    • 컨슈머 그룹에 변경이 발생할 때.
    • 브로커의 상태 변화(장애 등)가 있을 때.
  2. 리밸런싱 과정:
    • Group Coordinator(그룹 코디네이터)는 컨슈머 그룹의 상태를 모니터링하고 리밸런싱을 관리한다.
    • 새로운 매핑을 계산하고 각 컨슈머에 할당 정보를 전달.
    • 리밸런싱 중에는 데이터 소비가 잠시 중단될 수 있음.
  3. 최적화 고려사항:
    • 리밸런싱은 컨슈머 그룹의 병렬 처리 성능을 극대화하지만, 과도한 리밸런싱은 데이터 소비의 일관성을 저하시킬 수 있음.
    • 필요한 경우 Static Membership을 설정하여 컨슈머 재등록 과정을 줄일 수 있음.

Group Coordinator (그룹 코디네이터)

Group Coordinator는 Kafka 브로커 중 하나가 맡는 역할로, 컨슈머 그룹 관리리밸런싱 실행을 책임진다.

  1. 역할:
    • 컨슈머 그룹의 메타데이터를 관리.
    • 컨슈머 그룹의 헬스 체크 수행.
    • 리밸런싱 트리거와 실행 관리.
  2. 동작 과정:
    • 컨슈머가 컨슈머 그룹에 가입하면, 그룹 코디네이터는 해당 컨슈머의 상태를 확인하고 파티션을 할당.
    • 컨슈머가 그룹에서 나가거나 응답이 없으면, 리밸런싱을 실행하여 파티션을 재분배.

Kafka 브로커와 컨슈머 그룹 간 관계

  1. 브로커와 파티션:
    • Kafka 브로커는 여러 토픽과 파티션을 호스팅하며, 각 파티션은 리더와 리플리카로 구성된다.
    • 브로커는 파티션 리더를 통해 컨슈머 그룹에 데이터를 제공한다.
  2. 컨슈머 그룹의 파티션 매핑:
    • 컨슈머 그룹은 특정 토픽의 파티션 데이터를 읽다.
    • 한 컨슈머는 여러 파티션을 읽을 수 있지만, 한 파티션은 한 컨슈머만 처리한다.

예제: Kafka 컨슈머 그룹과 리밸런싱 시나리오

초기 상태:

  • 토픽 A: 2개의 파티션 (Partition 1, Partition 2)
  • 브로커 3:
    • Partition 1: 리더
    • Partition 2: 리플리카
  • 브로커 4:
    • Partition 1: 리플리카
    • Partition 2: 리더
  • 컨슈머 그룹:
    • Consumer 1 → Partition 1
    • Consumer 2 → Partition 2

변화 발생:

  1. Consumer 3 추가:
    • Group Coordinator는 Consumer 3의 가입을 감지.
    • 리밸런싱 실행:
      • Consumer 1 → Partition 1
      • Consumer 2 → Partition 2
      • Consumer 3 → 유휴 상태 (파티션 부족).
  2. Consumer 2 종료:
    • Group Coordinator는 Consumer 2의 종료를 감지.
    • 리밸런싱 실행:
      • Consumer 1 → Partition 1
      • Consumer 3 → Partition 2.
 

중요 고려사항

  1. 리밸런싱 비용:
    • 과도한 리밸런싱은 시스템 안정성을 저하시킬 수 있으므로 최소화하는 것이 중요.
    • session.timeout.ms와 heartbeat.interval.ms를 적절히 설정.
  2. 파티션 매핑:
    • 컨슈머 수는 파티션 수보다 적거나 같아야 자원이 효율적으로 활용됨.
    • 리밸런싱이 발생해도 데이터 누락이나 중복이 없도록 오프셋 관리 필요.
  3. 컨슈머 헬스 체크:
    • Consumer가 브로커와 지속적으로 연결 상태를 유지해야 리밸런싱이 발생하지 않음.

 

 
 

 

 

반응형

'DATA > Kafka' 카테고리의 다른 글

카프카 모니터링 툴을 설정  (0) 2024.11.28
Kafka 로컬 설치  (0) 2024.11.28
카프카 프로듀서  (0) 2024.11.27
ISR (In Sync Replica)  (0) 2024.11.27
카프카에서 세그먼트(Segment)와 레코드(Record)  (0) 2024.11.27