그것은 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
사용
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 (성공 또는 실패)의 응답을 나중에 처리하며 코드는 계속 실행됩니다.
일반적으로 실제 동작은 실제 코드와 메서드 호출 위치에 따라 다릅니다.