防止卡夫卡消费者因长时间流程而超时

时间:2017-03-30 23:21:53

标签: apache-kafka kafka-consumer-api

我需要阻止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,还是我还需要定期轮询以发送心跳?

我的方法是最好的吗?或者有更好的方法吗?

1 个答案:

答案 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()是发送常规心跳以避免超时的唯一方法。