관리 메뉴

IT.FARMER

kafka partitioner 종류와 전략 (producer) 본문

MessageQueue/Kafka

kafka partitioner 종류와 전략 (producer)

아이티.파머 2023. 6. 12. 14:16
반응형

kafka partitioner 종류와 전략 (producer)

1. Kafka Producer의 Partition 종류

카프카 프로듀서에는 몇 가지 파티션분배 전략이 존재한다.

이중 자주사용되거나 중요한 몇가지에 대해서만 이야기 해보자 .

  • DefaultPartitioner - 기본(org.apache.kafka.clients.producer.DefaultPartitioner)
    • 메세지의 키 또는 라운드 로빈 방식에 따라 메세지를 토픽의 파티션에 할당한다.
    • 동일한 키는 항상 동일한 파티션으로 분배되도록 하고, 키가없는 경우에만 라운드로빈으로 된다.
    • 메세지 처리시 순서보장은 하지 않는다.
    이전략은 일반적으로 키가 랜덤하게 생성되는경우에 사용할수있다.
  • RoundRobinPartitioner(org.apache.kafka.clients.producer.RoundRobinPartitioner)
    • 이름에서도 볼수있듯이 들어온순서에 따라 균등하게 토픽의 파티션으로 분배해준다.
    → 이 전략은 파티션간에 균등분배를 할때 유용할 것이다.
  • UniformStickyPartitioner(org.apache.kafka.clients.producer.UniformStickyPartitioner)
    • 디폴트 파니셔너와 기능이 비슷해보이지만 다르다. 메세지의 키를 해싱해서 파티션을 선택하고, 선택된 파티션을 유지하는 특징이 있다. 동일한 키에대해서는 항상 동일한 파티션으로 메세지를 보낸다.
    • 이를 통해 동일한 키의 메세지는 항상 같은 파티션에 도착함으로 순차적으로 처리가 가능하다.
    → 특정키를 지정하고 순차적으로 처리하고자 할때 유용할 것이다.
  • RandomPartitioner(org.apache.kafka.clients.producer.UniformStickyPartitioner)
    • 메세지의 키를 무작위로 선택하여 파티션에 할당한다 → 여러 파티션으로 고르게 분산된다 → 처리량을 규현있게 분산 할 수있다.

 

2. Partitioner 전략 선택

유니폼스티키 파니셔너는 라운드로빈파티셔너가 좀더 발전된 형태라고 한다. 라운드로빈에서는 프로듀서에서메세지 발생지 들어오는 순서대로 파티션을 순회하며 전송하기 때문에 배치로 묶이는 빈도수가 적다. 이는 메세지 발생 빈도수가 높을수록 성능상 높은 리소스를 사용 할수 밖에 없다. 또한 라운드로빈의 겨우엔 순차적으로 파티셔너에 고루 분배하기때문에 어큐물레이터안의 배치 묶음을 보면 하나의 배치에 여러 파티셔너가 뒤섰여 있다.

유니폼스티키는 이를 개선한것으로 프로듀서에서 들어온 데이터를 어큐물레이터에서 가지고있다가 배치로 파티셔너에 분배하게 되는데 같은 키를 가진 데이터들끼리 배치로 묶어두고 특정 파티션으로 보내기때문에 성능이 더 좋다.

 

 

그림으로 보면 다음과 같다.

 

RoundRobinPartitioner

Accumulator buffer 안에 보면 batch#1~ batch#3 이라는 배치가 있을때, ProducerRecode 를 통해 전송된 데이터는 파티션  partition#1~partition#3 에순서대로 고르게 분배된다.  이때 batch 시스템에 의해 데이터는 보내지게 되는데 Batch#1~Batch3 을 보면 배치않에 파티션 1~3의 데이터가 뒤썩여 있다. RoundRobinPartitioner 는 이로인해 실행 순서가 보장되지 않음을 참고해야 한다.

 

UniformStickyPartitioner

UniformStickyPartition 의 경우엔  RoundRobinPartition 과 동일하나 좀더 개선된 버전으로, Batch 쪽을 봄면 알 수 있다. 파티션이 같은 데이터들끼리 Batch에 모아두어 Kafka Cluster 로 보낼때 RoundRobin 보다 적은 리소스를 사용한다.

또한 Hashing된 Key로 인해 같은 키값을 가진 데이터는 똑같은 Partiotion으로 보내짐으로 데이터 순차처리가 가능하다.

그림으로 보면 다음과 같다.

같은 키를 가진 데이터들은 같은Partiotion의 Batch에 위치하게 된다.  이럼으로 순차 처리가 가능하다. 

 

결론적으로 생각해보면, 단순히 분산처리가 고루될수 있도록 하고자 할때는 라운드로빈파티셔너를 이용하고, 특정 부분키를 이용하여 순차처리를 하고자 할때는 유니폼스트키파티셔너를 이용하면 원하는 결과를 얻을수 있다.

 

개인적인 프로젝트에서는 API를 고루 분산시켜 수집해되는시스템으로  RoundRobinPartition을 사용중이다.

 

반응형