Kafka生产消息的最大长度是多少?
生产消息的最大长度为10M。
为什么Kafka实例常常发生Rebalance,导致消息拉取失败?
消费组的Rebalance就是对Topic分区的重新分配。
正常情况下消费组内加入新的消费者或老的消费者退出都会导致Rebalance,这种情况是无法避免的。但是某些特殊情况下,消费者会被误认为异常从而被踢出消费组,此时可能会导致消费异常,需要重点关注。
消费者被误认为异常从而被踢出消费组的场景如下:
- 未能及时发送心跳请求。
消费者以设置的heartbeat.interval.ms为间隔向broker发送心跳请求,如果broker在session.timeout.ms时间内没有收到消费者的心跳请求,broker会认为消费者异常,从而将其从消费组中踢出,然后开始新一轮的Rebalance。
- 消费者消费时间间隔过长。
消费者每次最多消费max.poll.records条消息,多数情况下客户端都会把一次消费到的数据处理完后才会开始下一次消费,如果单次消费的消息太多导致无法在max.poll.interval.ms时间内处理完或消息处理流程发生了异常(如需要写入后端数据库,后端数据库压力太大,时延增加等)导致消费时间增加,在max.poll.interval.ms时间内消费者没有发起下一次消费请求,broker认为消费者不活跃而将其踢出消费组,然后开始新一轮的Rebalance。
解决方法/排查思路
场景一: 未能及时发送心跳请求
解决方法: 建议在消费者客户端将session.timeout.ms值设置为heartbeat.interval.ms值3倍以上。
场景二: 消费者消费时间间隔过长
排查思路:
- 检查单条消息的处理时间是多久,处理max.poll.records条消息会不会超过max.poll.interval.ms时间。
- 消息处理流程是否有网络行为,如写数据库、调用后端API等,在发生Rebalance的场景下后端是否正常。
解决方法: 建议在消费者客户端将max.poll.records值减小。
为什么Console页面上,消息查询查不到消息?
- 可能原因1: 消息已被老化。
解决方法: 修改老化时间。
- 可能原因2: 消息的createTime时间戳不对。
Console页面是根据时间查询的,所以查不到。时间戳是由客户端生成,不同客户端有不同的处理策略,有的客户端默认值会是0或者-1,则查询不到消息。
解决方法: 检查客户端消息的createTime设置是否正确。
- 可能原因3: 磁盘容量超过95%,且“容量阈值策略”设置为“自动删除”。
“容量阈值策略”设置为“自动删除”,表示磁盘容量达到95%时,系统会删除最早的10%的消息,以保证磁盘容量充足。当磁盘容量超过95%时,未到达老化时间的消息也会被删除,所以可能会导致部分消息查询不到。
解决方法: 修改容量阈值策略或扩大磁盘容量。“容量阈值策略”设置为“生产受限”,表示一旦磁盘使用达到容量阈值95%,会导致后续生产失败,但保留了当前磁盘中的数据,直至数据自然老化。该场景适用于对数据不能丢的业务场景,但是会导致生产业务失败。
Kafka消息堆积了怎么办?
问题现象: 实例的监控指标“堆积消息数”产生了告警。
处理方法: 登录Kafka Manager,找出消息堆积的消费组,观察消费组是否有消费者在消费,如果有,让业务方加快消费效率,如果没有,让客户酌情删掉不使用的消费组。
消息超过老化时间,消息仍存在的原因
问题现象: 消息超过设置的老化时间(如果Topic已经设置了老化时间,此时“配置参数”中的log.retention.hours值将不对此Topic生效。仅在Topic中未设置老化时间时,“配置参数”中的log.retention.hours值才会对此Topic生效。),消息仍存在。
可能原因1: Topic的每个分区都是由多个大小相同的segment文件组成,每个segment文件的大小为500MB,当segment文件存储的消息大小到达500MB后,才会新建下一个segment文件。Kafka删除消息是删除segment文件,而不是删除一条消息。Kafka要求至少保留一个segment文件用来存储消息,如果正在使用的segment文件中包含超过老化时间的消息,由于此时segment文件不会被删除,所以超过老化时间的消息也不会被删除。
处理方法: 等待segment文件被使用完,或者删除超过老化时间的消息所在的Topic。
可能原因2: Topic中存在一条create time为未来时间的消息(例如当前时间为1月1日,create time设置成了2月1日),此消息在72小时后,并不会被老化,导致在此消息后创建的其他消息都不会被老化。
处理方法: 删除create time为未来时间的消息所在的Topic。
Kafka实例是否支持延迟消息?
不支持延迟消息。
如何查看堆积消息数?
通过以下任意一种方法,查看堆积消息数。
-
在Kafka控制台的“消费组管理”页面,单击待查看堆积消息的消费组名称,进入消费组详情页。在“消费进度”页签,查看消费组中每个Topic的总堆积数。具体步骤,请参考查询消费组信息。
-
在Kafka控制台的“监控”页面的“消费组”页签中,“消费组”选择待查看堆积消息数的消费组名称,“队列”选择“全部队列”,“消费组可消费消息数”表示此消费组中所有Topic的堆积消息数之和。查看监控数据的具体步骤,请参考查看监控数据。
-
在云监控页面的“消费组”页签中,“消费组”选择待查看堆积消息数的消费组名称,“队列”选择“全部队列”,“消费组可消费消息数”表示此消费组中所有Topic的堆积消息数之和。查看监控数据的具体步骤,请参考查看监控数据。
-
在Kafka客户端,在“/{命令行工具所在目录}/kafka_{version}/bin/”目录下,通过 kafka-consumer-groups.sh --bootstrap-server {kafka连接地址} --describe --group {消费组} 命令查看消费组中每个Topic的堆积消息数。“LAG”表示每个Topic的总堆积数。
图 查看每个Topic的总堆积数
说明
如果Kafka实例开启SASL认证,则以上命令还需要增加SASL认证的“consumer.properties”配置文件参数: --command-config {SASL认证的consumer.properties配置文件} ,“consumer.properties”配置文件参考开启SASL认证的Kafka命令行连接说明。
为什么消息创建时间显示1970?
消息创建时间是由生产客户端在生产消息时通过CreateTime指定的,如果生产消息时没有设置此参数,消息创建时间会默认为1970。