[Kafka] Kafka Producers

이재민·2024년 1월 24일
0

Kafka

목록 보기
4/17

Kafka Producers

Kafka Producers란, Kafka를 사용해 Topic이 생성되면 해당 Topic으로 데이터를 전송하는 것입니다. 이때 Kafka Producers가 참여하게 됩니다.

  • 데이터를 토픽으로 보내는 애플리케이션을 Kafka Producers라고 합니다
  • 애플리케이션은 일반적으로 Kafka 클라이언트 라이브러리를 통합하여 Apache Kafka에 씁니다.
    • Python, Java, Go 등을 포함하여 거의 모든 프로그래밍 언어에 대한 클라이언트 라이브러리가 존재합니다.
  • Kafka Producers는 토픽에 메시지를 보내고 메시지는 키 해싱과 같은 메커니즘에 따라 파티션에 분산됩니다.
  • 메시지가 Kafka 토픽에 성공적으로 기록되려면 producers가 승인(acks) 수준을 지정해야 합니다. 해당 내용은 Topic replication을 참고하시면 됩니다.

Message Keys

  • 각 이벤트 메시지에는 키와 값이 선택적으로 포함되어 있습니다.
    • producers가 키를 지정하지 않은 경우(key=null) 메시지는 토픽의 파티션에 균등하게 분배됩니다.
    • 즉, 메시지가 라운드로빈(roundRobin) 방식으로 전송된다는 것을 의미합니다. (partition p0 -> p1 -> p2 -> p0)
  • 키가 전송되면(key!=null)같은 키를 공유하는 모든 메시지는 항상 같은 kaffka partition에 전송되어 저장됩니다.
    • 키는 문자열, 숫자 값, 이진 값 등 메시지를 식별하는 모든 것이 될 수 있습니다.
  • Kafka 메시지 키는 같은 필드를 공유하는 모든 메시지에 대해 메시지 순서가 필요할 때 일반적으로 사용됩니다.

Kafka Message 분석

  • Kafka 메시지는 producers에 의해 생성됩니다.
  • Key
    • 키는 kafka 메시지에서 선택 사항이며 null일 수 있습니다.
    • 키는 문자열, 숫자 또는 임의의 객체일 수 있으며 키는 binary 형식으로 직렬화됩니다.
  • Value
    • 값은 메시지의 내용을 나타내며 null일 수 있습니다.
    • 값 형식은 임의적이며 binary 형식으로 직렬화됩니다.
  • Compression Type(압축 유형)
    • kafka 메시지는 압축될 수 있습니다.
    • 압축 유형은 메시지의 일부로 지정될 수 있습니다. 옵션은 none, gzip, lz4, snappy, zstd 가 있습니다.
  • Headers
    • 키-값 쌍의 형태로 선택적 kafka 메시지 헤더 목록이 있을 수 있습니다. 특히 추적을 위해 메시지에 대한 메타데이터를 지정하기 위해 헤더를 추가하는 것이 일반적입니다.
  • Partition + Offset
    • 메시지가 kafka topic로 전송되면 파티션 번호와 오프셋 ID를 받습니다.
    • topic + partition + offset 조합으로 메시지를 고유하게 식별합니다.
  • Timestamp
    • 타임스탬프는 사용자 또는 시스템에 의해 메시지에 추가됩니다.

Kafka Message Serializers

  • kafka 브로커는 byte array을 메시지의 키와 값으로 예상합니다.
  • 객체에 대한 생산자의 프로그래밍 방식 표현을 binary로 변환하는 프로세스를 Message Serialization 이라고 부릅니다.

Kafka Message Key Hashing

  • Kafka Partitioner는 레코드를 가져와 어느 파티션에 보낼지 결정하는 코드 로직입니다.
  • 따라서 Partitioner가 Kafka 메시지 키를 활용하여 메시지를 특정 topic 파티션으로 라우팅하는 것이 일반적입니다.
  • 참고로 동일한 키를 가진 모든 메시지는 동일한 파티션으로 이동됩니다.
  • 기본 Kafka Partitioner에서 key는 mumur2 알고리즘을 사용하여 해싱됩니다.
    targetPartition = Math.abs(Utils.murmur2(keyBytes)) % (numPartitions - 1)
profile
문제 해결과 개선 과제를 수행하며 성장을 추구하는 것을 좋아합니다.

0개의 댓글