我需要阻止kafka使用者在应用程序等待特定进程完成时超时。我的方法是暂停分区,然后在完成该过程后恢复它们。
List<TopicPartition> partitionList = new ArrayList<>();
partitionList.addAll(kafkaConsumer.assignment());
kafkaConsumer.pause(partitionList);
while(//waiting for the process to complete){
Thread.sleep(10000);
kafkaConsumer.poll(0);
}
kafkaConsumer.resume(partitionList);
问题
暂停是否会自动将心跳发送给kafka,还是我还需要定期轮询以发送心跳?
我的方法是最好的吗?或者有更好的方法吗?
答案 0 :(得分:5)
自Kafka 0.10.1起,消费者确实有发送心跳的后台线程:https://cwiki.apache.org/confluence/display/KAFKA/KIP-62%3A+Allow+consumer+to+send+heartbeats+from+a+background+thread
因此,您不需要致电poll()
向经纪人发送心跳。但是,还有第二次超时max.poll.interval.ms
- 您必须在此时间内调用poll()
以避免第二次超时。默认值为5分钟。如果您的等待时间甚至更长,您可以增加此超时。如果你这样做,你也不需要暂停任何分区等。
如果您使用的是旧版本,则会暂停,并定期调用poll()
是发送常规心跳以避免超时的唯一方法。