1.시스템&인프라/Apache Kafka

6. Kafka 프로듀서 파티션 할당 방식(Round Robin vs Sticky 비교)

쿼드큐브 2025. 3. 28. 22:15
728x90
반응형

Kafka 프로듀서는 메시지를 토픽의 파티션에 할당하여 전송합니다. 이 글에서는 Kafka 클러스터의 메타데이터 구조, 프로듀서의 메시지 전송 흐름, 다양한 파티션 할당 방식(Default, Round Robin, Sticky, Custom), 그리고 Kafka 2.4 이후 적용된 Sticky Partitioner의 특징과 효과를 설명합니다.

 

Kafka 프로듀서 파티션 할당 방식(Round Robin vs Sticky 비교)

 

목차

1. Kafka 프로듀서와 파티션의 관계

2. Kafka의 메타데이터 기반 메시지 흐름

3. Kafka 프로듀서 메시지 전송 단계별 흐름

4. Kafka의 파티션 할당 방식 4가지 : Partitioner 유형

5. Round Robin vs Sticky Partitioner 비교

관련 글 링크

 

 

1. Kafka 프로듀서와 파티션의 관계

Kafka에서 메시지는 특정 토픽에 기록되며, 하나의 토픽은 여러 개의 파티션(Partition)으로 나뉩니다.
프로듀서가 생성한 메시지는 반드시 하나의 파티션에 저장되며, 각 파티션은 클러스터 내의 하나의 리더 브로커가 담당합니다.

중요한 점은, 같은 파티션에 기록된 메시지의 순서는 보장되지만 파티션 간에는 순서가 보장되지 않는다는 것입니다.
따라서, 파티션을 어떻게 할당하느냐는 데이터 일관성과 처리 성능에 큰 영향을 줍니다

 

 

2. Kafka의 메타데이터 기반 메시지 흐름

Kafka 클러스터는 모든 브로커가 토픽, 파티션, 리더 정보를 포함한 메타데이터를 공유합니다.
덕분에 프로듀서나 컨슈머는 클러스터 내 어떤 브로커에 접속해도 동작이 가능합니다.

프로듀서 메시지 전송 흐름

  1. 클러스터 내 임의 브로커에 접속
  2. 토픽의 메타데이터 조회 (어떤 파티션이 어떤 브로커에 있는지)
  3. 해당 파티션의 리더 브로커 식별
  4. 메시지를 직접 리더 브로커에 전송

이러한 구조는 고가용성과 부하 분산을 자연스럽게 만들어 줍니다.

 

 

3. Kafka 프로듀서 메시지 전송 단계별 흐름

Kafka 프로듀서가 메시지를 생성하고 전송하기까지의 내부 동작을 5단계로 설명합니다.

Kafka 프로듀서 메시지 전송 단계별 흐름

 

1. 메시지 생성

Kafka 프로듀서는 Key-Value 쌍으로 메시지를 생성합니다.

  • Key: 파티션 선택에 영향 (선택 사항)
  • Value: 실제 데이터
  • Topic: 메시지가 저장될 주제
{
  "key": "truck_01",
  "value": "{ 'temp': 27, 'speed': 80 }"
}

 

2. 직렬화(Serialization)

Kafka는 네트워크로 메시지를 전송하기 위해 데이터를 바이트 배열로 변환합니다.

  • Key → KeySerializer 사용
  • Value → ValueSerializer 사용

3. 파티션 결정

이 단계에서 메시지를 어느 파티션에 보낼지 결정합니다.
이때 Partitioner가 핵심 역할을 하며, Key 존재 여부에 따라 동작 방식이 달라집니다.

Key 존재 여부 파티션 결정방식
Key가 있음 Key를 기반으로 특정 파티션을 결정 , hash(key) % partition_count
Key가 없음 Round Robin 또는 Sticky Partitioner (Kafka 2.4 이후)

 

4. 메시지 배치 (Batching)

Kafka는 RecordAccumulator라는 내부 버퍼에 메시지를 모아 배치 단위로 전송합니다.
이를 통해 전송 횟수를 줄이고 성능을 높일 수 있습니다.

배치 기준: 설정된 batch.size 또는 linger.ms 시간 경과

 

5. 리더 Broker 로 전송

파티션이 결정되면 해당 파티션을 호스팅하는 리더 브로커에 메시지를 전송합니다.
브로커는 메시지를 로그에 저장하고 복제를 통해 데이터 안정성을 확보합니다.

 

 

4. Kafka 파티션 할당 방식 4가지 : Partitioner 유형

Kafka에서는 다양한 파티션 할당 전략을 선택할 수 있으며, Kafka 2.4 이후에는 기본 전략이 변경되었습니다.

Partitioner 종류 설명
Default Partitioner Key가 있으면 해시 기반 할당, 없으면 Sticky 방식
Round Robin Partitioner Key가 없을 경우 순환 방식으로 고르게 분배
Sticky Partitioner Key가 없을 경우 같은 Partition으로 묶어 전송
Custom Partitioner 사용자가 직접 구현하여 특정 로직 적용

 

1. Default Partitioner

Kafka의 기본 파티셔너이며, Key 유무에 따라 동작이 달라집니다.

