토픽은 여러 개의 파티션으로 나뉘고 프로듀서가 전송한 메시지는 토픽 내부의 파티션의 로그 세그먼트에 저장된다. 메시지를 토픽의 어느 파티션으로 전송할 지 결정할 때 사용하는 것이 파티셔너이다. 파티셔너는 보통 키의 값에 따라서 메시지를 전송할 파티션을 선택한다. 하지만 메시지의 키는 필수값이 아니고 키 값이 null일 경우에는 여러 알고리즘을 이용해서 메시지를 분배한다.
라운드 로빈
메시지를 파티션 여러개들에게 순서대로 하나씩 할당하는 방법. 하지만 배치 사이즈가 채워지기 전까지 메시지들이 브로커의 토픽으로 전송되지 못하고 대기해야 한다는 단점이 있다.
위 그림에서 배치 사이즈를 3으로 설정했다면 파티션이 한개라면 이미 전송이 됐겠지만 하나씩 분배되어 할당됐기 때문에 전송이 일어나지 못했다. 이건 곧 지연 시간의 증가를 의미한다.
스티키 파티셔닝
라운드 로빈의 지연 시간 증가 이슈를 해결하기 위해서 등장한 방식으로 하나의 파티션에 레코드 수를 먼저 채워서 카프카 브로커로 빠르게 배치 전송하는 전략이다.
그림을 라운드 로빈과 비교해서 봤을 때 라운드 로빈에서는 3번 메세지까지 받고도 전송이 일어나지 못했지만 스티키 파티셔닝에서는 배치 사이즈인 3을 채워서 전송이 일어난다.
프로듀서에서 위에 봤던 예시처럼 배치로 메시지를 처리하면 불필요한 I/O를 줄일 수 있고 카프카의 요청 수를 줄여주어 성능을 높일 수 있다. 하지만 실시간성 처리가 더 중요한 데이터의 경우에는 단건으로 처리하는 것이 더 좋다. 지연 시간
, 처리량
중 더 중요한 요소에 맞추어서 결정하자.
추가로 프로듀서에서 메시지 압축 기능을 추가로 사용한다면 성능을 더 높일 수 있다.
카프카 프로듀성에는 멱등 법칙
이 적용되어 사용자가 프로듀서를 이용해 메시지를 여러 번 전송해도 카프카에는 중복 없이 한번만 저장된다.