파티셔너(Partitioner)란
본문은 인프런의 [데브원영]아파치 카프카 for beginners 강의를 듣고 정리한 내용입니다.
파티셔너(Partitioner)란?
프로듀서가 데이터를 보내면 부조건 파티셔너를 통해서 브로커로 데이터가 전송된다.
파티셔너는 데이터를 어떤 파티션에 넣을지 결정하는 역할을 한다.
레코드에 포함된 메시지 키와 값에 따라서 파티션의 위치가 결정된다.
프로듀서를 사용할 때 파티셔너를 따로 설정하지 않으면, UniformStickyPartitioner 로 설정된다.
UniformStickyPartitioner
메시지 키의 존재 유무에 따라 다르게 동작한다.
-
메시지 키가 있는 경우
메시지 키를 가진 레코드는 파티셔너에 의해서 특정한 해시값이 생성된다.
이 해시값을 기준으로 어느 파티션으로 들어갈지 정해진다.
토픽에 파티션이 2개가 있는 경우, 파티셔너의 해시로직에 의해서 키값에 따라 다른 파티션에 들어가게 된다.
-
동일한 메시지 키값을 가진 레코드는 동일한 해시값을 만들기 때문에 항상 동일한 파티션에 들어가는 것을 보장한다.
이로 인해, “순서를 지켜서 처리할 수 있다”는 장점이 있다.
-
파티션 한 개의 내부에서는 큐처럼 동작하기 때문에 순서를 지킬 수 있는 것이다.
-
메시지 키가 없는 경우
메시지는 라운드 로빈으로 파티션에 들어가게 된다.
전통적인 라운드 로빈 방식과는 조금 다르게 동작하는다.
UniformStickyPartitioner는 프로듀서에서 배치로 모을 수 있는 최대한의 레코드들을 모아서 파티션으로 데이터를 보내게 된다.
이렇게 배치단위로 데이터를 보낼 때, 라운드 로빈 방식으로 돌아가면서 파티션에 적절히 분배되어 데이터를 넣게 된다.
커스텀 파티셔너
기본 파티셔너 외에 직접 개발한 파티셔너도 프로듀서에서 설정하여 사용할 수 있다.
카프카에서는 커스텀 파티셔너를 만들 수 있도록 Partitioner 인터페이스를 제공한다.
Partitioner 인터페이스를 사용해서 커스텀 파티셔너 클래스를 만들면 메시지 키 또는 메시지 값 또는 토픽 이름에 따라서 어느 파티션에 데이터를 보낼 것인지 정할 수 있다.
언제 커스텀 파티셔너를 사용할까?
예를 들면 VIP 고객을 위해서 데이터 처리를 조금 더 빠르게 하는 로직을 생각해볼 수 있다.
VIP 고객의 데이터를 파티셔너를 통해서 처리량을 더 늘릴 수 있다.
10개의 파티션이 있다고 가정할 때, 커스텀 파티셔너를 만들어서 8개 파티션에는 VIP 고객의 데이터, 2개의 파티션에는 일반 고객의 데이터를 넣는 방식으로 VIP 고객에게 몰아주는 형태로 개발할 수 있다.
AMQP 기반 메시징 시스템의 우선순위 큐를 만드는 것과 비슷하다고 보면 된다.