文章目录
1、消费者食用DEMO
Properties prop = new Properties();
prop.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
prop.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
prop.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka:9092");
prop.put(ConsumerConfig.GROUP_ID_CONFIG, "testConsumer");
prop.put(ConsumerConfig.CLIENT_ID_CONFIG, "consumerDemo");
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(prop);
consumer.subscribe(Collections.singleton("test"));
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
for (ConsumerRecord<String, String> record : records) {
String key = record.key();
String value = record.value();
System.err.println(record.toString());
}
}
2、消费者基本概念
kafka 消费者是以 组为基本单位 进行消费的。消费的模型如下

1 个 topic 允许被多个 消费组 消费。再次强调,kafka 消费是以组为单位。
prop.put(ConsumerConfig.GROUP_ID_CONFIG, "testConsumer");
以上这行代码设置了消费组。
2.1、partition 分配
topic 为逻辑上的概念,partition 才是物理上的概念。那么看完这个以上的消费模型图。你可能会很疑惑。当一个组下有多个消费者时,每个消费者是如何消费的?
先说明:partition 的分配为平均分配
假设一:topic1 下面有 3 个分区。分别如下:p1 - p3。那么 groupA 下的三个消费者消费的对应 partition 为如下
instance1: p1
instance2: p2
instance3: p3
假设二:topic1 下面有 8 个分区。分别为 p1 - p8。那么 groupA 中每个消费者分配到的 partition 就如下
instance1: p1,p2,p3
instance2: p4,p5,p6
instance3: p7,p8
2.2、partition 重分配
假设三:topic1 下面有 8 个分区:P1 - P8。groupA 有三个消费者:c1,c2,c3。此时分配的 partition 如下
c1: p1,p2,p3
c2: p4,p5,p6
c3: p7,p8
如果此时,又有一个新的消费者加入到 groupA 会发生什么呢? partition 会被重新分配
c1: p1,p2
c2: p3,p4
c3: p5,p6
c4: p7,p8
3、消费者端 API 介绍
3.1、订阅主题
void subscribe(Collection<String> topics);
void subscribe(Collection<String> topics, ConsumerRebalanceListener

本文详细介绍了Kafka消费者的使用,包括消费者以组为单位的消费模型、分区分配与重分配策略、订阅主题与消息消费、位移提交、消费组的分区再均衡以及消费者拦截器。强调了Kafka消费者的重要参数和与RocketMQ的异同,指出Kafka消费者线程不安全,但提供了多线程消费的能力,并能确保消息不丢失。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



