kafka出现若干分区不消费的现象

kafka出现若干分区不消费的现象

背景

近日,有用户反馈kafka有topic出现某个消费组消费的时候,有几个分区一直不消费消息,消息一直积压(图1)。除了一直积压外,还有一个现象就是消费组一直在重均衡,大约每5分钟就会重均衡一次。具体表现为消费分区的owner一直在改变(图2)。
图1
(图1)

图2
(图2)

定位过程

业务侧没有报错,同时kafka服务端日志也一切正常,同事先将消费组的机器滚动重启,仍然还是那几个分区没有消费,之后将这几个不消费的分区迁移至别的broker上,依然没有消费。
还有一个奇怪的地方,就是每次重均衡后,不消费的那几个分区的消费owner所在机器的网络都有流量变化。按理说不消费应该就是拉取不到分区不会有流量的。于是让运维去拉了下不消费的consumer的jstack日志。一看果然发现了问题所在。
在这里插入图片描述
从堆栈看,consumer已经拉取到消息,然后就一直卡在处理消息的业务逻辑上。这说明kafka是没有问题的,用户的业务逻辑有问题。consumer在拉取完一批消息后,就一直在处理这批消息,但是这批消息中有若干条消息无法处理,而业务又没有超时操作或者异常处理导致进程一直处于消费中,无法去poll下一批数据。又由于业务采用的是autocommit的offset提交方式,而根据源码可知,consumer只有在下一次poll中才会自动提交上次poll的offset,所以业务一直在拉取同一批消息而无法更新offset。反映的现象就是该consumer对应的分区的offset一直没有变,所以有积压的现象。
至于为什么会一直在重均衡消费组的原因也很明了了,就是因为有消费者一直卡在处理消息的业务逻辑上,超过了max.poll.interval.ms(默认5min),消费组就会将该消费者踢出消费组,从而发生重均衡。

验证

让业务方去查证业务日志,验证了积压的这几个分区,总是在循环的拉取同一批消息。

解决方法

临时解决方法就是跳过有问题的消息,将offset重置到有问题的消息之后。本质上还是要业务侧修改业务逻辑,增加超时或者异常处理机制,最好不要采用自动提交offset的方式,可以手动管理。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Kafka是一款分布式的流处理平台,可以用来处理大规模的实时数据流。在Kafka中,消息以主题(topic)的形式进行存储和组织,而主题又被划分为多个分区(partition)。 消费者(consumer)可以从指定的分区中读取消息。消费者可以通过指定分区编号或者分区副本所在的主机地址来消费特定分区的消息。 当我们需要消费指定分区时,可以按照以下步骤进行操作: 首先,创建一个Kafka消费者对象,在创建消费者时,需要指定消费者组ID和消费者配置参数。 然后,指定要消费分区Kafka提供了两种方式进行分区的指定: 1. 通过指定分区编号:可以通过`assign()`方法将指定的分区编号传递给消费者。例如,`consumer.assign(Collections.singleton(new TopicPartition("topicName", 1)));`表示将消费者指定为消费主题名为"topicName"下分区编号为1的分区的消息。 2. 通过指定主机地址:可以通过`assign()`方法将指定的主机地址传递给消费者。例如,`consumer.assign(Collections.singleton(new TopicPartition("topicName", new Node(1, "hostName", 9092))));`表示将消费者指定为消费主题名为"topicName"下分区副本所在的主机为"hostName",端口号为9092的分区的消息。 最后,通过调用`poll()`方法来获取指定分区的消息。消费者会从指定分区的最新消息位置开始读取消息,并持续地从该分区获取新的消息。 需要注意的是,在消费者中指定分区后,消费者只会读取该分区的消息,并忽略其他分区的消息。如果需要消费多个分区的消息,可以重复调用`assign()`方法来指定多个分区。 以上就是使用Kafka消费指定分区的简要介绍,希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值