본문 바로가기

빅데이터/Kafka

Kafka client 2.0 부터 KafkaConsumer.poll(long)은 deprecated됩니다.

Kafka client 2.0부터는 KafkaConsumer.poll(long timoutMs)는 deprecated되었다.

KafkaConsumer.poll(long timeoutMs)를 기존처럼 long type parameter로 사용할 경우 poll(Duration timout)으로 redirect된다.

 

이 수정사항은 KIP-266에 의해서 수정되었고 수정된 사유를 아래와 같이 적어보고자 한다.

 

KafkaConsumer.poll(long)

poll method는 consumer에서 빠트릴 수 없는 중요한 메서드이다. 데이터를 가져오는 역할을 하며 무한루프안에서 지속적으로 호출되어 topic으로부터 데이터를 가져오는데 사용된다.

 

기존에 사용되던 poll() method는 long type 파라미터로 받았는데, 만약 1000을 넣게되면 poll 호출과 함께 1초동안 기다려서 브로커에서 데이터를 가져왔다. 만약 1초 동안 기다렸는데도 가져올 데이터가 없다면 계속해서 기다린다. 이렇게 기다릴때 broker에 이슈가 생기면 poll() method가 무기한으로 기다리는 이슈가 있다.

 

이를 해결하기 위해 poll(duration)을 kafka client 2.0 부터 적용하여 배포하고 있다. 또한 Kafka client 2.0에서 poll(long)을 호출하더라도 아래와 같이 변경되어 호출된다.

@Deprecated
@Override
public ConsumerRecords<K, V> poll(final long timeoutMs) {
   return poll(time.timer(timeoutMs), false);
}

private ConsumerRecords<K, V> poll(final Timer timer,
      final boolean includeMetadataInTimeout){
      ....
}

KafkaConsumer.poll(Duration)

poll(Duration)은 기존 poll(long)과는 다소 다르게 동작한다. broker에 데이터를 가져오도록 요청하고 나서 duration timeout이 날때 까지 데이터가 브로커로부터 가져오지 못하면 즉시 빈 collection을 반환한다.

 

주의할점

위 이슈는 아주 중요한 이슈이다. consumer의 poll() method에서 무기한 블락킹 되는 현상은 consumer입장에서 치명적이기 때문이다. 이때문에 다음 major release(아마 3.x)에서는 poll(long)은 삭제될 것이라고 한다.

Some care must be taken in the case of the poll() since many applications depend on the current behavior of blocking until an assignment is found. This KIP retains this behavior for poll(long), but introduces a new API poll(Duration), which always returns when the timeout expires. We will deprecate poll(long) and remove it in a later major release.

태그