Apache Kafka ‐ Kafka Topic Producer Consumer - thought-corner/Backend-PlayGround GitHub Wiki

Topic과 Partition 그리고 카프카 병렬 분산 처리 개요

  • Topic은 Partition으로 구성된 일련의 로그 파일이다.
  • Topic은 Key-Value기반의 메시지 구조이며, Value로 어떤 타입의 메시지도 가능하다.(문자열, 숫자값, 객체, Json, Avro, Protobuf 등)
  • 로그 파일과 같이 연속적으로 추가되어 발생하는 데이터를 저장하는 구조를 가진다.
  • Topic은 1개 이상의 파티션을 가질 수 있다.
  • Topic의 Partition은 Kafka의 병렬 성능과 가용성 기능의 핵심 요소이며, 메시지는 병렬 성능과 가용성을 고려한 개별 파티션에 분산 저장된다.
  • 개별 파티션은 정렬되고, 변경할 수 없는 일련의 레코드로 구성된 로그 메시지이다.
  • 개별 레코드는 offset이라고 불리는 일련 번호를 할당받는다.
  • 개별 파티션은 다른 파티션과 완전 독립적이다.
  • 개별 파티션 내에서 정렬되고 offset이 할당된다.
  • 메시지는 병렬 성능과 가용성을 고려한 방식으로 토픽 내의 개별 파티션들에 분산 저장되는 형식이다.
  • 또한 토픽의 파티션들은 단일 카프카 브로커뿐만 아니라 여러 개의 카프카 브로커들에 분산 저장된다.

Producer와 Consumer 개요

  • Producer는 Topic에 메시지를 보낸다.
  • Producer는 성능/로드밸런싱/가용성/업무 정합성 등을 고려해 어떤 브로커의 파티션으로 메시지를 보내야할지 전략적으로 결정된다.
  • Consumer는 Topic에서 메시지를 읽어들인다.
  • 여러 개의 Consumer들로 구성될 경우 어떤 브로커의 파티션에서 메시지를 읽을 것인지 전략적으로 결정한다.

Consumer의 auto.offset.reset

  • Consumer가 Topic에 처음 접속해 Message를 가져올 때 가장 초래된 처음 offset부터 가져올 것인지, 가장 최근인 마지막 offset부터 가져올 것인지를 설정하는 파라미터이다.

Producer 객체 직렬화 전송의 이해

  • 객체를 객체 유형, 데이터 포맷, 적용 시스템에 상관없이 이동/저장/복원을 자유롭게 하기 위해 바이트 배열(바이트 스트림, ByteStream) 형태로 저장하는 것을 말한다.
  • 객체는 Serialization과 Deserialization을 통해서 System to System 또는 서로 다른 저장 영역에 이동/저장/복원을 자유롭게 수행한다.
  • Serialization을 통해서 객체가 바이트 스트림으로 변환되어 네트워크를 통해 손쉽게 데이터를 전송할 수 있으며 Deserialization을 통해서 바이트 스트림은 다시 원본 객체로 변환되어 자유로운 객체 데이터 이동을 가능케 한다.

Key값을 가지는 메시지 전송

  • 메시지 Key는 업무 로직이나 메시지 Producer/Consumer 분산 성능 영향을 고려하여 생성한다.
  • 한 가지 주의할 점은 이 메시지 Key가 고유하게 식별하는 용도는 아니다.
  • 특정 Key값을 가지는 메시지는 특정 파티션으로 고정되어 전송된다.
  • 특정 Key값을 가지는 메시지는 단일 파티션 내에서 전송 순서가 보장되어 Consumer에서 읽혀진다.

Key가 없는 메시지 전송

  • 메시지는 Producer를 통해 전송 시 Partitioner를 통해 토픽의 어떤 파티션으로 전송되어야할지 미리 결정된다.
  • Key값을 가지지 않는 경우 Round-Robin, Sticky Partition 등의 파티션 전략 등이 선택되어 파티션별로 메시지가 전송될 수 있다.
  • Topic이 여러 파티션을 가질 때 메시지 전송 순서가 보장되지 않은 채로 Consumer에서 읽혀질 수 있다.

Key가 없는 메시지의 파티션 분배 전략 - Round-Robin과 Sticky Partitioning

라운드 로빈 전략

  • Kafka 2.4 버전 이전 기본 파티션 분배 전략
  • 라운드 로빈 전략은 최대한 메시지를 파티션에 균일하게 분배하는 전략으로 메시지 배치를 순차적으로 다른 파티션으로 전송한다.
  • 메시지가 배치 데이터를 빨리 채우지 못하면서 전송이 늦어지거나 배치를 다 채우지 못하고 전송되면서 전송 성능이 저하되는 문제가 발생한다.

스티키 파티셔닝 전략

  • Kafka 2.4 버전부터 기본 파티션 분배 전략
  • 라운드 로빈의 성능을 개선하고자 특정 파티션으로 전송되는 하나의 배치에 메시지를 빠르게 먼저 채워서 보내는 방식이다.
  • 배치를 채우지 못하고 전송되거나 배치를 채우는데 너무 오래 걸리는 문제를 개선한 방식이다.

Consumer Group과 Consumer

✅ Consumer Group 내에 1개의 Consumer만 있을 경우

✅ Consumer 내에 2개의 Consumer가 있지만 토픽 파티션 개수보다 작을 경우

✅ Consumer Group 내에 파티션 개수와 동일한 Consumer가 있는 경우

✅ Consumer Group 내에 파티션 개수보다 많은 Consumer가 있는 경우

✅ 하나의 토픽을 여러 Consumer Group에서 Subscribe하는 경우

  • 동일한 Consumer Group 내의 Consumer들은 작업량을 최대한 균등하게 분배한다.
  • 서로 다른 Consumer Group의 Consumer들은 분리되어 독립적으로 동작한다.

참고 자료 - 카프카 완벽 가이드(코어편)