Acks = 0 에서의 Producer
Acks = 1에서의 Producer
Acks = all에서의 Producer
min.insync.replicas
producer의 Sync와 Callback Async에서의 acks와 retry
Producer의 메시지 배치 전송의 이해
send()
**메서드를 통해 ProducerRecord를 입력buffer.memory
설정 사이즈만큼 보관될 수 있음Record Accumulator
Record Accumulator는 Partitioner에 의해서 메시지 배치가 전송이 될 토픽과 Partition에 따라 저장되는 KafkaProducer 메모리 영역
Sender Thread는 Record Accumulator에 누적된 메시지 배치를 꺼내서 브로커로 전송
KafkaProducer의 Main Thread는 send()
메서드를 호출하고 Record Accumulator에 데이터 저장하고 Sender Thread는 별개로 데이터를 브로커로 전송
linger.ms
Sender Thread
max.inflight.requests.per.connection
을 통해 각 파티션별로 전송할 때 최대 Batch 개수 설정Producer의 동기와 비동기에서의 Batch
send()
메서드는 비동기 전송하며 Batch 단위 전송get()
에서는 배치에 메시지가 1개(전송 성공에 대해 응답을 받을 때까지 Batch를 채우지 않기 때문)Producer의 메시지 전송/재전송 시간 파라미터 이해
max.block.ms
send()
호출하여 Record Accumulator에 append를 시도하려고 할 때 Record Accumulator가 가득찬 경우request.timeout.ms
retry.backoff.ms
request.timeout.ms
만큼 기다리고 재전송 전 기다리는 시간delivery.timeout.ms
delivery.timeout.ms >= linger.ms + request.timeout.ms
또는 delivery.timeout.ms >= linger.ms + retry.backoff.ms + request.timeout.ms
지켜져야함retries(재전송 횟수)
delivery.timeout.ms
를 초과하게 되면 전송 실패 처리를 하기 때문에 retries 설정된 만큼 재전송하는 경우는 없음max.in.flight.requests.per.connection
이해
브로커 서버의 응답 없이 Producer의 sender Thread가 한번에 보낼 수 있는 메시지 배치의 개수
default = 5
, Kafka Producer의 메시지 전송 단위는 Batch
비동기 전송 시 브로커의 응답없이 한꺼번에 보낼 수 있는 Batch의 개수는 max.in.flight.requests.per.connection
에 따름
배치 전송 시 발생하는 상황
최대 한번 전송, 적어도 한번 전송, 정확히 한번 전송
최대 한번 전송(ack = 0)
적어도 한번 전송(ack = 1, all)
중복 없이 전송(idempotence)
Producer는 브로커로 부터 Ack를 받은 다음에 다음 메세지를 전송하되, Producer ID와 메시지 Seq를 Header에 넣어 전송
메시지 Seq는 메시지의 고유 Seq번호, 0…순차적 증가, Producer ID는 매번 새롭게 작성
브로커에서 메시지 Seq가 중복되는 경우 → 메세지 로그에 기록하지 않고 Ack만 전송
브로커는 Producer가 보낸 메세지의 Seq가 브로커가 가지고 있는 메세지의 Seq보다 1만큼 큰 경우에만 브로커에 저장
Producer의 idempotence 설정
enable.idempotence = true
acks = all
retries
는 0보다 큰 값max.in.flight.requests.per.connection
은 1 ~ 5 사이(최대 5까지 설정 가능)idempotence 기반에서 메시지 전송 순서 유지
max.in.flight.requests.per.connection
만큼 여러 개의 배치들이 Broker로 전송OutOfOrderSequenceException
을 생성하여 Producer에 전달idempotence를 위한 Producer 설정
enable.idempotence = true
acks = all
retries
는 0보다 큰 값max.in.flight.requests.per.connection
은 1 ~ 5 사이의 값idempotence = true
enable.idempotence=true
를 제외하고 다른 파라미터를 잘못 설정하면 전송을 되지만 idempotence가 제대로 동작하지 않음enable.idempotence=true
를 설정한 뒤 다른 파라미터들을 잘못 설정하면 config오류가 발생하면서 Producer가 기동되지 않음Custom 파티셔너를 통해 특정 Partition 설정하기
DefaultPartitioner의 partition 메서드 key값 유무에 따라 전략 결정
KafkaProducer는 기본적으로 DefaultPartitioner 클래스를 이용해서 메세지 전송 시 도착할 Partition을 지정
DefaultPartitioner는 키를 가지는 메시지의 경우 키 값을 Hashing하여 키 값에 따라 파티션 별로 균일하게 전송
커스텀 작성하는 방법
partitioner 인터페이스
partition()
메서드에 로직을 직접 구현해서 사용