Patitioner
Kafka의 파티셔너(Partitioner)는 프로듀서(Producer)가 전송하는 메시지를 특정 파티션에 할당하는 핵심적인 역할을 담당한다. 이는 메시지가 Kafka 클러스터 내에서 어떻게 분배되고 처리될지를 결정하며, 시스템의 성능과 부하 분산에 직접적인 영향을 미친다. 파티셔너는 메시지 키를 기반으로 파티션을 선택하거나, 별도의 전략에 따라 메시지를 분배할 수 있다.
파티셔너?
메시지 분배 결정
파티셔너는 프로듀서가 보낸 각 메시지를 어떤 파티션에 기록할지 결정한다. 이때 고려되는 요소는 다음과 같다:
메시지 키(Key): 메시지가 특정 키를 가지고 있다면, 해당 키를 기반으로 파티션이 결정된다. 이는 동일한 키를 가진 메시지가 항상 동일한 파티션에 저장되어 소비자(Consumer) 측에서 메시지의 순서를 보장하는 데 사용된다.
파티션 수: 토픽의 파티션 개수에 따라 파티셔너의 계산 방식이 달라질 수 있다. 파티션 수는 클러스터의 확장성과 처리량에 영향을 준다.
부하 분산 및 성능 최적화
파티셔너는 클러스터 내 파티션에 메시지를 균등하게 분배하여 부하를 분산시킨다. 이는 특정 파티션이나 브로커에 부하가 집중되는 것을 방지하고, 전체 시스템의 처리량을 향상시킨다.
메시지 순서 보장
동일한 키를 가진 메시지가 동일한 파티션에 저장되도록 함으로써, 소비자는 해당 파티션에서 메시지를 순서대로 읽을 수 있다. 이는 주문 처리나 금융 거래와 같이 메시지의 순서가 중요한 시스템에서 필수적이다.
파티션 전략
Kafka에서는 메시지를 어떤 기준으로 파티션에 할당할지 결정하는 다양한 전략을 제공한다.
기본적으로는 DefaultPartitioner
를 사용하지만, 필요에 따라 사용자 정의 파티셔너를 구현할 수도 있다.
주요 파티션 전략은 다음과 같다
1. 라운드 로빈(Round Robin) 파티셔닝
라운드 로빈 방식은 메시지를 순차적으로 각 파티션에 분배하는 방식이다. 메시지 키가 없는 경우나 null 키를 가진 메시지에 주로 사용된다.
장점
부하 분산: 모든 파티션에 메시지가 고르게 분배되므로 특정 파티션에 부하가 집중되지 않는다.
단순성: 구현이 간단하고 예측 가능하다.
단점
순서 보장 어려움: 특정 키에 대한 메시지 순서를 보장할 수 없으므로, 순서가 중요한 애플리케이션에는 부적합하다.
파티션 수 변경 시 재분배 문제: 파티션 수가 변경되면 메시지의 분배 패턴이 변경될 수 있다.
키 기반 분배가 필요 없는 경우: 메시지의 순서가 중요하지 않고, 단순히 부하를 고르게 분산시키고자 할 때 적합하다.
대규모 데이터 처리: 다양한 키를 가진 메시지가 고르게 분포될 것으로 예상되는 환경에서 효과적이다.
2. 해시 기반(Hash-based) 파티셔닝
해시 기반 파티셔닝은 메시지의 키에 해시 함수를 적용하여 파티션을 결정하는 방식이다. 일반적으로 partition = hash(key) % number_of_partitions
공식을 사용한다.
장점
키 기반 순서 보장: 동일한 키를 가진 메시지는 항상 동일한 파티션에 저장되므로, 메시지의 순서를 보장할 수 있다.
부하 분산: 키가 고르게 분포되어 있다면 파티션 간 부하가 균등하게 분산된다.
단점
파티션 수 변경 시 문제: 파티션 수가 변경되면 해시 값이 재계산되어 기존 키의 파티션 매핑이 달라질 수 있어 데이터 재분배가 필요하다.
해시 충돌 가능성: 특정 키에 대한 해시 충돌이 발생할 경우, 해당 파티션에 부하가 집중될 수 있다.
키 기반 순서가 중요한 경우: 예를 들어, 사용자별 이벤트 로그나 주문 처리 시스템 등에서 동일한 키에 대한 메시지 순서가 중요한 애플리케이션에 적합하다.
키가 고르게 분포되는 경우: 키의 해시 값이 고르게 분포되어 파티션 간 부하가 균등하게 분산될 때 효과적이다.
3. 스티키 파티셔닝(Sticky Partitioner)
Kafka 2.4부터 도입된 스티키 파티셔닝은 배치 단위로 메시지를 동일한 파티션에 전송하여 레코드 집합의 효율성을 높이는 방식이다. 이는 메시지를 일정 크기나 배치 단위로 그룹화하여 동일 파티션에 전송한다.
장점
성능 향상: 동일한 파티션으로의 연속적인 전송으로 인해 브로커와의 통신 횟수를 줄일 수 있다.
효율적인 배치 처리: 배치 단위로 메시지를 처리하여 처리량을 높일 수 있다.
단점
부하 불균형 가능성: 장기간 동일한 파티션을 사용하면 특정 파티션에 부하가 집중될 수 있다.
순서 보장 문제: 배치 단위로 전송되므로, 개별 메시지의 순서 보장이 어려울 수 있다.
높은 처리량이 요구되는 경우: 대규모 데이터 스트림을 효율적으로 처리하고자 할 때 유용하다.
통신 비용을 최소화하고자 할 때: 브로커와의 통신 횟수를 줄여 성능을 최적화하고자 할 때 적합하다.
Last updated