스터디/Kafka

카프카 프로듀서 구조와 동작 원리

황동리 2025. 10. 24. 18:59
반응형

이번 글에서는 메세지를 전달하는 프로듀서에 대해 자세히 알아보도록 하겠습니다.


프로듀서 디자인

먼저 프로듀서가 어떻게 디자인 되어있는지 살펴보겠습니다.



위 그림은 프로듀서의 전체 흐름을 나타낸 그림 입니다.

ProducerRecord

먼저 ProducerRecord라고 표시된 부분을 보면, 카프카로 전송하기 위한 실제 데이터 입니다.


레코드는 아래와 같은 정보로 구성됩니다.

  • 토픽: 데이터를 보낼 카프카 토픽 이름 (필수)
  • 파티션: 토픽의 파티션 번호 지정 가능, 다만 필수는 아니여서 지정 안해두면 카프카가 자동 결정
  • 키: 파티션 선택에 영향을 주는 값 (선택)
  • 밸류: 실제 전송할 메시지 데이터 (필수)

프로듀서가 특정 토픽으로 메시지를 전송합니다. 이에 따라 레코드에서 토픽과 밸류(메시지 내용)는 필숫값입니다.


레코드를 구성하기 위한 정보들을 알아보았고, 그 다음으로 send() 메소드를 통해 시리얼라이저, 파티셔너를 거치게 됩니다.


시리얼라이저

먼저 시리얼라이저 작업을 하는데, 해당 작업에서는 데이터가 네트워크 전송 가능한 형식으로 변환을 하는 작업 입니다.


이게 무슨 뜻이냐면 메시지의 키와 값은 일반 문자열, JSON, Avro 등 다양한 형태일 수 있습니다.
따라서 카프카는 메시지를 토픽으로 전송 전, 메시지(데이터)를 byte 형태로 직렬화 해야합니다.

파티셔너

카프카는 각 토픽이 여러 파티션으로 구성되어 있으므로, 메시지가 어떤 파티션으로 들어갈 지 결정해야합니다.


파티셔너는 아래와 같은 규칙으로 동작을 합니다.

조건 결과
키가 존재할 때 키의 hash 값 기반으로 파티션 선택
키가 없을 때 라운드 로빈 방식으로 분배

send() 메소드를 사용하여 시리얼라이저, 파티셔너 작업을 거치면 카프카에서 배치 전송을 하기 위해 잠시 동안 레코드를 모아둡니다.


전송이 실패하면 재시도 동작이 이뤄집니다.


지정한 횟수만큼 재시도가 실패하면 최종실패를 전달하고, 전송이 성공하면 메타데이터를 리턴 하게 됩니다.


프로듀서의 주요 옵션

자신이 원하는 형태로 카프카를 이용해 메시지를 전송하고자 한다면 프로듀서의 주요 옵션을 잘 파악해야 합니다.

프로듀서 옵션명 설명
bootstrap.servers 카프카 클러스터와 연결하기 위한 호스트 지정
client.dns.lookup Kafka 브로커의 DNS를 해석하는 방식 지정 (IP 변경 감지나 다중 IP 연결 제어용).
acks 브로커가 메시지 수신을 확인(ACK)하는 수준 설정 — 안정성과 속도 균형 결정
buffer.memory 메시지 전송 전 임시로 보관하는 프로듀서 내부 버퍼의 총 메모리 크기
compression.type 메시지 배치를 압축하여 네트워크·디스크 사용량을 줄이는 방식 설정
enable.idempotence 네트워크 재전송 시에도 중복 메시지를 방지하는 멱등성 전송 기능 활성화
max.in.flight.requests.per.connection 하나의 커넥션에서 동시에 전송할 수 있는 요청 수 제한 (순서 보장 관련)
retries 메시지 전송 실패 시 자동으로 재시도하는 횟수 설정
batch.size 동일 파티션으로 향하는 메시지를 한 번에 묶어 전송할 최대 크기 (byte 단위)
linger.ms 메시지를 모아 배치 전송하기 위해 기다리는 최대 시간 (ms 단위)
transactional.id 트랜잭션 단위로 메시지를 전송할 때 사용하는 고유한 프로듀서 식별자


이렇게 프로듀서의 구조와 옵션, 그리고 실제로 토픽에 전달되기까지 어떤 작업들이 실행되는지 알아보았습니다.


이상입니다.

반응형