카프카 컨슈머는 토픽의 파티션과 매칭하여 레코드를 가져옵니다. 파티션을 매칭하는 기준은 컨슈머 파티션 어사이너의 기준을 따릅니다.
컨슈머 파티션어사이너 인터페이스는 아래 링크에서 확인할 수 있습니다. https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/consumer/ConsumerPartitionAssignor.html
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
CooperativeStickyAssignor
코퍼레이티브 스티키 어사이너는 스티키 어사이너와 유사하지만 coopertive rebalancing을 지원합니다. 이 어사이너를 사용하려면 2.3 이상의 브로커와 클라이언트를 사용해야 합니다. 관련 상세 내용은 아래 링크에서 확인할 수 있습니다. https://kafka.apache.org/25/javadoc/org/apache/kafka/clients/consumer/CooperativeStickyAssignor.html
'빅데이터 > Kafka' 카테고리의 다른 글
카프카 커넥트 JMX + 로그스태시로 모니터링 하기 (0) | 2020.09.24 |
---|---|
kafka connect 로그를 logstash로 수집하기 + grok 설정(multiline) (0) | 2020.09.23 |
스프링 카프카 메시지 리스너 2가지 구현 방법 (0) | 2020.07.23 |
카프카 프로듀서 파티셔너 종류 및 정리(2.5.0 기준) (1) | 2020.07.23 |
컨슈머 스레드가 많다고 처리량이 높을까? 아닐까? 컨텍스트 스위칭으로 인한 예외 상황 (0) | 2020.07.22 |
kafka connector distributed 모드로 fileSourceConnector 실행 (2) | 2020.07.21 |