카프카/Java 기반 카프카 클라이언트 구현, Producer 내부 메커니즘 2

Producer의 전송/재전송 내부 메커니즘 및 재전송 동작 관련 주요 파라미터

webmaster 2025. 9. 30. 00:15
728x90

Producer 메시지 전송/재전송 시간 파라미터

  • max.block.ms: Send() 호출 시 Record Accumulator에 입력하지 못하고 Block 되는 최대 시간. 초과 시 Timeout Exception
  • linger.ms: Sender Thread가 Record Accumulator에서 배치별로 가져가기 위한 최대 대기시간
  • request.timeout.ms: 전송에 걸리는 최대 시간. 전송 재시도 대기시간 제외.!
    • 초과 시 retry를 하거나 timeout exception 발생
  • retry.backoff.ms: 전송 재시도를 위한 대기 시간
  • deliver.timeout.ms: Producer 메시지(배치) 전송에 허용된 최대 시간. 초과 시 Timeout Exception

Retries와 DeliveryTimeout

retries 설정 횟수만큼 재전송 시도하다가 delivery.timeout.ms가 되면 재전송 중지

  • retries와 delivery.timeout.ms를 이용하여 재전송 횟수 조정
  • retries는 재전송 횟수를 설정
  • delivery.timeout.ms는 메시지 재전송을 멈출 때까지의 시간
  • 보통 retries는 무한대 값으로 설정하고 delivery.timeout.ms(default: 120,000)를 조정하는 것을 권장

Retries와 Request.timeout.ms, retry.backoff.ms

  • retry.backoff.ms는 재전송 주기 시간을 설정
  • retries=10, request.timeout.ms=10000ms, retry.backoff.ms=30인 경우 request.timeout.ms 만큼 기다린 후 재전송하기 전 30ms 이후 재전송 10회 시도.(이후에는 retry 시도 X)
    • 만약 10회 이내 delivery.timeout.ms에 도달하면 더 이상 retry 시도하지 않음

실습하기

linger.ms + request.timeout.ms가 delivery.timeout 보다 작은 경우

Properties props = new Properties();

//Bootstrap.servers, key.serializer.class, value.serializer.class
//props.setProperty("bootstrap.servers", "192.168.56.101:9092");
props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.56.101:9092");
props.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
props.setProperty(ProducerConfig.DELIVERY_TIMEOUT_MS_CONFIG, "29000");

  • linger.ms + request.timeout.ms 보다 작게 설정했더니 Producer를 띄우지 못하고 죽는다.

delivery.timeout 설정 확인해보기

실행 중 brocker 죽이기

  • Brocker가 죽었기 때문에 delivery.timeout.ms만큼 대기했다가 죽는 것을 볼 수 있다.
728x90