本文来源:极客时间vip课程笔记
一、前提回顾
-
在开始分析源码之前,我们一起来回顾一下 Kafka 消费模型的几个要点
1、Kafka 的每个 Consumer(消费者)实例属于一个 ConsumerGroup(消费组)
2、在消费时,ConsumerGroup 中的每个 Consumer 独占一个或多个 Partition(分区);
3、对于每个 ConsumerGroup,在任意时刻,每个 Partition 至多有 1 个 Consumer 在消费;
4、每个 ConsumerGroup 都有一个 Coordinator(协调者)负责分配 Consumer 和 Partition 的对应关系,当 Partition 或是 Consumer 发生变更时,会触发 rebalance(重新分配)过程,重新分配 Consumer 与 Partition 的对应关系;
5、Consumer 维护与 Coordinator 之间的心跳,这样 Coordinator 就能感知到 Consumer 的状态,在 Consumer 故障的时候及时触发 rebalance。 -
掌握并理解 Kafka 的消费模型,对于接下来理解其消费的实现过程是至关重要的,如果你对上面的这些要点还有不清楚的地方,建议回顾一下之前的章节或者看一下 Kafka 相关的文档,然后再继续接下来的内容。
-
我们使用当前 2.2 版本进行分析,使用 Git 在 GitHub 上直接下载源码到本地:
git clone git@github.com:apache/kafka.git cd kafka git checkout 2.2
二、Kafka 的 Consumer 入口类
-
Kafka 的 Consumer 入口类出了一个使用 Consumer 消费的最简代码示例:
// 设置必要的配置信息 Properties props = new Properties(); props.put("bootstrap.servers", "localhost:9092"); props.put("group.id", "test"); props.put("enable.auto.commit", "true"); props.put("auto.commit.interval.ms", "1000"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); // 创建Consumer实例 KafkaConsumer<String