Kafka 프로듀서
Producer
-
카프카에서 데이터의 시작점은 프로듀서이다. 프로듀서 애플리케이션은 카프카에 필요한 데이터를 선언하고 브로커의 특정 토픽의 파티션에 전송한다.
-
프로듀서는 데이터를 전송할 때 리더 파티션을 가지고 있는 카프카 브로커와 직접 통신한다.
-
프로듀서는 브로커로 데이터를 전송할 때 내부적으로 파티셔너, 배치 생성 단계를 거친다.
공식 라이브러리
- 공식 라이브러리는 Java 로 개발된다.
- 다른 언어 go, javascript 등 으로 개발할 수 있긴 하지만 모든 공식 기능과 성능을 보장할 수는 없다.
내부 구조
- Java 라이브러리 기준
ProducerRecord → send() → Partitioner → Accumulator → Sender → 카프카 클러스터
- ProducerRecord
- 필수 값은 토픽과 메세지 값이다.
- 레코드를 생성하고 send() 호출 시 다음 과정을 거쳐 브로커에 최종 전송된다. ( 오프셋은 브로커에 저장될 때 지정된다 )
- Partitioner
- 메세지 키를 바탕으로 몇번 파티션으로 보낼지 정하는 역할을 한다.
- 별도 설정이 없으면 DefaultPartitioner 로 설정된다.
- 같은 메세지 키는 같은 파티션에 저장되므로 순서가 보장된다.
- Accumulator
- 배치로 데이터를 묶는 작업을 한다. 배치로 묶을 경우 높은 데이터 처리량을 가질수 있게 된다.
기본 파티셔너
- 기본 파티셔너
- 프로듀서 API를 사용하면 ‘UniformStickyPartitioner’와 ‘RoundRobinPartitioner’ 2개 파티셔너를 제공한다.
- 카프카 클라이언트 라이브러리 2.5.0 버전에서 파티셔너를 지정하지 않은 경우 UniformStickyPartitioner가 파티셔너로 기본 설정된다.
- 메세지 키가 있을 경우 동작
- UniformStickyPartitioner와 RoundRobinPartitioner 둘 다 메세지 키가 있을 때는 메세지 키의 해시값과 파티션을 매칭하여 레코드를 전송한다.
- 동일한 메세지 키가 존재하는 레코드는 동일한 파티션에 전달된다.
- 만약 파티션 개수가 변경될 경우 메세지 키와 파티션 번호 매칭은 깨지게 된다.
- 따라서 파티션의 갯수는 사전에 최대한 충분한 수치로 설정하는것이 좋다.
- 메세지 키가 없을 경우 동작
- 메세지 키가 없을 때는 파티션에 최대한 동일하게 분배하는 로직이 있는데 UniformStickyPartitioner는 RoundRobinPartitioner의 단점을 개선하였다는 점이 다르다.
- RoundRobinPartitioner
- ProducerRecord가 들어오는 대로 파티션을 순회하면서 전송한다.
- Accumulator에서 묶이는 정도가 적기 때문에 전송 성능이 낮다.
- UniformStickyPartitioner
- Accumulator에서 레코드들이 배치로 묶일 때까지 기다렸다가 전송한다.
- 배치로 묶일 뿐 결국 파티션을 순회하면서 보내기 때문에 모든 파티션에 분배되어 전송된다.
- RoundRobinPartitioner에 비해 향상된 성능을 가졌다.
커스텀 파티셔너
-
카프카 클라이언트 라이브러리에서는 사용자 지정 파티셔너를 생성하기 위한 Partitioner 인터페이스를 제공한다.
-
Partitioner 인터페이스를 구현한 사용자 정의 클래스에서 메세지 키 또는 메세지 값에 따른 파티션 지정 로직을 구현할 수도 있다.
-
파티셔너를 통해 파티션이 지정된 데이터는 Accumulator에 버퍼로 쌓이고 Sender 스레드는 Accumulator에 쌓인 배치 데이터를 가져가 카프카 브로커로 전송한다.
Comments