kafka 消费者参数 Kafka heartbeat.interval.ms 与 session.timeout.ms与 max.poll.interval.ms

本文详细解析了Kafka中heartbeat.interval.ms与session.timeout.ms参数的作用及配置策略。自0.10.1版本起,Kafka引入独立的心跳线程,确保即使在消息处理耗时较长的情况下,消费者也能避免因超时被移除。文章对比了新旧版本中消费者行为的变化,强调了分离心跳与消息处理的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Kafka heartbeat.interval.ms 与 session.timeout.ms

**在kafka0.10.1之后的版本中,将session.timeout.ms 和 max.poll.interval.ms 解耦了。**也就是说:new KafkaConsumer对象后,在while true循环中执行consumer.poll拉取消息这个过程中,其实背后是有2个线程的,即一个kafka consumer实例包含2个线程:一个是heartbeat 线程,另一个是processing线程,processing线程可理解为调用consumer.poll方法执行消息处理逻辑的线程,而heartbeat线程是一个后台线程,对程序员是"隐藏不见"的。如果消息处理逻辑很复杂,比如说需要处理5min,那么 max.poll.interval.ms可设置成比5min大一点的值。而heartbeat 线程则和上面提到的参数 heartbeat.interval.ms有关,heartbeat线程 每隔heartbeat.interval.ms向coordinator发送一个心跳包,证明自己还活着。只要 heartbeat线程 在 session.timeout.ms 时间内 向 coordinator发送过心跳包,那么 group coordinator就认为当前的kafka consumer是活着的。

**在kafka0.10.1之前,发送心跳包和消息处理逻辑这2个过程是耦合在一起的,**试想:如果一条消息处理时长要5min,而session.timeout.ms=3000ms,那么等 kafka consumer处理完消息,group coordinator早就将consumer 移出group了,因为只有一个线程,在消息处理过程中就无法向group coordinator发送心跳包,超过3000ms未发送心跳包,group coordinator就将该consumer移出group了。而将二者分开,一个processing线程负责执行消息处理逻辑,一个heartbeat线程负责发送心跳包,那么:就算一条消息需要处理5min,只要底heartbeat线程在session.timeout.ms向group coordinator发送了心跳包,那consumer可以继续处理消息,而不用担心被移出group了。另一个好处是:如果consumer出了问题,那么在 session.timeout.ms内就能检测出来,而不用等到 max.poll.interval.ms 时长后才能检测出来。

作者:taj3991
链接:https://www.jianshu.com/p/408f1de5aeaf
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

现在flinksql的那段脚本修改为了这段设置,在mrs平台上是能正常运行的,数据也能入库(换了新的kafka ip和topic), { # Kafka broker 的地址列表 bootstrap.servers=xxxxx # 消费者的组 ID,用于标识消费组 group.id=fs_lc_002 topic=cms_power_curve ## 安全验证 sasl.kerberos.service.name=kafka sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username='x' password='xxx'; security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN # 是否自动提交偏移量。默认是 true enable.auto.commit=true # 自动提交偏移量的时间间隔,单位是毫秒。仅在 enable.auto.commit=true 时有效。 auto.commit.interval.ms=5000 # 每次调用 poll() 时最大返回的消息数。 max.poll.records=5000 # 两次 poll() 调用的最大间隔。如果消费者在指定时间内未能调用 poll(),则 Kafka 会认为消费者挂起并将其从消费组中移除 max.poll.interval.ms=3000 # 消费者从服务器获取的最小数据量(字节),默认为 1 fetch.min.bytes=1024 # 消费者最多等待的时间(毫秒),用来决定在 fetch.min.bytes 达到前等待的最大时间。当服务器没有足够的数据时,消费者会等待该时间。 fetch.max.wait.ms=500 # 每次 fetch 从服务器拉取的最大数据量 5MB fetch.max.bytes=5242880 # 消费者从每个分区中获取的最大字节数。这有助于在多分区情况下防止某些分区过度消费,导致其他分区的数据堆积。 max.partition.fetch.bytes=1048576 # Kafka 客户端向 Kafka broker 发送请求时,如果在指定的超时时间内没有收到响应,客户端将放弃该请求并抛出超时异常 request.timeout.ms=60000 # 消费者 Kafka broker 之间的会话超时时间 session.timeout.ms=60000 # 消费者Kafka 集群发送心跳的时间间隔,用于告知它仍然活跃 heartbeat.interval.ms=3000 # 消费者等待数据的超时时间。如果在超时内没有数据到达,消费者将抛出 ConsumerTimeoutException。 consumer.timeout.ms=-1 }这段java代码中的properties命名为b01 原来a01和b01都能正常运行,现在a01脚本修改为了a02脚本,因为需要修改kafka ip和topic,目前a01和a02都能正常运行,数据正常入库,现在请帮我把原本正常运行的b01 java代码中的properties 设置修改出一版b02来帮我适配新的kafka 中的flinksql 脚本a02(就按照b01的格式尽可能少的修改)
03-11
### 创建新的 Kafka 消费者 Properties 设置 为了确保 b02 版本能够正确连接到新的 Kafka IP 和 Topic 并保持原有配置不变,可以按照以下方法修改 `Properties` 对象: #### 修改 Kafka Consumers 的 Properties 设置 在 Java 代码中,通过调整 `Properties` 类实例来指定新的 Kafka Broker 地址和主题名称。具体实现如下所示: ```java import org.apache.kafka.clients.consumer.ConsumerConfig; import java.util.Properties; public class KafkaConsumerSetup { public static Properties getUpdatedKafkaConsumerProps() { Properties props = new Properties(); // 原有配置项保留 props.put(ConsumerConfig.GROUP_ID_CONFIG, "your-consumer-group"); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); // 更新后的Kafka集群IP地址 String kafkaBrokerList = "new_kafka_broker_ip:9092"; props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaBrokerList); // 新增或变更的主题名 String topicName = "new_topic_name"; return props; } } ``` 上述代码片段展示了如何构建一个包含必要参数的 `Properties` 实例[^1]。 对于 Java 环境的要求,考虑到当前使用的 Scala 版本为 2.12,则应确保安装的是不低于 1.8.0_111 的 Oracle JDK 或 OpenJDK 版本[^2]。 另外,在执行任何操作之前,请确认已接受 Oracle License 条款并完成相应软件包下载安装工作[^3]。 #### 启动 Kafka Server 当所有准备工作完成后,可以通过批处理文件启动 Kafka server: ```batchfile D:\kafka\kafka_2.12-1.0.0\bin\windows\kafka-server-start.bat D:\kafka\kafka_2.12-1.0.0\config\server.properties ``` 此命令用于启动位于特定路径下的 Kafka broker 实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值