리눅스/kafka

kafka에서 ack에 따른 전송 방식 ( acks 0 1 all )

정지홍 2024. 10. 16. 08:54

pruducer는 topic의 partition의 leader broker에게만 메시지를 전송 -> 이를 나머지 브로커에게 나누어 주면서 복제....

 

 

acks가 0 인 경우

  • producer는 leader broker가 보내는 ack 메시지가 오지 않아도 계속 메시지를 보낸다.
    • 즉, 확인을 받지 않으니, broker가 메시지를 못 받았어도 재전송을 안한다.
    • 그래서, 데이터 손실에 민감하지 않은 경우에 사용.
  • 손실 우려가 존재하나 빠르다.
props.setProperty(ProducerConfig.ACKS_CONFIG , "0");

 

acks가 1 인 경우

  • producer는 leader broker가 보내는 ack메시지 확인후, 다음 메시지 전송.
    • 만약 leader broker에게서 error를 받는다면, 재전송.
  • leader에 의해서 follower들이 모두 복제를 했는지는 확인 안함
    • 즉, leader만 ack 정상인지 확인.
    • 단, leader에게 오류 발생한다면, follower들이 제대로 복제했는지 확인 못했으니 메시지 손실 가능성 존재

 

acks가 all 인 경우

  • 기본적으로는 all이다.
  • 메시지 손실 우려가 없음. 대신에 속도가 느리다.
  • min.insync.replicas 만큼 복제를하고 ack메시지를 보냄.

 

callback의 async형식인 경우는?

  • ack를 바탕으로 retry가 수행
  • 대신에 producer가 send한 순서와 broker에 저장되는 message의 순서가 변경될 수 있음