Kafka 프로듀서

1 minute read

Producer

  • 카프카에서 데이터의 시작점은 프로듀서이다. 프로듀서 애플리케이션은 카프카에 필요한 데이터를 선언하고 브로커의 특정 토픽의 파티션에 전송한다.

  • 프로듀서는 데이터를 전송할 때 리더 파티션을 가지고 있는 카프카 브로커와 직접 통신한다.

  • 프로듀서는 브로커로 데이터를 전송할 때 내부적으로 파티셔너, 배치 생성 단계를 거친다.


공식 라이브러리

  • 공식 라이브러리는 Java 로 개발된다.
  • 다른 언어 go, javascript 등 으로 개발할 수 있긴 하지만 모든 공식 기능과 성능을 보장할 수는 없다.

내부 구조

  • Java 라이브러리 기준

ProducerRecord → send() → Partitioner → Accumulator → Sender → 카프카 클러스터

  1. ProducerRecord
    1. 필수 값은 토픽과 메세지 값이다.
    2. 레코드를 생성하고 send() 호출 시 다음 과정을 거쳐 브로커에 최종 전송된다. ( 오프셋은 브로커에 저장될 때 지정된다 )
  2. Partitioner
    1. 메세지 키를 바탕으로 몇번 파티션으로 보낼지 정하는 역할을 한다.
    2. 별도 설정이 없으면 DefaultPartitioner 로 설정된다.
    3. 같은 메세지 키는 같은 파티션에 저장되므로 순서가 보장된다.
  3. Accumulator
    1. 배치로 데이터를 묶는 작업을 한다. 배치로 묶을 경우 높은 데이터 처리량을 가질수 있게 된다.

기본 파티셔너

  1. 기본 파티셔너
    1. 프로듀서 API를 사용하면 ‘UniformStickyPartitioner’와 ‘RoundRobinPartitioner’ 2개 파티셔너를 제공한다.
    2. 카프카 클라이언트 라이브러리 2.5.0 버전에서 파티셔너를 지정하지 않은 경우 UniformStickyPartitioner가 파티셔너로 기본 설정된다.
  2. 메세지 키가 있을 경우 동작
    1. UniformStickyPartitioner와 RoundRobinPartitioner 둘 다 메세지 키가 있을 때는 메세지 키의 해시값과 파티션을 매칭하여 레코드를 전송한다.
    2. 동일한 메세지 키가 존재하는 레코드는 동일한 파티션에 전달된다.
    3. 만약 파티션 개수가 변경될 경우 메세지 키와 파티션 번호 매칭은 깨지게 된다.
      • 따라서 파티션의 갯수는 사전에 최대한 충분한 수치로 설정하는것이 좋다.
  3. 메세지 키가 없을 경우 동작
    1. 메세지 키가 없을 때는 파티션에 최대한 동일하게 분배하는 로직이 있는데 UniformStickyPartitioner는 RoundRobinPartitioner의 단점을 개선하였다는 점이 다르다.
    2. RoundRobinPartitioner
      • ProducerRecord가 들어오는 대로 파티션을 순회하면서 전송한다.
      • Accumulator에서 묶이는 정도가 적기 때문에 전송 성능이 낮다.
    3. UniformStickyPartitioner
      • Accumulator에서 레코드들이 배치로 묶일 때까지 기다렸다가 전송한다.
      • 배치로 묶일 뿐 결국 파티션을 순회하면서 보내기 때문에 모든 파티션에 분배되어 전송된다.
      • RoundRobinPartitioner에 비해 향상된 성능을 가졌다.

커스텀 파티셔너

  • 카프카 클라이언트 라이브러리에서는 사용자 지정 파티셔너를 생성하기 위한 Partitioner 인터페이스를 제공한다.

  • Partitioner 인터페이스를 구현한 사용자 정의 클래스에서 메세지 키 또는 메세지 값에 따른 파티션 지정 로직을 구현할 수도 있다.

  • 파티셔너를 통해 파티션이 지정된 데이터는 Accumulator에 버퍼로 쌓이고 Sender 스레드는 Accumulator에 쌓인 배치 데이터를 가져가 카프카 브로커로 전송한다.

-->

Categories:

Updated:

Comments