困扰许久的Kafka Rebalance问题

2020-05-27 00:00:00 数据 集群 时间 消费 超时

此文已由作者丁伟伟授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。


前提

本文的分析基于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();
    }

相关文章