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)
'kafka > core' 카테고리의 다른 글
Producer의 메시지 배치 전송 내부 메커니즘 - linger.ms와 batch.size (0) | 2025.04.30 |
---|---|
Producer의 메시지 배치 전송 내부 메커니즘 - Record Batch와 Record Accumulator 이해 (0) | 2025.04.29 |
kafka-dump-log 명령어로 로그 파일의 메시지 내용 확인 (0) | 2025.04.28 |
카프카 환경 파라미터의 구분 및 kafka-configs 명령어로 파라미터 검색 및 수정 (0) | 2025.04.27 |
kafka-consumer-groups 명령어로 Consumer Group 삭제 (0) | 2025.04.25 |
댓글