我使用kafka consumer api 0.10.2.1。
KafkaConsumer为分区分配和撤销提供回调:
consumer.subscribe(topics, consumerRebalanceListener);
consumerRebalanceListener
有两种方法:
public void onPartitionsRevoked(Collection<TopicPartition> partitions);
public void onPartitionsAssigned(Collection<TopicPartition> partitions);
由于Kafka使用者中的所有内容都发生在单线程和poll()方法内部,因此从poll()
方法内部调用这些回调。
问题是,它们是否可以通过一次poll()
来电拨打,还是始终需要两次poll()
次来电?
答案 0 :(得分:3)
在我看来,他们是从poll()
电话打来的。当一个消费者实例开始加入该组时,首先调用onPartitionsRevoked
来撤销分配给该实例的所有分区并发送JoinGroup请求。然后它无限期地阻塞,直到收到响应。如果它成功加入组,则通过调用onPartitionsAssigned
来执行用户的回调。所有这些都在一轮poll
中完成。