티스토리 뷰
728x90
sticky partitioner 전략
https://www.confluent.io/blog/apache-kafka-producer-improvements-sticky-partitioner/
키가 없는 모든 레코드를 보낼 단일 파티션을 지정해놓고 거기로만 보내는 방식
스티키 파티셔너(Sticky Partitioner)는 키가 없는 레코드들을 작은 배치로 나누는 문제를 해결하기 위해, 모든 키가 없는 레코드들을 하나의 파티션에 전송하도록 설계되었습니다. 해당 파티션의 배치가 가득 차거나 완료되면, 스티키 파티셔너는 무작위로 새로운 파티션을 선택하고 해당 파티션에 "고정(stick)" 합니다. 이 방식으로, 긴 시간 동안 모든 파티션에 레코드가 대략 고르게 분산되면서도, 더 큰 배치 크기를 활용할 수 있는 이점을 제공합니다.
public interface Partitioner extends Configurable, Closeable {
/**
* 주어진 레코드에 대해 파티션을 계산합니다.
*
* @param topic 토픽 이름
* @param key 파티션에 사용할 키 (키가 없을 경우 null)
* @param keyBytes 파티션에 사용할 직렬화된 키 (키가 없을 경우 null)
* @param value 파티션에 사용할 값 (값이 없을 경우 null)
* @param valueBytes 파티션에 사용할 직렬화된 값 (값이 없을 경우 null)
* @param cluster 현재 클러스터 메타데이터
*/
int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
1. 파티션 선택 과정
Kafka의 파티셔너는 ProducerRecord에 포함된 정보와 클러스터 메타데이터를 사용해 메시지를 보낼 파티션을 결정합니다.
일반적으로 파티션을 결정하는 방법은 다음과 같습니다:
a. 키가 있는 경우
- 키를 해싱하여 파티션 결정:
- 프로듀서가 키를 포함한 메시지를 보낼 경우, Kafka는 해당 키를 기반으로 특정 파티션을 계산합니다.
- 기본적으로 hash(key) % partitionCount 공식을 사용하여 키를 파티션에 매핑합니다.
- 키가 동일하면 항상 같은 파티션에 메시지가 전달되므로 데이터 로컬리티를 유지할 수 있습니다.
int partition = Math.abs(key.hashCode()) % partitionCount;
- 해당 파티션의 리더 브로커로 메시지 전송:
- 계산된 파티션 번호를 통해, 클러스터 메타데이터에서 해당 파티션의 리더 브로커를 조회합니다.
- 메시지는 리더 브로커로 전송됩니다.
b. 키가 없는 경우
- 라운드 로빈(Round Robin) 방식:
- 기본 파티셔너는 키가 없을 경우, 파티션을 순차적으로 선택하여 메시지를 분산시킵니다.
- 이는 메시지를 클러스터의 모든 파티션에 균등하게 분산시키는 효과를 줍니다.
- 스티키 파티셔너(Sticky Partitioner):
- Kafka 2.4.0부터 도입된 스티키 파티셔너는 키가 없는 경우에도 하나의 파티션에 메시지를 배치하여 배치 크기를 최적화합니다.
- 배치가 완료되면 다른 파티션으로 전환합니다.
- 이를 통해 네트워크 오버헤드를 줄이고, 전송 효율을 높입니다.
728x90
'Kafka' 카테고리의 다른 글
[카프카] 컨슈머 그룹 코디네이터 (0) | 2025.03.19 |
---|---|
[카프카] 컨슈머가 데이터를 읽어오는 방식 (0) | 2025.03.17 |
[카프카] bootstrap server 연결 구조 (0) | 2025.03.12 |
[카프카] 프로듀서 (0) | 2025.03.10 |
[카프카] 카프카 커넥트, 커넥터 (0) | 2025.03.09 |
댓글
300x250
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 카프카
- 리눅스 컨테이너
- 대규모 데이터 처리
- 샤딩
- pods
- php
- Infra
- k8s
- index
- docker
- mongoDB
- laravel 테스트코드
- 분산처리
- devops
- springboot
- MySQL
- 쿠버네티스
- Container
- NoSQL
- kubernetes
- mockery
- phpUnit
- laravel
- 라라벨
- kafka
- database
- java
- 몽고디비
- laravel 테스트
- JUnit
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함