1 Producer 개념
producer는 메시지를 생성하여 브로커의 토픽 이름으로 보내는 서버 또는 애플리케이션을 말한다.
producer는 데이터를 전송할 때 리더 partition을 가지고 있는 broker와 직접 통신을 한다.
producer는 카프카 broker로 데이터를 전송할 때 내부적으로 partitioner, 배치 생성 단계를 거친다.
producer의 주요 기능은 각각의 메시지를 토픽 파티션에 매핑하고 파티션 리더에 요청을 보내는 것
- 키 값을 정해 해당 키를 가진 모든 메세지를 동일한 파티션으로 전송한다.
1.1 Producer의 동작 과정
- 레코드는 토픽, 파티션, 키, 밸류로 구성된다.
- 레코드는 시리얼라이저, 파티셔너, 배치를 거치게된다.

- 시리얼라이저가 레코드를 직렬화한다.
- 파티셔너가 레코드 키의 해시값을 토대로
partition을 지정한다.
- 배치 전송을 위해 어큐뮬레이터에 파티션으로 구분된 버퍼에 레코드를 쌓는다
- sender 스레드가 어큘뮬레이터에 쌓인 배치 데이터를 카브카 브로커로 전송한다.
- 전송이 실패하면 재시도한다.
- 지정된 횟수만큼 재시도하며 최종 실패 결과를 보여준다.
- 전송이 성공하면 메타데이터를 리턴한다.
2 Partitioner
- 카프카의 토픽은 병렬 처리가 가능하도록 최소 하나 이상의 파티션으로 구성된다.
- 프로듀서가 카프카로 전송한 메시지는 해당 토픽 내 각 파티션의 로그 세그먼트에 저장된다.
- 따라서 프로듀서는 메시지를 보낼 때 토픽의 어느 파티션으로 메시지를 보낼지 결정해야 하며 이때 사용하는 것이
Partitioner다
partitioner는 record를 topic의 어느 partition으로 전송할 것인지 결정하는 역할을 한다.
- partitioner는 메시지(레코드)의 키를 해시해 파티션을 결정한다.
- 따라서 메시지 키 값이 동일하면 같은 파티션으로 전송된다.
- 토픽의 파티션을 추가하는 경우 메시지의 키와 매핑된 해시 테이블도 변경된다.
- 따라서 동일한 메시지 키를 이용해 메시지를 전송해도 다른 파티션으로 전송될 수 있다.
- 되도록 파티션 수를 변경하지 않을 것을 권장
2.1 라운드 로빈 전략
- 프로듀서의 레코드 키값은 필수가 아니다
- 만약 키값을 지정하지 않는다면 라운드 로빈 알고리즘을 사용해 랜덤한 파티션으로 레코드를 전송한다.
- 파티셔너를 거친 후의 레코드는 배치 처리를 위해 프로듀서의 메모리 버퍼 영역에서 잠시 대기한다.
- 라운드 로빈 전략은 모든 파티션 버퍼에 레코드를 고르게 분산해 버퍼의 최소 레코드 수를 충족시키지 못해 성능이 좋지 못하다
- 물론 특정 시간을 초과하면 즉시 전송하도록 설정할 수 있지만 배치와 압축의 효과를 얻지 못한채 소수의 레코드만 전송해 비효율 적이다.
2.2 스티키 파티셔닝 전략
- 라운드 로빈 전략을 보완하기 위해 카프카 2.4 버전부터 스티키 파티셔닝 전략을 사용한다.
- 스티키 파티셔닝은 하나의 파티션에 레코드 수를 먼저 채워서 카프카로 빠르게 배치 전송하는 전략이다.
- 배치를 위한 레코드 수에 도달할 때까지 다른 파티션으로 보내지않고 동일한 파티션 버퍼에 레코드를 담는다.
3 Batch
- 카프카는 프로듀서의 처리량을 높이기 위해 배치 전송을 권장한다.
- 단건의 메시지를 전송하는 것이 아니라 다량의 메시지를 묶어서 전송해 불필요한 I/O를 줄일 수 있어 매우 효율적이다.
- 프로듀서는
partitioner에 의해 구분된 record를 파티션마다 별도의 버퍼에 쌓아놓고 버퍼의 최소 레코드 개수를 충족하거나 설정된 시간이이 지나면 카프카로 버퍼에 담긴 레코드들을 한번에 전송한다.
3.1 Batch 사이즈 조절