프로듀서 기본 동작 및 주요 옵션

프로듀서 기본 동작과 주요 옵션에 대해 설명

개요

프로듀서는 애플리케이션에서 생성한 레코드를 카프카 브로커로 전송하는 역할을 담당합니다. 이 문서는 프로듀서가 메시지를 어떤 흐름으로 전송하는지와 운영 시 자주 조정하는 주요 옵션을 함께 정리합니다.

핵심 내용

프로듀서 디자인 개요(출처: https://dzone.com/articles/take-a-deep-dive-into-kafka-producer-api/)

기본 동작

ProducerRecord라고 표시된 부분은 카프카로 전송하기 위한 실제 데이터이며, 레코드는 토픽, 파티션, 키, 밸류로 구성됨.

프로듀서가 카프카로 레코드를 전송할 때는 특정 토픽으로 메시지를 보내기 때문에 레코드에서 토픽과 밸류(메시지 내용)는 필수 값이며, **특정 파티션을 지정하기 위한 레코드의 파티션과 특정 파티션에 레코드들을 정렬하기 위한 레코드의 키는 선택 사항(옵션)**임.

각 레코드들은 프로듀서의 send() 메소드를 통해 시리얼라이저(serializer), 파티셔너(partitioner)를 거침.

  • 프로듀서 레코드의 파티션을 지정했을 경우
    –> 파티셔너는 아무 동작을 하지 않고 지정된 파티션으로 레코드를 전달.
  • 프로듀서 레코드의 파티션을 지정하지 않았을 경우
    –> 키를 가지고 파티션을 선택해 레코드를 전달함. 기본적으로 라운드 로빈(round robin) 방식으로 동작.

send() 메소드 동작 이후 레코드들을 파티션별로 잠시 모아 둠. 모아두는 이유는 프로듀서가 카프카로 전송하기 전에 배치 전송하기 위함.

전송이 실패하면 재시도 동작이 이뤄지고, 지정된 횟수만큼의 재시도가 실패하면 최종 실패가 전달됨. 전송이 성공하면 메타데이터를 리턴하게 됨.

프로듀서 전송 흐름

sequenceDiagram
    participant App as Application
    participant P as Producer
    participant Part as Partitioner
    participant B as Kafka Broker

    App->>P: ProducerRecord 생성
    P->>P: Serializer 처리
    P->>Part: 파티션 결정 요청
    Part-->>P: 대상 파티션 반환
    P->>P: 파티션별 배치 적재
    P->>B: 리더 파티션에 전송

    alt 전송 성공
        B-->>P: Ack 반환
        P-->>App: 메타데이터 반환
    else 전송 실패
        B-->>P: 오류 응답
        P->>P: Retry 여부 판단
        P->>B: 재전송
    end

프로듀서 주요 옵션

Producer OptionDescription
bootstrap.servers카프카 클러스터는 클러스터 마스터라는 개념이 없으므로, 클러스터 내 모든 서버가 클라이언트의 요청을 받을 수 있음. 클라이언트가 카프카 클러스터에 처음 연결하기 위한 호스트와 포트 정보를 나타냄.
client.dns.lookup하나의 호스트에 여러 IP를 매핑해 사용하는 일부 환경에서 클라이언트가 하나의 IP와 연결하지 못할 경우에 다른 IP로 시도하는 설정. use_all_dns_ips가 기본값으로, DNS에 할당된 호스트의 모든 IP를 쿼리하고 저장. 첫 번째 IP로 접근에 실패해도 종료하지 않고 다음 IP로 접근을 시도. resolve_canonical_bootstrap_servers_only 옵션은 Kerberos 환경에서 FQDN을 얻기 위한 용도로 사용됨.
acks프로듀서가 카프카 토픽의 리더 측에 메시지를 전송한 후 요청 완료 기준을 결정하는 옵션. 0, 1, all(-1)로 표현하며, 0은 빠른 전송을 의미하지만 일부 메시지 손실 가능성이 있음. 1은 리더가 메시지를 받았는지 확인하지만 모든 팔로워를 전부 확인하지 않음. 대부분 기본값으로 1을 사용. all은 팔로워가 메시지를 받았는지 여부를 확인. 다소 느릴 수 있으나 하나의 팔로워가 있는 한 메시지 손실은 없음.
buffer.memory프로듀서가 카프카 서버로 데이터를 보내기 위해 잠시 대기(배치 전송이나 딜레이 등)할 수 있는 전체 메모리 바이트(byte)
compression.type프로듀서가 메시지 전송 시 선택할 수 있는 압축 타입. none, gzip, snappy, lz4, zstd 중 선택
enable.idempotence설정을 true로 하는 경우 중복 없는 전송이 가능하며, 이와 동시에 max.in.flight.requests.per.connection은 5 이하, retries는 0 이상, acks는 all로 설정해야 함.
max.in.flight.requests.per.connection하나의 연결에서 프로듀서가 최대한 ACK 없이 전송할 수 있는 요청 수. 메시지의 순서가 중요하다면 1로 설정할 것을 권장하지만 성능은 다소 떨어짐.
retries일시적인 오류로 인해 전송에 실패한 데이터를 다시 보내주는 횟수
batch.size프로듀서는 동일한 파티션으로 보내는 여러 데이터를 함께 배치로 보내려고 시도. 적절한 배치 크기 설정은 성능에 도움을 줌.
linger.ms배치 형태의 메시지를 보내기 전 추가적인 메시지를 위해 기다리는 시간을 조정하고, 배치 크기에 도달하지 못한 상황에서 linger.ms 제한 시간에 도달했을 때 메시지를 전송.
transactional.id‘정확히 한 번 전송’을 위해 사용하는 옵션. 동일한 TransactionalId에 한해 정확히 한 번을 보장. 옵션을 사용하기 전 enable.idempotence를 true로 설정해야 함.

정리

프로듀서를 이해할 때는 직렬화 -> 파티션 결정 -> 배치 적재 -> 브로커 전송 흐름을 먼저 잡는 것이 중요합니다. 이후에는 acks, retries, batch.size, linger.ms, enable.idempotence 같은 옵션을 조정하면서 성능과 안정성 사이의 균형을 맞추면 됩니다.

작성 수정