반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

간단한 개발관련 내용

CHAPTER4. 카프카 컨슈머: 카프카에서 데이터 읽기 본문

IT 책/카프카 핵심 가이드

CHAPTER4. 카프카 컨슈머: 카프카에서 데이터 읽기

vincenzo.dev.82 2024. 11. 21. 12:56
반응형

카프카 완벽 가이드 4장 요약: 컨슈머


4.1 카프카 컨슈머: 개념

  • 컨슈머와 컨슈머 그룹:

    • 컨슈머는 보통 컨슈머 그룹의 일부로 동작하며, 동일 그룹의 컨슈머들은 서로 다른 파티션의 메시지를 읽는다.
    • 파티션보다 많은 컨슈머를 추가하면 일부는 유휴 상태가 됨.
    • 컨슈머 그룹별 데이터 분리: 애플리케이션마다 별도 그룹 생성 필요.
    • 컨슈머를 추가해 그룹 확장 시, 각 컨슈머는 일부 메시지만 처리.
  • 리밸런스(rebalance):

    • 파티션 재할당 과정으로, 컨슈머 추가/종료/충돌, 토픽 변경 시 발생.
    • 리밸런스 전략:
      1. 조급한 리밸런스: 모든 컨슈머가 소유권 포기 후 재할당. 전체 작업 중단 위험.
      2. 협력적 리밸런스: 파티션 일부만 재할당해 중단 최소화.
  • 정적 그룹 멤버십:

    • group.instance.id 설정 시, 컨슈머 종료 후에도 그룹 멤버십 유지.
    • 리밸런스 없이 기존 할당 파티션 유지 가능.

4.2 카프카 컨슈머 생성

  • 컨슈머 인스턴스 생성에는 기본 설정 필요:
    1. bootstrap.servers
    2. key.deserializer
    3. value.deserializer

4.3 토픽 구독

  • 컨슈머는 하나 이상의 토픽을 구독 가능.
  • 정규식 구독: 동적 토픽 구독에 유용하지만 오버헤드가 발생할 수 있음.

4.4 폴링 루프

  • poll() 메서드:
    • 서버에서 새로운 데이터를 읽어오는 루프.
    • 메시지 처리: record.topic(), record.partition(), record.offset() 등을 사용.
  • 스레드 안전성:
    • KafkaConsumer는 스레드 안전하지 않으므로, 각 스레드에 별도 컨슈머를 생성하거나 작업 스레드와 분리해야 함.

4.5 컨슈머 설정

  • 중요 설정:

    1. 데이터 크기 및 시간:
      • fetch.min.bytes: 최소 데이터량.
      • fetch.max.wait.ms: 데이터 수집 대기 시간.
      • fetch.max.bytes: 최대 응답 크기.
    2. 파티션 및 메시지 처리:
      • max.poll.records: 폴링당 최대 레코드 수.
      • max.partition.fetch.bytes: 파티션별 최대 바이트 수.
    3. 세션 및 타임아웃:
      • session.timeout.ms: 컨슈머가 살아 있다고 간주되는 시간.
      • heartbeat.interval.ms: 하트비트 간격.
      • max.poll.interval.ms: 폴링 간 최대 시간.
      • request.timeout.ms: 브로커 응답 대기 시간.
    4. 오프셋 관리:
      • auto.offset.reset: 커밋되지 않은 오프셋의 처리 방식. (latest 기본값)
      • enable.auto.commit: 자동 커밋 여부. (false 권장)
  • 파티션 할당 전략:

    • Range, RoundRobin, Sticky, Cooperative Sticky 지원.

4.6 오프셋과 커밋

  • 오프셋 커밋:

    • 메시지 처리 후 성공적으로 처리된 마지막 메시지의 오프셋을 커밋.
    • 커밋 정보는 __consumer_offsets 토픽에 저장.
  • 자동 커밋:

    • enable.auto.commit=true 설정 시 기본 5초 간격으로 자동 커밋.
    • 크래시 발생 시 중복 메시지 가능성.
  • 수동 커밋:

    • enable.auto.commit=false 설정.
    • 동기/비동기 커밋 조합으로 효율적 처리.

4.7 리밸런스 리스너

  • 리밸런스 전후 작업을 처리하는 리스너 제공:
    • onPartitionsAssigned: 파티션 할당 시 호출.
    • onPartitionsRevoked: 파티션 해제 시 호출.
    • onPartitionsLost: 파티션 손실 시 호출.

4.8 특정 오프셋 읽기

  • 특정 오프셋에서 읽기:
    • seekToBeginning(), seekToEnd()로 시작점 설정.
    • 특정 오프셋으로 이동 가능.

4.9 폴링 루프 종료

  • 컨슈머 종료:
    • consumer.wakeup() 호출로 폴링 루프를 안전하게 중단.
    • 종료 시 consumer.close() 호출로 리소스 정리.

4.10 디시리얼라이저

  • 이벤트를 애플리케이션에서 처리 가능한 형태로 변환.

  • Serdes:

    • Serializer와 Deserializer를 묶어서 제공.
    • 직렬화/역직렬화 간 호환성 중요.
  • 커스텀 디시리얼라이저:

    • 직접 구현 가능하지만 권장되지 않음.
    • Avro 및 스키마 레지스트리를 사용하는 것이 일반적.

4.11 독립 실행 컨슈머

  • 컨슈머 그룹 없이 독립적으로 사용 가능.

4.12 요약

  • 컨슈머 그룹과 리밸런스의 작동 방식을 이해하고 신뢰성 있는 오프셋 커밋 전략을 세우는 것이 중요.
  • 디시리얼라이저와 데이터 처리 방식을 명확히 설정하여 데이터의 호환성을 보장.
반응형