kafka partitioner 란? (producer, consumer)
카프카에는 파티셔너에서 선택할수있는 몇 가지 전략이 존재한다.
이는 파티셔너에서 파니션으로 데이터를 분배해주게 되는데, 이때 어떤 방식으로 파티션에 분배할지에 대한 선택이다.
먼저 프로듀서가 무엇인지 부터 알아보자.
카프카의 프로듀서란 ?
카프카에서 프로듀서란 데이터를 생성해서 카프카 클러스터에 데이터를 보내어 큐에 쌓게 하는 역활을 한다.
프로듀셔는 카프카로 데이터를 전송할때 내부적으로 직렬화 → 분할→ 압축 단계를 거처 Accumulator 공간에 쌓여 있다가 Batch 형태로 브로커에 전송된다. 전체 적인 그림으로 보면 다음과같다.
ProducerRecode 라는 클레스로 프로듀서를 만들어 send() 메세지를 보내면
- 첫째 직렬화 한다.
- 둘째 파티셔닝 한다.
- 셋째 압축한다.
이때 기본 파티셔너를 사용하고 Key 값을 넣었을때 Producer 는 key 값을 해쉬화 하고 같은 값에 대해서는 동일한 partition 으로 들어가도록 한다. 만약 key 값이 없다면 라운드로빈 방식으로 동일하게 분배 해준다. 이후 어큐물레이터(Accumulator) 버퍼안에 머물다가 batch size, 혹은 timer 설정에 의해 특정값이 되면 Single Thread 에 의해 클러스터노드로 전달 된다.
프로듀셔내의 파티셔너 란?
위 그림에서 보았듯이 프로듀서 안에서 내부적으로 파티셔너가 있다. 이 파티셔너의 기본파티셔너는 key 값이 같을때 (프로듀서에 key를 넣으면 Hash 값으로 만들어 둔다.) 동일한 파티션으로 데이터가 이동하고, key 값이 없을때는 라운드로빈 방식으로 파티션에 전달된다.
partitioner key 는 이미 만들어진 몇가지 방식이 있으며, 커스텀하게 사용자가 변경할수있도록 인터페이스도 제공해 준다.
프로듀서에서 제공되는 파티셔너는 다음과 같다.
- DefaultPartitioner - 기본
- RoundRobinPartitioner(
org.apache.kafka.clients.producer.RoundRobinPartitioner
) - UniformStickyPartitioner
- RandomPartitioner(
org.apache.kafka.clients.producer.UniformStickyPartitioner
)
컨슈머에서 제공되는 파티셔너는 다음과 같다.
- RangeAssignor (
org.apache.kafka.clients.consumer.RangeAssignor
) -기본 - RoundRobinAssignor (
org.apahce.kafka.clients.consumer.RoundRobinAssignor
) - RoundRobinAssignor2(
org.apahce.kafka.clients.consumer.RoundRobinAssignor2
) - StickyAssignor(
org.apache.kafka.clients.consumer.StickyAssignor
) - StickyAssignor2
Partitioner 는 Producer 와 Consumer 측에 각자 따로 존재하는데, 역활은 쉽게 말해 다음과 같다.
Producer 의 partitioner 는 데이터들가 토픽의 어느 파티션으로 들어가게 할것인가 결정 하는것이고,
Consumer의 partitioner 는 그룹에 속한 컨슈머들이 어떤 파티션을 바라보게 할 것인가에 대한 설정 전략이다.
그림을 좀더 쉽게 양방향으로 그려보면 다음과 같다.
Producer 와 Consumer 가 Topic 을 바라보며 데이터를 가져가는 Partitioner 전략
producer 와 consumer 에 각자의 partitioner 가 존대한다.
producer 의 partitioner 는 topic 의 어느 partition0~partition2 으로 분배할지에 대해 결정하는 곳이다.
consumer 의 partitioner assignment strategy 는 그룹에 속한 컨슈머가 어떤 컨슈머를 바라볼지에 대한 설정을 하는 곳이다.
오류케이스
org.apache.kafka.common.errors.InconsistentGroupProtocolException -> error
→ 다른 컨슈머나, 프로듀서에서 동일한 partition assignment strategy 전략을 가지고 구동될때 나타나는 오류로 전략을 동일하게 맞춰 주도록 한다.
참고
[Kafka 101] 카프카 프로듀서 (Kafka Producer)
'MessageQueue > Kafka' 카테고리의 다른 글
kafka 설치 (Single mode) (0) | 2023.06.09 |
---|---|
브로커? 파티션과, 리플리케이션, ISR 이란? (0) | 2023.06.09 |
kafka ack mode 란? (0) | 2023.06.08 |
Message Queue 처리 구조에 따른 종류 (0) | 2023.06.02 |
Event broker 와 Message broker 란? (0) | 2023.06.02 |