프로듀서는 Kafka 토픽과 파티션에 데이터를 전송하는 역할을 한다. 중요한 점은 프로듀서가 메시지를 어떤 파티션에 기록할지 미리 결정한다는 것이다. 많은 사람들이 Kafka 서버가 이 결정을 한다고 오해하지만, 실제로는 프로듀서가 이 결정을 담당한다.
예를 들어, Topic-A라는 토픽에 파티션 0, 1, 2가 있다면, 프로듀서는 각 메시지가 어떤 파티션으로 갈지 결정하고 데이터를 전송한다. 또한 프로듀서는 특정 파티션에 장애가 발생했을 때 어떻게 복구할지도 알고 있다.
Kafka의 강점 중 하나는 로드 밸런싱 메커니즘을 통해 모든 파티션에 걸쳐 데이터를 분산시킨다는 점이다. 토픽 내에 여러 파티션을 두고, 각 파티션이 하나 또는 여러 프로듀서로부터 메시지를 받을 수 있기 때문에 Kafka는 효과적으로 스케일링된다.
프로듀서가 보내는 메시지에는 메시지 키를 포함할 수 있다. 이 키는 선택사항이며, 문자열, 숫자, 바이너리 등 다양한 형태가 될 수 있다.
메시지 키에 따라 파티션 할당이 달라진다:
키가 null인 경우, Kafka 버전에 따라 다른 전략이 적용된다:
라운드 로빈은 프로세스나 데이터를 순차적으로 돌아가며 균등하게 분배하는 알고리즘이다.
주요 특징:
장점:
단점:
스티키 파티셔너는 카프카 2.4 버전부터 도입된 파티셔닝 알고리즘으로, 기존 라운드 로빈 방식의 단점을 개선하기 위해 설계되었다.
주요 특징:
장점:
단점:
라운드 로빈은 모든 파티션에 균등하게 메시지를 분배하는 반면, 스티키 파티셔너는 배치 처리를 통해 효율성을 높인다. 라운드 로빈은 메시지 전송 요청이 들어오는 대로 파티션을 순회하면서 전송하지만, 스티키 파티셔너는 배치로 레코드를 묶어서 한 번에 전송한다.
파티션 수가 많아질수록 두 방식의 성능 차이는 더욱 커지며, 스티키 파티셔너가 더 나은 성능을 보인다. 카프카 3.4 버전부터는 파티션 불균형 문제를 해결하기 위해 Strictly Uniform Sticky Partitioner가 도입되었다.
결론적으로, 처리량과 효율성이 중요한 시스템에서는 스티키 파티셔너가 더 적합하며, 균등한 분배가 중요한 시스템에서는 라운드 로빈이 더 적합할 수 있다.
Confluent의 성능 테스트에 따르면, 스티키 파티셔너는 다음과 같은 성능 향상을 보여준다:
특히 linger.ms
값이 설정된 경우(예: 1,000ms), 스티키 파티셔너는 기존 방식보다 최대 5배 낮은 지연 시간을 보여준다.
Kafka의 Default 파티셔너는 키가 null이 아닌 경우 다음과 같은 방식으로 파티션을 결정한다:
targetPartition = Utils.toPositive(Utils.murmur2(keyBytes)) % numPartitions
이 과정을 "키 해싱(Key Hashing)"이라고 하며, 다음과 같은 특징이 있다:
numPartitions
가 포함되어 있어, 토픽의 파티션 수가 변경되면 키-파티션 매핑이 바뀐다.중요: 토픽에 파티션을 추가하면 기존 키-파티션 매핑이 변경될 수 있으므로, 키 순서가 중요한 경우 파티션을 추가하는 대신 새 토픽을 생성하는 것이 좋다.
예를 들어, 트럭의 위치 데이터를 추적하는 시스템에서 truck_id
를 키로 사용한다면, truck_id_123
의 모든 메시지는 항상 같은 파티션(예: 파티션 0)으로 전송된다. 이렇게 하면 특정 트럭의 데이터를 순서대로 읽을 수 있다.
Kafka 메시지는 다음과 같은 구성 요소를 가진다:
Kafka는 바이트 형태로만 데이터를 주고받는다. 따라서 프로듀서는 객체나 데이터를 바이트로 변환하는 직렬화 과정이 필요하다.
예를 들어:
이를 Kafka로 전송하기 위해 직렬화가 필요하다:
1. KeySerializer
를 IntegerSerializer
로 지정하여 123을 바이너리로 변환
2. ValueSerializer
를 StringSerializer
로 지정하여 "hello world"를 바이너리로 변환
Kafka는 다양한 기본 Serializer를 제공한다:
Kafka는 파티셔너라는 코드 로직을 사용하여 메시지가 어떤 파티션으로 갈지 결정한다. 프로듀서가 send()
를 호출하면, 파티셔너가 레코드를 확인하고 적절한 파티션을 지정한다.
기본 Kafka 파티셔너는 murmur2 알고리즘을 사용하여 키를 해싱한다. 이 알고리즘은 키의 바이트를 분석하여 어떤 파티션으로 메시지를 전송할지 결정한다.
이 내용은 고급 주제이므로 완전히 이해하지 못해도 걱정하지 말자 중요한 점은 프로듀서가 키를 기반으로 메시지의 목적지 파티션을 결정한다는 것이다.
Kafka 프로듀서에 대한 이해는 효과적인 메시징 시스템을 구축하는 데 중요한 기초가 된다.