2017-10-03 3 views
0

단점이 commitSync()을 재 시도하면서 nonretriable 실패, commitAsync을 성공하거나 발견 할 때까지 커밋이다 https://www.safaribooksonline.com/library/view/kafka-the-definitive/9781491936153/ch04.html#callout_kafka_consumers__reading_data_from_kafka_CO2-1카프카 - 소비자. commitSync는 commitAsync

에서 인용 대() 는 다시 시도하지 않을 것이다.

이 문구는 분명하지 않습니다. 나는 소비자가 브로커에 커밋 요청을 보내고 브로커가 일정 시간 내에 응답하지 않으면 오답이 실패했다는 것을 의미한다고 가정합니다. 내가 잘못 ?

commitSynccommitAsync의 차이점을 자세히 설명 할 수 있습니까?
또한 커밋 유형을 선호하는 경우 사용 사례를 제공하십시오.

답변

0

그것은 API 문서에서 말했다됨에 :


이 동기 커밋과 때까지 차단 중 하나가 커밋이 성공하거나 복구 할 수없는 오류입니다 (이 경우 호출자에게 던져진다). 수단

commitSync은 차단 방법이다. 그것을 호출하면 성공하거나 실패 할 때까지 스레드를 차단합니다. 예를 들어

에 대한 루프, consumer.commitSync()가 성공적으로 반환하거나 예외를 throw 중단 후에 만, 코드가 다음 반복으로 이동합니다 각각의 반복에 대한

while (true) { 
    ConsumerRecords<String, String> records = consumer.poll(100); 
    for (ConsumerRecord<String, String> record : records) { 
     System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value()); 
     consumer.commitSync(); 
    } 
} 

.

이 비동기 호출하고 차단하지 않습니다

  • commitAsync

    . 발생한 모든 오류는 콜백에 전달되거나 (제공된 경우) 폐기됩니다.

즉, commitAsync은 비 차단 방식입니다. 호출하면 스레드가 차단되지 않습니다. 대신, 그것이 성공하든 실패하든 관계없이 다음 지침을 계속 처리 할 것입니다.

앞의 예와 유사한 예를 들어

, 그러나 여기에서 우리는 commitAsync 사용

while (true) { 
    ConsumerRecords<String, String> records = consumer.poll(100); 
    for (ConsumerRecord<String, String> record : records) { 
     System.out.printf("offset = %d, key = %s, value = %s", record.offset(), record.key(), record.value()); 
     consumer.commitAsync(callback); 
    } 
} 

각 반복의 경우에 대한 루프 상관없이 consumer.commitAsync()에 어떤 일이 일어날하지 않습니다에 결국 코드가 다음으로 이동합니다 되풀이. 그리고 커밋의 결과는 정의한 콜백 함수에 의해 처리됩니다.


무역 오프 : 당신이 데이터 일관성을 보장해야하는 경우가 있는지 확인하기 때문에, commitSync()을 선택

  • 데이터 일관성 대 대기 시간이 더 작업을하기 전에, 당신은 것입니다, 그 오프셋 커밋이 성공했는지 실패했는지를 알 수 있습니다. 그러나 동기화 및 차단이기 때문에 커밋 완료를 기다리는 데 더 많은 시간을 할애하여 대기 시간이 길어집니다.
  • 특정 데이터 불일치가 있지만 대기 시간을 짧게하려면 ok를 기다리는 것이므로 commitAsync()을 선택하십시오. 대신 커밋 요청을 보내고 Kafka (성공 또는 실패)의 응답을 나중에 처리하며 코드는 계속 실행됩니다.

일반적으로 실제 동작은 실제 코드와 메서드 호출 위치에 따라 다릅니다.