kafka 中参数:session.timeout.ms 和 heartbeat.interval.ms的区别

本文详细解析了Kafka消费者的关键参数,包括session.timeout.ms、heartbeat.interval.ms和max.poll.interval.ms。解释了它们在消费者心跳、会话超时和重平衡过程中的作用。当消费者处理消息时间过长可能导致超时被踢出消费组,而心跳线程则负责保持消费者与协调器之间的连接。此外,文中还探讨了如何避免因消息处理延迟而引发的频繁重平衡问题。

给大家推荐一款好用的优快云云服务,新人首购折扣哦,点击下图跳转:
优快云开发云



涉及到三个参数:

  • session.timeout.ms:group coordinator检测consumer发生崩溃所需的时间。一个consumer group里面的某个consumer挂掉了,最长需要 session.timeout.ms 秒检测出来。它指定了一个阈值—10秒,在这个阈值内如果group coordinator未收到consumer的任何消息(指心跳),那coordinator就认为consumer挂了。
  • heartbeat.interval.ms:每个consumer 都会根据 heartbeat.interval.ms 参数指定的时间周期性地向group coordinator发送 hearbeat,group coordinator会给各个consumer响应,若发生了 rebalance,各个consumer收到的响应中会包含 REBALANCE_IN_PROGRESS 标识,这样各个consumer就知道已经发生了rebalance,同时 group coordinator也知道了各个consumer的存活情况。
  • max.poll.interval.ms:如果consumer两次poll操作间隔超过了这个时间,broker就会认为这个consumer处理能力太弱,会将其踢出消费组,将分区分配给别的consumer消费 ,触发rebalance 。

总结:new KafkaConsumer对象后,在while true循环中执行consumer.poll操作拉取消息中,会有两个线程执行:一个是heartbeat 线程,另一个是processing线程。

  • processing线程可理解为调用consumer.poll方法执行消息处理逻辑的线程,
  • 而heartbeat线程是一个后台线程,对程序员是"隐藏不见"的。heartbeat线程每隔heartbeat.interval.ms向coordinator发送一个心跳包,证明自己还活着。但是如果group coordinator在一个heartbeat.interval.ms周期内未收到consumer的心跳,就把该consumer移出group,这有点说不过去。事实上,有可能网络延时,有可能consumer出现了一次长时间GC,影响了心跳包的到达,说不定下一个heartbeat就正常了。而如果group coordinator在session.timeout.ms 内未收到consumer的心跳,那就会把该consumer移出group。

max.poll.interval.ms参数,在consumer两次poll操作间隔超过了这个时间,即consumer的消息处理逻辑时长超过了max.poll.interval.ms,该消费者就会被提出消费者组。



多个业务往向一个Kafka topic发送消息,有些业务的消费量很大,有些业务的消息量很小。因Kafka尚未较好地支持按优先级来消费消息,导致某些业务的消息消费延时的问题。

一种简单的解决方案是再增加几个Topic,面对一些系统遗留问题,增加Topic带来的是生产者和消费者处理逻辑复杂性。

一种方法是使用Kafka Standalone consumer,先使用consumer.partitionFor("TOPIC_NAME")获取topic下的所有分区信息,再使用consumer.assign(partitions)显示地为consumer指定消费分区。

另一种方法是基于consumer group 自定义Kafka consumer的分区分配策略,那这时候就得对Kafka目前已有的分区分配策略有所了解,并且明白什么时候、什么场景下触发rebalance?

1、heartbeat.interval.ms

Kafka consumer要消费消息,哪些的分区的消息交给哪个cons

kafka-producer-config: key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: io.confluent.kafka.serializers.KafkaAvroSerializer compression-type: snappy acks: all batch-size: 16384 batch-size-boost-factor: 100 linger-ms: 5 request-timeout-ms: 60000 retry-count: 5 kafka-consumer-config: key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: io.confluent.kafka.serializers.KafkaAvroDeserializer auto-offset-reset: earliest specific-avro-reader-key: specific.avro.reader specific-avro-reader: true batch-listener: true auto-startup: true concurrency-level: 3 session-timeout-ms: 10000 max-poll-interval-ms: 300000 heartbeat-interval-ms: 3000 poll-timeout-ms: 150 max-poll-records: 500 max-partition-fetch-bytes-default: 1048576 max-partition-fetch-bytes-boost-factor: 1 # 暂定只消费任务审核信息 mission-approval-consumer-group-id: mission-approval-topic-consumer route-created-consumer-group-id: route-created-topic-consumer mission-execution-finished-consumer-group-id: mission-execution-finished-topic-consumer inspection-analysis-finished-consumer-group-id: inspection-analysis-finished-topic-consumer kafka消费者生产者的 key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: io.confluent.kafka.serializers.KafkaAvroSerializer key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: io.confluent.kafka.serializers.KafkaAvroDeserializer不一样呢
11-26
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悬浮海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值