728x90

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

 

전송하고자 하는 데이터는 ProducerRecord 클래스를 통해 인스턴스를 생성했지만

생성 필수 파라미터인 토픽, 메시지 값만 설정했다. 

 

ProducerRecord 생성 시 추가 파라미터를 사용해 오버로딩하여 내부 변수 선언할 수 있음.

파티션 번호를 지정하거나 타임스탬프 설정, 메시지 키 설정할 수도 있다. 

 

레코드의 타임스탬프는 카프카 브로커에 저장될 때 브로커 시간을 기준으로 설정.

필요에 따라 레코드 생성시간 또는 그 이전/이후로 설정할 수도 있다. 

 

 

카프카 프로듀서 인스턴스가 send() 메서드 호출하면 ProducerRecord는 파티셔너에서 토픽의 어느 파티션으로

전송될지 정해진다. 

파티셔너에 의해 구분된 레코드는 데이터를 전송하기 전에 어큐뮬레이터에 데이터를 버퍼로 쌓아놓고 발송한다. 

버퍼로 쌓인 데이터는 배치로 묶어서 전송함으로써 카프카의 프로듀서 처리량을 향상시킨다.

 

 

프로듀서 API를 사용하면 2가지 파티션 제공.

- 둘 다 메시지 키 있을 때는 메시지 키의 해시값과 파티션을 매칭하여 데이터를 전송한다. 

- 없을때는 파티션에 최대한 동일하게 분배한다. 

 

1. UniformStickyPartitioner (default)

- RoundRobinPartitioner의 단점 개선. 

- 높은 처리량, 낮은 리소스 사용률 가짐.

- 될 수 있으면 많은 데이터가 배치로 묶여 전송되어야 성능 향상을 기대할 수 있으므로 카프카 2.4.0 부터 유니폼스티키가 기본.

- 어큐뮬레이터에서 데이터가 배치로 모두 묶일 때까지 기다렸다가 배치로 묶인 데이터는 모두 동일한 파티션에 전송함으로써

  라운드 로빈에 비해 향상된 성능 가지게 됌

 

 

2. RoundRobinPartitioner

- 카프카 2.4.0 이전에는 라운드로빈이 기본 파티셔너였다.

- ProducerRecord가 들어오는 대로 파티션을 순회하며 전송하기 때문에 배치로 묶이는 빈도가 적다.

 

 

 

 


 

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

Partitioner 인터페이스 상속받은 사용자정의 클래스에서 메시지 키, 값에 따른 파티션 지정 로직을 적용할 수도 있다. 

파티셔너를 통해 파티션이 지정된 데이터는 어큐뮬레이터에 버퍼로 쌓인다. 

센더(sender) 스레드는 어큐뮬레이터에 쌓인 배치 데이터를 가져가 카프카 브로커로 전송한다. 

 

카프카 프로듀서는 압축 옵션을 통해 브로커로 전송 시 압축 방식을 정할 수 있다. 압축 옵션을 정하지 않으면 압축이 되지 않은 상태로 전송된다. 

압축하면 데이터 전송 시 네트워크 처리량에 이득을 볼 수 있지만 압축하는데 CPU 또는 메모리 리소스를 사용하므로 사용환경에 따라 적절한 압축 옵션을 사용해야 한다. 

(주의) 프로듀서에서 압축한 메시지는 컨슈머 애플리케이션이 압축을 풀게 되는데 이때도 컨슈머 애플리케이션 리소스가 사용된다.

 

 

 

프로듀서 주요 옵션

프로듀서 애플리케이션을 실행할 때 사용자가 반드시 설정해야하는 필수 옵션과,

사용자의 설정을 필수로 받지 않는 선택옵션이 있다. 

+ Recent posts