3.3 프로듀서의 기본 동작과 예제 맛보기
3.3.1 프로듀서 디자인

- ProducerRecord
- 카프카로 전송하기 위한 실제 데이터
- 토픽, 파티션, 키(정렬을 위한), 벨류로 구성된다. (토픽과 벨류는 핏숫값)
- 각 레코드들은
send()
메서드로 전송된다.
- Serializer와 파티셔너를 거치는데 파티션이 지정되었다면 파티셔너를 거치지 않고 지정된 파티션으로 전달된다.
- 프로듀서 내부에선 이렇게
send()
이후 레코드를 파티션 별로 잠시 모아두고 이후 배치 전송을 수행한다.
- 지정된 횟수만큼 재시도가 실패하면 최종 실패를 전달한다.
- 전송이 성공하면 메타데이터를 리턴한다.
3.3.2 프로듀서의 주요 옵션
- 프로듀서를 기본값으로 사용해도 무리는 없다.
- 하지만 프로듀서 주요 옵션을 잘 파악해야 원하는 형태로 메시지를 전송할 수 있다.
- 프로듀서 옵션
- bootstrap.servers
- 클라이언트가 카프카 클러스터에 처음 연결하기 위한 호스트와 포트 정보
- 카프카 클러스터는 클러스터 마스터라는 개념이 없어 모든 서버가 클라이언트 요청을 받을 수 있다.
- client.dns.lookup
- 한 호스트에 여러 IP를 매핑하는 일부 환경에서 사용
- 클라이언트가 한 IP와 연결하지 못할 경우에 다른 IP로 시도하는 설정
- use_all_dns_ips가 기본값
- acks
- 카프카 토픽의 리더 측에 메시지를 전송한 후 요청을 완료하기를 결정하는 옵션 (ex. 0, 1, all)
- buffer.memory
- 프로듀서가 카프카 서버로 데이터를 보내기 위해 잠시 대기할 수 있는 전체 메모리 바이트 (배치나 딜레이 등)
- compression.type
- 메시지 전송 시 사용 가능한 압축 타입 (none, gzip, snappy, lz4, zstd 등)
- enable.idempotence
- true인 경우 중복 없는 전송이 가능하다.
- 동시에 max.in.flight.requests.per.connection이 5 이하, retires는 0 이상, acks 는 all로 설정해야 한다.
- max.in.flight.requests.per.connection
- 한 커넥션에서 최대한 ACK 없이 전송할 수 있는 요청 수
- 메시지 순서가 중요하다면 1이 권장되지만 성능이 다소 떨어진다.
- retries
- batch.size
- linger.ms
- 배치 전송 대기 시에도 이 설정 값 제한 시간에 도달하면 메시지를 전송한다.
- transactional.id
- 정확히 한 번 전송을 위해 사용하는 옵션
- 이 값에 한해 정확히 한 번을 보장한다.
- enable.idempotence를 true로 설정해야 한다.