본문 바로가기

빅데이터/Kafka

카프카 컨슈머 파티셔너 종류 및 정리(2.5.0 기준)

카프카 컨슈머는 토픽의 파티션과 매칭하여 레코드를 가져옵니다. 파티션을 매칭하는 기준은 컨슈머 파티션 어사이너의 기준을 따릅니다. 

컨슈머 파티션어사이너 인터페이스는 아래 링크에서 확인할 수 있습니다. https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/consumer/ConsumerPartitionAssignor.html

 

ConsumerPartitionAssignor (kafka 2.5.0 API)

 

kafka.apache.org

RangeAssignor

기본 설정되는 파티션 어사이너입니다. 토픽의 파티션을 숫자기준으로 나열하고, 컨슈머의 이름을 사전순으로 나열한 뒤에 배정하는 정확히 반으로 나누어 배정합니다. 만약 딱 반으로 안나뉘어지는 홀수개의 파티션을 나눌 경우에는 앞쪽 순서의 컨슈머가 파티션을 더 많이 할당합니다.

예를들어 파티션이 3개인 토픽(p0, p1, p2)과 컨슈머가 2개(c0, c1)가 있다고 가정해 봅시다. 파티션 3개를 컨슈머에 분배하려면 2개와 1개를 배분해야 합니다. 앞쪽 순서의 컨슈머는 파티션을 2개 가지게 됩니다. 이로 인해 아래와 같이 매칭됩니다.

RoundRobinAssignor

라운드-로빈 어사이너는 파티션을 컨슈머에 번갈아가며 할당하는 방식입니다. 

예를들어 파티션이 3개인 토픽(p0, p1, p2)과 컨슈머 2개(c0, c1)가 있다고 가정해 봅시다. 파티션 3개를 컨슈머에 분배하는데 파티션 순서를 번갈아 가면서 할당하게 되어 아래와 같이 매칭됩니다.

라운드-로빈 어사이너를 사용할 경우 특정 상황에서는 일부 컨슈머에 파티션이 몰릴 수도 있습니다. 예를들어 파티션이 1개인 토픽, 2개인 토픽, 3개인 토픽이 있고 3개의 컨슈머가 각각 토픽 1번, 토픽 2번, 토픽 3번을 매칭하면 아래와 같이 라운드-로빈 로직으로 인해 일부 컨슈머에 파티션이 몰릴 수 있으므로 주의해야 합니다.

StickyAssignor

스티키 어사이너는 두가지 목적으로 사용됩니다. 첫번째는 최대한 파티션을 균등하게 매칭하기 위함입니다.  균등하게 매칭이라고 뜻하는것은 아래와 같은 정책을 내포합니다.

- 컨슈머에 매칭된 파티션의 개수가 최대 1개 이상을 넘지 않도록 합니다.
- each consumer that has 2+ fewer topic partitions than some other consumer cannot get any of those topic partitions transferred to it.

두번째는 리밸런싱이 일어날 경우 최대한 파티션의 이동을 줄이는데 목적이 있습니다. 파티션 매칭 이동을 줄이면 리밸런싱 발생시 오버헤드를 줄일 수 있습니다. 

스티키 어사이너를 사용할 경우 최대한 균등하게 파티션을 컨슈머에 나눕니다. 라운드로빈과 비슷하다고 생각할수도 있지만 실제로 동작은 그렇지 않습니다. 그리고 리밸런싱 발생시에 동작이 다름을 확인할 수 있습니다.

예를 들어 3개의 컨슈머가 있고 3개의 토픽(각각 1개, 2개, 3개 파티션 보유)이 있다고 가정해봅시다. 라운드 로빈 어사이너로 분배했을 경우에는 이전 예시와 같이 몰리는 현상이 발생할 수 있지만 스티키 파티셔너의 경우 다르게 동작하여 아래와 같이 매칭되는 것을 확인할 수 있습니다.

추가적으로 스티키 어사이너를 사용할 경우 이미할당된 파티션의 대부분이 남아있다는 특징을 리밸런스 리스너에서 활용할 수 있습니다. 관련 내용은 아래 링크에서 확인할 수 있습니다. https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/consumer/StickyAssignor.html

 

StickyAssignor (kafka 2.5.0 API)

The sticky assignor serves two purposes. First, it guarantees an assignment that is as balanced as possible, meaning either: the numbers of topic partitions assigned to consumers differ by at most one; or each consumer that has 2+ fewer topic partitions th

kafka.apache.org

CooperativeStickyAssignor

코퍼레이티브 스티키 어사이너는 스티키 어사이너와 유사하지만 coopertive rebalancing을 지원합니다. 이 어사이너를 사용하려면 2.3 이상의 브로커와 클라이언트를 사용해야 합니다. 관련 상세 내용은 아래 링크에서 확인할 수 있습니다. https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/consumer/CooperativeStickyAssignor.html

 

CooperativeStickyAssignor (kafka 2.5.0 API)

A cooperative version of the AbstractStickyAssignor. This follows the same (sticky) assignment logic as StickyAssignor but allows for cooperative rebalancing while the StickyAssignor follows the eager rebalancing protocol. See ConsumerPartitionAssignor.Reb

kafka.apache.org