[Kafka] Partitioner

1. Partitioner

  • 프로듀서가 데이터를 보내면 무조건 파티셔너를 통해서 브로커로 데이터가 전송됩니다.

스크린샷 2021-08-16 오후 7 18 48

  • 파티셔너는 데이터를 토픽의 어떤 파티션에 넣을지 결정하는 역할을 합니다.
  • 레코드에 포함된 메시지 키 또는 메시지 값에 따라 파티션의 위치가 결정되게 됩니다.
  • 프로듀서를 사용할 때 파티셔너를 따로 설정하지 않으면 UniformStickyPartitioner로 설정이 됩니다. 이 파티셔너는 메시지 키가 있을 때와 없을 때 다르게 동작하게 됩니다.
    • 메시지 키가 있는 경우
      • 메시지 키를 가진 레코드는 파티셔너에 의해서 특정한 해쉬값이 생성됩니다.
      • 이 해쉬값을 기준으로 어느 파티션으로 들어갈지 정해지게 됩니다.
      • 동일한 메시지 키를 가진 레코드는 동일한 해쉬값을 가지기 때문에 항상 동일한 파티션에 들어갑니다. -> 순서를 지켜서 데이터를 처리할 수 있는 장점이 생깁니다.
    • 메시지 키가 없는 경우
      • 라운드 로빈으로 파티션에 들어가게 됩니다. (전통적인 방식과는 약간 다릅니다.)
      • 프로듀서에서 배치로 모을 수 있는 최대한의 레코드를 모아서 파티션으로 데이터를 보내게 됩니다.
      • 배치단위로 데이터를 보낼 때 파티션에 RR 방식으로 데이터를 넣게 됩니다.
      • 쉽게 말해, 파티션에 적절히 분배된다고 생각하면 됩니다.

2. 기본 파티셔너만 사용할 수 있을까?

  • 직접 개발한 파티셔너도 프로듀서에서 설정 할 수 있습니다.
  • 카프카에서는 커스텀 파티셔너를 만들 수 있도록 Partitioner 인터페이스를 제공하고 있습니다.
  • Partitioner 인터페이스를 사용해서 커스텀 파티셔너 클래스를 만들면 메시지 키 또는 메시지 값, 또는 토픽 이름에 따라서 어느 파티션에 데이터를 보낼 것인지 정할 수 있습니다.
  • VIP 고객을 위해 데이터 처리를 조금 더 빨리 할 때 사용 할 수 있을 것입니다.
    • 기본적으로 10개의 파티션이 있다고 할 때, 커스텀 파티셔너를 통해서 8개는 VIP 고객의 데이터를, 2개의 파티션에는 일반 고객의 데이터를 넣는 방법을 사용 할 수 있을 것입니다.