消费者 max poll interval 自动_kafka05消费者

本文介绍了Kafka消费者的群组、分区再均衡、消费者配置等概念,重点讨论了max.poll.interval配置以及自动提交偏移量的影响。消费者加入群组时会触发分区再均衡,分配分区。消费者配置中,fetch.min.bytes、fetch.max.wait.ms等参数影响数据获取。消费者通过轮询获取消息,max.poll.records控制单次请求的记录数量。此外,还探讨了自动提交与手动提交偏移量的策略和最佳实践。
摘要由CSDN通过智能技术生成

9829cc864029a3f29183fc78a704ea95.png

1. 消费者和消费者群组

消费者从属于消费者群组,一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息。
可以增加更多的消费者,让它们分担负载,每个消费者只处理部分分区的消息,这就是横向伸缩的主要手段。我们有必要为主题创建大量的分区,在负载增长时可以加入更多的消费者。要注意,不要让消费者的数量超过主题分区的数量,多余的消费者只会被闲置。

1 个消费者收到 4 个分区的消息

假设主题 T1 有 4 个分区,我们创建了消费者 C1 ,它是群组 G1 里唯一的消费者,群组 G1 订阅主题 T1 。消费者 C1 将收到主题 T1 全部 4 个分区的消息。

376aad3fab20db11a7df0323a2dd1dd6.png

2 个消费者收到 4 个分区的消息
如果在群组 G1 里新增一个消费者 C2 ,那么每个消费者接收两个分区的消息。89dbce5bc102163f288a67c2cdb4f559.png

4 个消费者收到 4 个分区的消息
如果群组 G1 有 4 个消费者,那么每个消费者可以分配到一个分区de0f7cc16e29338086efd16bc9c375d5.png

5 个消费者收到 4 个分区的消费
如果我们往群组里添加更多的消费者,超过主题的分区数量,那么有一部分消费者就会被闲置,不会接收到任何消息。fed62afe6693f014c76051d6c3be9368.png

2. 多个应用程序从同一个主题读取数据

多个应用程序从同一个主题读取数据时,每个应用程序可以获取到所有的消息,而不只是其中的一部分。只要保证每个应用程序有自己的消费者群组,就可以让它们获取到主题所有的消息。

在上面的例子里,如果新增一个只包含一个消费者的群组 G2 ,那么这个消费者将从主题T1 上接收所有的消息,与群组 G1 之间互不影响。群组 G2 可以增加更多的消费者,每个消费者可以消费若干个分区,就像群组 G1 那样。总的来说,群组 G2 还是会接收到所有消息,不管有没有其他群组存在。

两个消费者群组对应一个主题a8b6cf216212b20f28ebb3932bb5e531.png

3. 分区再均衡

分区的所有权从一个消费者转移到另一个消费者,这样的行为被称为再均衡。再均衡非常重要, 它为消费者群组带来了高可用性和伸缩性(我们可以放心地添加或移除消费者),

群组里的消费者共同读取主题的分区,下面情况会发生再均衡

  • 一个新的消费者加入群组时,它读取的是原本由其他消费者读取的消息。

  • 当一个消费者被关闭或发生崩溃时,它就离开群组,原本由它读取的分区将由群组里的其他消费者来读取。

  • 在主题发生变化时 , 比如管理员添加了新的分区,会发生分区重分配

不过在正常情况下,我们并不希望发生这样的行为。

  • 在再均衡期间,消费者无法读取消息,造成整个群组一小段时间的不可用

  • 另外,当分区被重新分配给另一个消费者时,消费者当前的读取状态会丢失,它有可能还需要去刷新缓存 ,在它重新恢复状态之前会拖慢应用程序。

消费者通过向被指派为 群组协调器的 broker,不同的群组可以有不同的协调器,发送心跳来维持它们和群组的从属关系以及它们对分区的所有权关系。
只要消费者以正常的时间间隔发送心跳,就被认为是活跃的,说明它还在读取分区里的消息。消费者会 在轮询消息(获取消息)或提交偏移量时发送心跳。如果消费者长时间未发送心,会话就会过期,群组协调器认为它已经死亡,就会触发一次 再均衡

3.1 分配分区

当消费者要加入群组时,它会向群组协调器发送一个 Join Group 请求。第一个加入群组的消费者将成为“群主”。群主从协调器那里获得群组的成员列表(列表中包含了所有最近发送过心跳的消费者,它们被认为是活跃的),并负责给每一个消费者分配分区。它使用一个实现了 PartitionAssignor 接口的类来决定哪些分区应该被分配给哪个消费者。
分配完毕之后,群主把分配情况列表发送给群组协调器,协调器再把这些信息发送给所有消费者。每个消费者只能看到自己的分配信息,只有群主知道群组里所有消费者的分配信息。

4. 消费者读消息

4.1 使用kafka自带工具发送和接收消息

kafka-console-producer.sh 发送消息

[root@docker01 ~]# /usr/local/kafka_2.13-2.6.0/bin/kafka-console-producer.sh --bootstrap-server 192.168.8.31:9092 --topic test
>hello1
>hello test
>

kafka-console-consumer.sh 接收消息

[root@docker01 kafka_2.13-2.6.0]# /usr/local/kafka_2.13-2.6.0/bin/kafka-console-consumer.sh --bootstrap-server 192.168.8.31:9092 --topic test 
hello1
hello test

4.2 Java应用程序创建Kafka 消费者读取消息

在读取消息之前,需要先创建一个 KafkaConsumer 对象 。 创建 KafkaProducer 对象与创建 KafkaProducer 对象非常相似一一把想要传给消费者的属性放在 Properties 对象里。

消费者 Properties 可配置项,请参考 org.apache.kafka.clients.consumer.ConsumerConfig

public class ConsumerConfig extends AbstractConfig {
    
private static final ConfigDef CONFIG;
public static final String GROUP_ID_CONFIG = "group.id";
public static final String GROUP_INSTANCE_ID_CONFIG = "group.instance.id";
public static final String MAX_POLL_RECORDS_CONFIG = "max.poll.records";
public static final String MAX_POLL_INTERVAL_MS_CONFIG = "max.poll.interval.ms";
public static final String SESSION_TIMEOUT_MS_CONFIG = "session.timeout.ms";
public static final String HEARTBEAT_INTERVAL_MS_CONFIG = "heartbeat.interval.ms";
......
......
}

3个必要的属性

  • bootstrap.servers: 指定了 Kafka broker的连接字符串

  • key.deserializer 和 value.deserializer:key和value的反序列化器,把字节数组序列化成 Java 对象。

第 4 个属性 group.id 不是必需的,它指定了 KafkaConsumer 属于哪一个消费者群组,创建不属于任何一个群组的消费者也是可以的。

4.2.1 创建 KafkaConsumer 对象

        Properties p = new Properties();
p.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "docker01:9092");
p.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group");
p.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");//从头开始读取kafka消息
p.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
p.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);

KafkaConsumer consumer = new KafkaConsumer<>(p);

4.2.2 订阅主题

创建好消费者之后,下一步可以开始订阅主题了。subscribe() 方法接受一个主题列表作为参数 ,使用起来很简单:consumer.subscribe(Collections.singletonList("test"));
为了简单起见,我们创建了一个只包含单个元素的列表,主题的名字叫作“test”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值