본문 바로가기
kafka/core

acks 값 설정에 따른 Producer의 전송 방식 차이 이해

by 개복이 2025. 4. 28.

acks 값 설정에 따른 Producer의 전송 방식 차이 이해

Producer의 acks 설정에 따른 send 방식

  • Producer는 해당 Topic의 Partition의 Leader Broker에게만 메시지를 발행한다.
  • Leader Broker가 Follower에게 전달하는 것처럼 보이지만 실제로는 Follower에서 Leader Broker에 요청을 하고 받는다.

 

Producer의 acks 설정에 따른 send 방식 - acks 0

  • Producer는 해당 Topic의 Partition의 Leader Broker에게만 메시지를 발행한다.
  • Producer는 Leader Broker가 메시지 A를 정상적으로 받았는지에 대한 Ack 메시지를 받지 않고 다음 메시지인 메시지 B를 바로 전송
  • 메시지가 제대로 전송되었는지 브로커로부터 확인을 받지 않기 때문에 메시지가 브로커에 기록되지 않더라도 재전송하지 않는다.
  • 메시지 손실의 우려가 가장 크지만 가장 빠르게 전송할 수 있다. (데이터의 손실에 민감하지 않은 데이터 전송에 활용)

 

Producer의 acks 설정에 따른 send 방식 - acks 1

  • Producer는 해당 Topic의 Partition의 Leader Broker에게만 메시지를 발행한다.
  • Producer는 Leader Broker가 메시지 A를 정상적으로 받았는지에 대한 Acks 메시지를 받은 후 다음 메시지인 메시지 B를 바로 전송. 만약 오류 메시지를 브로커로부터 받으면 메시지 A를 재전송.
  • 메시지 A가 모든 Replication에 완벽하게 복사되었는지의 여부는 확인하지 않고 메시지 B를 전송.
  • 만약 Leader가 메시지를 복제 중에 다운될 경우 다음 Leader가 될 브로커에는 메시지가 없을 수 있기 때문에 메시지를 소실할 우려가 있다.

 

Producer의 acks 설정에 따른 send 방식 - acks all (-1)

  • Producer는 해당 Topic의 Partition의 Leader Broker에게만 메시지를 발행한다.
  • Producer는 Leader Broker가 메시지 A를 정상적으로 받은 뒤 min.insync.replicas 개수 만큼의 Replicator에 복제를 수행한 뒤에 보내는 Acks 메시지를 받은 후 다음 메시지인 메시지 B를 바로 전송. 만약 오류 메시지를 브로커로부터 받으면 메시지 A를 재전송.
  • 메시지 A가 모든 Replicator에 완벽하게 복사되었는지의 여부까지 확인후에 메시지 B를 전송.
  • 메시지 손실이 되지 않도록 모든 장애 상황을 감안한 전송 모드이지만 Acks를 오래 기다려야 하므로 상대적으로 전송 속도가 느리다.

 

Producer의 acks 설정에 따른 send 방식 - acks all (-1) 동작 메커니즘 #1

 

Producer의 acks 설정에 따른 send 방식 - acks all (-1) 동작 메커니즘 #2

  • 브로커 2번이 다운되었지만 브로커 1, 3번이 기동되고 있기 때문에 min.insync.replicas=2 조건에 해당하므로 정상 작동하게 된다.

 

Producer의 acks 설정에 따른 send 방식 - acks all (-1) 동작 메커니즘 #3

  • 브로커 2, 3번이 다운되었으므로 브로커 1번만 기동되고 있기 때문에 min.insync.replicas=2 조건에 해당하지 못하므로 NOT_ENOUGH_REPLICAS 에러가 발생하게 된다.

 

Producer의 Sync와 Callback Async에서의 acks와 retry

  • Callback 기반의 async에서도 동일하게 acks 설정에 기반하여 retry가 수행
  • Callback 기반의 async에서는 retry에 따라 Producer의 원래 메시지 전송 순서와 Broker에 기록되는 메시지 전송 순서가 변경될 수 있다. 
    • 메시지 A 전송 실패 (A -> X)
    • 메시지 B 전송 (B -> B)
    • 메시지 A 재전송 (A -> A)
    • 전송 순서가 B, A 순으로 된다.
  • Sync 방식에서 acks=0일 경우 전송 후 ack/error를 기다리지 않는다. (fire and forget)

댓글