Key가 있는 경우 – 해시 기반 파티션 할당

  • 메시지에 Key가 포함되어 있으면, Kafka는 해당 Key의 해시값을 계산하여 파티션을 결정합니다.
  • 이 방식은 hash(key) % 파티션 수 공식을 사용하며,
  • 동일한 Key를 가진 메시지는 항상 같은 파티션으로 전송됩니다.
  • 이를 통해 해당 Key의 메시지 순서를 보장할 수 있습니다.

Key가 없는 경우 – Sticky Partitioner 방식 (Kafka 2.4 이상)

  • 메시지에 Key가 없으면 Kafka는 Sticky Partitioner 전략을 사용합니다.
  • Sticky Partitioner는 하나의 배치(batch) 내에서 선택된 하나의 파티션에 모든 메시지를 묶어 전송합니다.
  • 배치가 가득 차거나 설정된 시간(linger.ms)이 지나면 다음 배치에서는 새로운 파티션을 선택합니다.
  • 이는 Round Robin과 달리 배치 단위로 동일한 파티션을 유지함으로써, 네트워크 성능을 최적화합니다.
예를 들어, 각 트럭(truck)의 데이터를 개별적으로 순서대로 저장하고 싶다면 : 
  - 트럭 ID(truck_id)를 메시지 키로 설정하면 됩니다.
  - 예제에서, key=1을 키로 설정하면, 해당 트럭의 데이터는 항상 특정 파티션(Partition 1) 으로 전송됩니다.
  - 이를 통해 각 트럭별 데이터 순서(ordering)를 보장할 수 있습니다.

Default partitioner 예시

 

2. Round Robin Partitioner(2.4 이전 기본)

  • Kafka 2.4 이전 버전에서 Key가 없는 경우, 메시지를 특정 Partition에 할당하는 방식으로 Round Robin Partitioner가 사용되었습니다.
  • 메시지가 순차적으로 각 파티션에 분배됩니다.배치 크기가 작아지면 요청(request) 횟수가 증가하고, 이는 네트워크 부하 증가 및 지연(latency) 상승을 초래할 수 있습니다.
  • Kafka 2.4 이후에는 Sticky Partitioner가 기본 적용되어 Round Robin이 기본 옵션에서 제외되었습니다.

Round Robin Partitioner 예시

 

3. Sticky Partitioner (Kafka 2.4 이후 기본)

  • Key가 없는 경우, 처음 메시지가 도착하면 특정 Partition을 선택하고 해당 배치 내에서 같은 Partition을 유지합니다.
  • 메시지가 계속 쌓이면 하나의 배치(batch) 단위로 묶어 같은 Partition으로 전송합니다.
  • 배치가 꽉 차거나 타임아웃이 발생하면 새로운 Partition을 선택합니다.
  • 이전 Round Robin 방식과 달리, 한 번 선택된 Partition은 배치가 유지되는 동안 변경되지 않습니다.
  • Sticky Partitioner는 성능 최적화를 위해 네트워크 호출을 줄이고 메시지를 효율적으로 배치하는 역할을 합니다.

Sticky Partitioner 예시

 

4. Custom Partitioner (사용자 정의)

특정 비즈니스 요구사항에 맞춰 Partitioner를 직접 구현 가능

public class CustomPartitioner implements Partitioner {
    @Override
    public int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster) {
        int numPartitions = cluster.partitionsForTopic(topic).size();
        
        // VIP 고객은 마지막 Partition에 할당
        if (key != null && key.toString().equals("VIP")) {
            return numPartitions - 1;
        }
        
        return Math.abs(key.hashCode()) % numPartitions;
    }
}

 

 

 

5. Round Robin vs Sticky Partitioner 비교

Sticky Partitioner는 배치 최적화와 성능 향상을 동시에 이끄는 최신 전략입니다.

구분 Round Robin Partitioner Sticky Partitioner
Partition 선택 방 메시지마다 다른 Partition을 순환 배정 배치 단위로 동일한 Partition을 유지
Key가 있을 경우 적용되지 않음 (Key 기반 해시 할당) 적용되지 않음 (Key 기반 해시 할당)
Key가 없을 경우 매 메시지마다 다른 Partition을 선택 배치가 유지되는 동안 같은 Partition에 전송
성능 최적화 매번 다른 Partition으로 전송
→ 네트워크 오버헤드 발생 가능
같은 Partition으로 묶어서 전송하여
네트워크 효율 증가
Kafka 기본 적용 여부 Kafka 2.4 이전 기본 Kafka 2.4 이후 기본

 


Kafka 프로듀서가 메시지를 어떤 파티션에 전송할지는 전체 시스템의 처리 성능과 데이터 순서 유지에 큰 영향을 미칩니다.
Kafka 2.4 이후에는 Sticky Partitioner가 기본값으로 채택되어, 네트워크 효율과 처리 성능을 동시에 만족시킬 수 있게 되었습니다.

Key를 적절히 사용하면 특정 기준에 따라 데이터를 분산시키거나 순서를 보장할 수도 있습니다.

 

관련 글 링크

2025.03.28 - [1.시스템&인프라/Apache Kafka] - 2. Kafka 단일 노드 동작 원리: 파티션 분배부터 Consumer 전략까지

2025.03.28 - [1.시스템&인프라/Apache Kafka] - 4. Kafka 클러스터 다중 파티션 구성 이해: 고가용성과 장애복구

 

 

728x90
반응형