kafka 파티셔너와 배치
kafka에 파티셔너와 배치에 대한 개념을 소개합니다.
파티셔너
프로듀서는 메시지를 보낼 때 해당 토픽의 어느 파티션으로 메시지를 보내야 할지를 결정해야하는데, 사용하는 것이 바로 파티셔너입니다. 프로듀서가 파티션을 결정하는 알고리즘은 기본적으로 메시지의 키를 해시처리해 파티션을 구하는 방식을 사용합니다. 따라서, 메시지의 키값이 동일하면 해당 메시지들은 모두 같은 파티션으로 전송됩니다.
많은양의 트래픽으로 인하여 파티션 수가 증가하게 된다면 변경됨과 동시에, 메시지의 키와 매핑된 해시 테이블도 변경됩니다. 변경됨에따라 동일한 메시지 키를 이용해 전송하더라도 다른 파티션으로 전송 될 수 있습니다.
이렇게 메시지의 키를 이용해 카프카로 메시지를 전송하는 경우, 관리자의 의도와는 다른 방식으로 메시지 전송이 이뤄질 수 있으므로 되도록 파티션 수 변경을 권장하지 않습니다.
1. 라운드 로빈 전략
레코드(메시지)의 키값은 필수 값이 아니므로 키값을 지정하지 않고 전송하게 된다면 라운드 로빈알고리즘을 사용해 프로듀서는 토픽의 파티션들로 레코드들을 랜덤하게 전송합니다.
레코드들은 배치 처리를 위해 프로듀서의 버퍼 메모리 영역에 잠시 대기한 후 카프카로 전송됩니다. 대기하는 과정에서 라운드 로빈 전략은 호율을 떨어뜨릴 수 있습니다.
라운르 로빈 전략으로 각 파티션에 하나씩 순차적으로 할당됩니다. 총 5개의 레코드가 파티셔너를 거쳐 지나갔지만 카프카로 전송되지 못한채 프로듀서 내에서 대기하고 있습니다. 배치 전송을 위한 최소 레코드 수가 3으로 설정되어 있으므로 파티션별 최소 레코드 수의 기준인 3을 충족하지 못했기 때문입니다.
물론 관리자가 옵션을 조정해서 특정시관 초과 시 레코드들을 전송하도록 설정 할 수 있지만 비효율적입니다.
2. 스티키 파티셔닝 전략
라운드 로빈 전략에서 지연시간이 불필요하게 증가되는 비효율적인 전송을 개선하고자 스티키 파티셔닝 전략을 사용하게 되었습니다.
하나의 파티션에 레코드 수를 먼저 채워서 카프카로 빠르게 배치 전송하는 전략을 말합니다.
컨플루언트에서 공객한 블로그 글에 따르면 스티키 파티셔닝 전략을 적용함으로써 기본 설정에 비해 약 30%이상 지연시간이 감소하고 프로듀서의 CPU 사용률도 줄어드는 효과를 얻을 수 있습니다. 메시지의 순서가 중요하지 않는 경우라면 스티키 파티셔닝 전략 적용을 권장합니다.
배치
프로듀서에서는 처리량을 높이기 위해 배치 전송을 권장합니다. 프로듀서에서는 카프카로 전송하기 전, 배치 전송을 위해 버퍼 메모리에 토픽의 파티션별로 레코들을 잠시 보관하고 있습니다.
배치 전송은 불필요한 I/O를 줄일 수 있어 효율적이며, 카프카의 요청 수를 줄여주는 효과도 있습니다.
하지만 장점이 많다고 해서 무조건 배치 처리만 해야하는 것은 아닙니다. 카프카를 사용하는 목적에 따라 처리량을 높일지, 지연 없는 전송해야 할지 선택해야 합니다.
대량의 메시지를 처리할 때 처리량을 높여야 하는 경우라면 배치 전송이 효율적이며 단지 지연 없는 전송이 목표라면 배치 전송 관련 설정을 제거하면 됩니다.



