카프카 핵심 가이드 3장. 프로듀서

dev_314·2023년 7월 20일
0

Kafka - Trial and Error

목록 보기
3/3

카프카 핵심 가이드를 읽고 정리한 내용입니다.

3.1 프로듀서 개요

  • 프로듀서로 카프카 메시지를 쓴다 == 프로듀서의 ProducerRecord 전송 API를 호출한다.
  1. 프로듀서가 ProducerRecord 객체를 생성
    • 레코드가 저장될 토픽, 벨류 지정은 필수
    • 키, 파티션 지정은 선택
  2. 프로듀서가 ProducerRecord를 직렬화
    • 바이트 배열로 전환
  3. (파티션을 지정하지 않았다면) 데이터를 Partitioner에게 전달
    • 파티셔너는 (보통) ProducerRecord의 키값을 기준으로 파티션을 결정
  4. 토픽 파티션이 결정되면, 프로듀서가 데이터를 같은 토픽 파티션으로 전송할 데이터를 모아 놓은 Record Batch에 추가
  5. 별도의 스레드가 레코드 베치를 적절한 카프카 브로커에게 전송
  6. 브로커가 데이터를 정상적으로 파티션에 저장하면, 브로커는 프로듀서에게 응답을 보냄
    • 응답 == 토픽, 파티션, 데이터의 파티션 내의 오프셋으로 구성된 RecordMetadata 객체
    • 메시지 저장에 실패하면 응답으로 에러를 전송
      • 프로듀서가 에러를 수신하면, 사용자에게 에러를 리턴하기 전에 몇 번 더 재전송을 시도할 수 있다.

3.2. 프로듀서 생성하기

  • 프로듀서를 생성하기 위해선 세 가지 필수값을 제공해야 한다.

1. bootstrap.servers

  • 카프카 클러스터와 첫 연결을 생성하기 위해 제공해야하는 브로커의 host:port 목록
  • 프로듀서가 첫 연결을 생성한 후, 추가 정보를 받아오기 때문에 모든 브로커의 주소를 제공할 필요는 없음
    • 다만 브로커에 장애가 발생하더라도 계속해서 클러스터에 연결될 수 있도록, 최소 2개 이상의 브로커를 지정할 것을 권장

2. key.serializer

  • 레코드의 키를 직렬화하기 위해 사용하는 Serializer
  • org.apache.kafka.common.Serialization.Serializer 인터페이스를 구현하는 클래스의 이름을 제공해야 한다. (카프카는 자바 App)
    • 기본적으로 여러 구현체를 제공함 (ByteArray, String, Integer, ...)
  • 레코드에 키를 사용하지 않더라도 key.serializer는 반드시 설정해야 함

3. value.serialier

  • 레코드의 벨류를 직렬화하기 위해 사용
  • 마찬가지로 직렬화 클래스 이름을 제공해야 함

3.3 카프카로 메시지 전달하기

  • 카프카는 여러 방법으로 메시지를 보낼 수 있다.

1. Fire and Forget

  • 클러스터(브로커)에 메시지를 전송하고, 성공·실패 여부는 신경 쓰지 않음
  • todo: 이 파트 다시 읽어보기

2. Synchronous send

  • 다음 메시지를 보내기 위해선, 이전 메시지 전송의 성공·실패 여부를 확인해야 함

3. Asynchronous send

  • 기본적으로 프로듀서는 항상 비동기적으로 작동
    • 응답을 받는 시점에 콜백 메서드를 자동으로 호출

3.3.0 GoLang으로 간단히 다뤄보기

  • 책은 Java기반인데 나는 Golang으로 해본다.

3.3.1 Synchronous

3.3.2 Asynchronous

profile
블로그 이전했습니다 https://dev314.tistory.com/

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

소중한 정보 잘 봤습니다!

답글 달기