Kafka 완전 정복 : 클러스터 구축부터 MSA 환경 활용까지/기본,심화 개념, 아키텍처와 생태계

Ch01. Apache Kafka 기본 개념 및 이해 - Consume

webmaster 2023. 3. 28. 23:29
728x90

Consuming from Kafka

Partition으로부터 Record를 가져옴(Poll)

  • Consumer는 각각 고유의 속도로 CommitLog로부터 순서대로 Read(Poll)를 수행
  • 다른 ConsumerGroup에 속한 Consumer들은 서로 관련이 없으며, CommitLog에 있는 Event(Message)를 동시에 다른 위치에서 Read할 수 있음

Consumer Offset

Consumer Group이 읽은 위치를 표시한다.

Consumer Offset
  • Consumer가 자동이나 수동으로 데이터를 읽은 위치를 commit하여 다시 읽음을 방지한다.
  • __consumer_offsets라는 InternalTopic에서 ConsumerOffset을 저장하여 관리한다.

Multi-Partitions with Single Consumer

  • 4개의 Partition으로 구성된 Topic의 데이터를 사용하는 Single Consumer가 있는 경우, 이 Consumer는 Topic의 모든 Partition에서 모든 Record를 Consume 한다.
  • 하나의 Consumer는 각 Partition에서의 Consumer Offset을 별도로 유지(기록) 하면서 모든 Partition에서 Consume한다.

Consuming as a Group

동일한 group.id로 구성된 모든 Consumer들은 하나의 Consumer Group을 형성

  • 동일한 그룹을 파티션을 만들어 consumer에 뿌려 주기만 하면 알아서 파티션 그룹을 만든다.
  • 4개의 파티션이 있는 Topic를 consume 하는 4개의 Consumer가 하나의 Consumer Group에 있다면, 각 Consumer는 정확히 하나의 Partition에서 Record를 consume 한다.
  • Partition은 항상 ConsumerGroup내의 하나의 Consumer에 의해서 만사용됨
  • Consumer는 주어진 Topic에서 0개 이 상의 많은 Partition을 사용할 수 있음

Multi Consumer Group

  • 동일한 group.id로 구성된 모든 Consumer들은 하나의 ConsumerGroup을 형성한다.
  • ConsumerGroup의 Consumer들은 작업량을 어느정도 균등하게 분할한다.
  • 동일한 Topic에서 consume하는 여러 ConsumerGroup이 있을 수 있다

Key를 사용하면 Partition별로 동일한 Key를 가지는 메시지 저장

  • key를 사용하면 Partitioner가 Patition 번호를 정해 Topic에 데이터를 보내게 된다

Message Ordering(순서)

Message Ordering(순서)

  • Partition이 2개 이상인 경우 모든 메시지에 대한 전체 순서보장 불가능
  • Partition을 1개로 구성하면 모든 메시지에서 전체 순서보장 가능 ‒ 처리량 저하(병렬 처리가 안된다.)
  • Partition을 1개로 구성해서 모든 메시지에서 전체 순서보장을 해야 하는 경우가 얼마나 많을까?

Message Ordering(순서) - 정확한 판단이 필요

  • Partition을 1개로 구성해서 모든 메시지에서 전체 순서보장을 해야하는 경우가 얼마나 많을까?
    • 특정 사용자가 어떤 상품을 조회했는지 알고 싶다고 가정한다면, 사용자 전체에서, 어떤 데이터를 보고 있는지 순서를 보장해야할까??
  • 대부분의 경우, Key로 구분할 수 있는 메시지들의 순서보장이 필요한 경우가 많다.

Message Ordering(순서) - Key를 사용하여 Partition별 메시지 순서 보장

  • 동일한 Key를 가진 메시지는 동일한 Partition에만 전달되어 Key레벨의 순서 보장가능
    • 멀티 Partition 사용 가능 = 처리량 증가
  • 운영중에 Partition개수를 변경하면 어떻게 될까?
    • 순서보장불가
    • partition을 선택하는 알고리즘에 Partition을 기준으로 hash를 나누기 떄문

Cardinality 특정 데이터 집합에서 유니크(Unique)한 값의 개수

  • Key Cardinality는 Consumer Group의 개별 Consumer가 수행하는 작업의 양에 영향
  • Key 선택이 잘못되면 작업 부하가 고르지 않을 수 있다
  • Key는 Integer, String 등과 같은 단순한 유형일 필요가 없다
  • Key는 Value와 마찬가지로 Avro, JSON 등 여러필드가 있는 복잡한 객체일수있다.
  • 따라서, Partition 전체에 Record를 고르게 배포하는 Key를 만드는 것이 중요하다.

Consumer Failure Consumer Rebalancing

  • 4개의 파티션이 있는Topic를 consume하는 4개의 Consumer가 하나의 Consumer Group에 있다면, 각 Consumer는 정확히 하나의 Partition에서 Record를 consume한다.
  • Partition은 항상 ConsumerGroup내의 하나의 Consumer에 의해서만 사용된다.
  • Consumer는 주어진 Topic에서 0개 이상의 많은 Partition을 사용할 수 있다.

  • ConsumerGroup 내의 다른 Consumer가 실패한 Consumer를 대신하여 Partition에서 데이터를 가져와서 처리한다.
  • Partition은 항상 ConsumerGroup내의 하나의 Consumer에 의해서만 사용된다.
  • Consumer는 주어진 Topic에서 0개 이상의 많은 Partition을 사용할 수 있다.

정리

  • Consumer가 자동이나 수동으로 데이터를 읽은 위치를 commit하여 다시 읽음을 방지
  • __consumer_offsets라는 InternalTopic에서 ConsumerOffset을 저장하여 관리
  • 동일한 group.id로 구성된 모든 Consumer들은 하나의 ConsumerGroup을 형성
  • 다른 ConsumerGroup의 Consumer들은 분리되어 독립적으로 작동
  • 동일한 Key를 가진 메시지는 동일한 Partition에만 전달되어 Key레벨의 순서 보장가능
  • Key 선택이 잘못되면 작업 부하가 고르지 않을 수 있음
  • ConsumerGroup내의 다른 Consumer가 실패한 Consumer를 대신하여 Partition에서 데이터를 가져와서 처리함
728x90