Apache Kafka 공부

#9 레코드

박태정 입니다. 2025. 2. 16. 17:19
반응형

레코드란? 🧐

오늘은 카프카(Kafka)의 레코드(Record)에 대해 정리해보려고 한다. 처음 카프카를 접했을 때 레코드라는 개념이 생각보다 직관적이지 않았는데, 하나씩 정리하다 보면 이해가 쉬워질 것 같다.

카프카의 레코드는 크게 타임스탬프, 헤더, 메시지 키, 메시지 값, 오프셋으로 구성된다. 그런데 여기서 중요한 점은, 프로듀서는 오프셋과 타임스탬프를 직접 지정하지 않는다. 이 값들은 브로커가 데이터를 받을 때 자동으로 설정된다. 처음에는 이게 좀 의아했는데, 생각해보니 프로듀서가 직접 오프셋을 관리하면 분산 시스템에서 동기화 문제가 발생할 수 있겠다는 생각이 들었다.🤔


⏳ 레코드 - 타임스탬프

타임스탬프는 스트림 프로세싱을 위해 활용되는 시간 정보다.

  • 기본적으로 프로듀서가 데이터를 생성한 시간이 들어간다.
  • 하지만 브로커에 적재된 시간을 사용할 수도 있다. 이건 토픽 단위로 설정 가능하다.
  • 저장되는 형식은 Unix Timestamp로, 1970년 1월 1일 00:00:00 UTC부터의 경과 시간을 밀리초 단위로 저장한다.

그런데 이걸 꼭 프로듀서 생성 시간으로 써야 할까? 🤔 브로커 적재 시간을 사용하면, 네트워크 지연이나 배치 처리 과정에서 보다 일관된 시간 데이터를 확보할 수 있지 않을까?


🔢 레코드 - 오프셋

오프셋은 카프카에서 레코드의 위치를 나타내는 값이다.

  • 0부터 시작하며 1씩 증가한다.
  • 컨슈머가 데이터를 읽을 때 중복 처리를 방지하는 역할을 한다.
  • 또한 처리 완료된 데이터와 앞으로 처리해야 할 데이터를 구분하는 기준이 된다.

카프카는 데이터를 바로 삭제하지 않고, 일정 기간 동안 유지하면서 오프셋을 기반으로 데이터를 가져온다. 그렇다면 컨슈머가 오프셋을 잃어버리면 어떻게 될까? 🤔 이 경우에는 컨슈머 그룹 설정에 따라 처음부터 읽거나, 가장 최근 데이터부터 읽을 수 있도록 조정할 수 있다.


📜 레코드 - 헤더

레코드 헤더는 추가적인 메타데이터를 저장할 수 있는 공간이다.

  • 키-값(Key-Value) 형태로 데이터를 저장할 수 있다.
  • 스키마 버전, 데이터 포맷 등의 정보를 담아 데이터 처리 시 참고할 수 있도록 한다.

헤더를 활용하면 컨슈머가 데이터를 해석하는 데 필요한 정보를 함께 보낼 수 있다. 예를 들어, JSON과 Avro 같은 서로 다른 직렬화 방식을 사용할 때, 헤더에 스키마 정보를 포함하면 컨슈머가 이를 참고하여 데이터를 해석할 수 있다.


🔑 레코드 - 메시지 키 (Partitioning)

메시지 키는 어떤 데이터를 어떤 파티션에 저장할지를 결정하는 요소다.

  • 파티셔너(Partitioner)가 메시지 키를 기반으로 어느 파티션에 데이터를 보낼지 결정한다.
  • 메시지 키는 필수값이 아니며, 설정하지 않으면 null 값이 들어간다.
  • null 값인 경우, 라운드 로빈(Round Robin) 방식으로 파티션에 분배된다.
  • 메시지 키가 존재하면, 해시 함수를 이용해 특정 파티션에 할당된다.

그런데 가끔 메시지 키를 어떻게 설정해야 할지 애매할 때가 있다. 🤔 예를 들어, 특정 고객의 데이터를 같은 파티션에 저장하려면 고객 ID를 키로 설정하면 될까? 그렇다면 특정 파티션에 데이터가 몰릴 수도 있을 텐데, 이걸 어떻게 최적화하면 좋을까?


📩 레코드 - 메시지 값

메시지 값은 실제 데이터를 저장하는 공간이다.

  • 데이터 포맷은 사용자가 자유롭게 지정 가능하다.
  • 하지만 컨슈머는 데이터를 어떤 포맷으로 직렬화/역직렬화해야 하는지 알아야 한다.
  • 일반적으로 String(JSON) 직렬화가 많이 사용되지만, 바이너리 포맷(Avro, Protobuf 등)을 사용하면 더 효율적이다.

그런데 여기서 중요한 점이 있다. JSON 같은 텍스트 기반 포맷을 사용하면 가독성이 좋지만, 데이터 낭비가 발생할 수 있다. 예를 들어, 동일한 필드 이름이 반복적으로 저장되기 때문에 저장 공간이 더 많이 필요하다. 그렇다면 어떤 상황에서 JSON을 쓰고, 어떤 상황에서 Avro 같은 포맷을 쓰는 게 좋을까? 🤔


✨ 마무리

카프카 레코드는 단순한 메시지 단위 같지만, 깊이 들여다보면 데이터 저장, 분배, 처리에 필요한 다양한 요소들이 포함되어 있다.

반응형

'Apache Kafka 공부' 카테고리의 다른 글

#11 클라이언트 메타데이터와 브로커 통신  (0) 2025.02.16
#10 토픽 작명 방법  (0) 2025.02.16
#8 토픽과 파티션  (0) 2025.02.15
#7-1 브로커 복제 - ISR  (0) 2025.02.15
#7 브로커의 역할 - 복제  (0) 2025.02.15