困扰许久的Kafka Rebalance问题
此文已由作者丁伟伟授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
前提
本文的分析基于kafka 0.9版本的client, 0.10.1.0
中已经修改心跳线程为后台线程,并支持设置max.poll.records
,参见ChangeLog。
使用场景
Kafka是一个高吞吐量的分布式消息系统,在APM的移动端请求数据的处理中,使用了Kafka。Kafka数据使用多线程阻塞的方式进行消费,即每个线程通过poll()
的形式消费一个或者多个partition
, 每次得到的消息集处理完成之后才会继续进行下一次poll()
操作,同时使用了自动提交offset
的模式。Rebalance发生的原因有可能是集群的问题,但大部分都在客户端,一旦服务端在设定的超时时间内没有收到消费者发起的心跳,则认为这个消费者已经死掉,就会执行Rebalance动作。
从源码上,我们一路从KafkaConsumer.poll(timeout)
跟进来可以看到
/**
* Do one round of polling. In addition to checking for new data, this does any needed
* heart-beating, auto-commits, and offset updates.
* @param timeout The maximum time to block in the underlying poll
* @return The fetched records (may be empty)
*/
private Map<TopicPartition, List<ConsumerRecord<K, V>>> pollOnce(long timeout) {
...
// 上面是一些检查动作
fetcher.initFetches(cluster);
client.poll(timeout);
return fetcher.fetchedRecords();
}
相关文章