본문 바로가기

Apache Kafka

Producer Acks

Udemy 강의를 들으며, 카프카 produce Acks에 대해 정리한 글이다

acks 매개변수는 전송된 레코드(ProducerRecord 객체)를 수신하는 partition replica의 수를 제어한다.

메세지의 유실 가능성에 영향을 주며, 3가지 중 하나의 값을 설정할 수 있다

acks 매개변수

1. acks = 0 (no acks)

프로듀서가 broker로부터 응답을 요구하지 않는다.

메세지가 유실 되어도 괜찮은 상황에 사용되며, broker가 offline 상태가 되거나 예외 발생 시

roducer에서는 이를 알 수 없고, 데이터를 유실하게 된다.

Metrics 혹은 Log collection과 같이 높은 처리량이 필요할 때 사용된다

2. acks = 1(default setting)

리더 replica에서 메세지를 받았다면, producer는 broker로부터 성공적으로 수신했다는 응답을 받는다

만약 메시지 수신을 하지 못했다면, producer는 다시 메세지를 송신할 것이다

replication이 guarantee 되지는 않고, background에서 실행된다

leader brocker가 offline 상태가 되고 replica에서 데이터들을 복제하지 못했다면,

acks=0 일 때와 마찬가지로, 데이터 유실이 발생하게 된다.

3. acks=all(replicas acks)

acks=1일 때와 달리, 리더 replicas가 메시지를 수신하면, 모든 replicas들이 메시지를 받고

replica들이 메시지를 받았음을 brocker가 인지하면 response를 producer로 송신한다

Leader + Replicas 들의 acknowledge가 필요한 것

메세지 유실의 위험은 없기에 가장 안전한 방식이지만

동시에 더 많은 수의 브로커가 메세지를 수신할 때까지 기다려야 해서 latency가 길어진다

min.insync.replicas 설정을 같이 해줘야만 한다

이 설정은 broker 혹은 topic 레벨에서 설정 가능하다

예를 들어, min insynce.replicas = 2이라면, 적어도 2개의 브로커들이(leader, replica 상관 없이

동기화되고 메세지를 가지고 있음을 응답해야 한다

만약 replication.factor가 3개이고, min.insync.replicas=2, acks=all 이라면,

하나의 브로커가 offline 되는 것까진 괜찮지만, 그 이상의 브로커가 down되면 exception이 발생한다

retries 매개변수

transient failures 발생 시, 이 exception을 처리해야 한다

그렇지 않다면 데이터를 재수신 하지 못하고 데이터가 유실된다

retries 매개변수에 값을 설정해서, 메세지 전송을 포기하고 에러로 처리하기 전에 메세지를 재전송하는 횟수를 제어한다

retty.backoff.ms 매개변수로 몇 ms마다 retry를 시도할 지 정할 수 있다 (default 100ms)

만약 retry 횟수도 많고, retry 간 대기 시간도 길다면, producer가 무한정 기다리지만은 않고 timeout를 설정할 수 있다

delivery.timeout.ms 매개변수를 사용해서 설정한 시간 이상으로 retry를 반복하게 된다면

kafka는 더이상 데이터를 전송하지 않고 timeout을 발생시킨다

producer가 callback을 통해 예외 메세지를 보낸다

retries를 할 때, 메세지가 제대로 전송되지 않을 수도 있다

원래 같은 key를 공유하는 메세지는 같은 partition 내에 있어야 한다

그러나 key-based ordering 시에, key를 가진 메세지가 의도하지 않은 브로커에 보내질 수도 있게 된다

max.in.flight.requests.per.connection이라는 매개변수에 의해 단일 브로커에게 얼마나 많은 producer requests가 전달될 지 설정할 수 있다

해당 매개 변수의 default 값은 5로, 만약 ordering을 보장하고 싶다면 1로 설정해야 한다

그러나 1로 설정 시 throuput에 영향을 주므로 설정 시 주의해야 한다

'Apache Kafka' 카테고리의 다른 글

Confluent Schema Registry에 curl로 접속하기  (0) 2022.12.23
Apache Kafka의 성능: append-only and zero copy  (0) 2022.07.03
Idempotent Producer  (0) 2020.07.17