携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
在日常工作中,你是否有偶尔出现的消息堆积而不知所措,今天我们就消息堆积的问题讨论一下。
MQ消息堆积,Broker中存在大量未被消费者及时消费的消息,导致业务功能异常(也就是指当前队列有效数据最大的偏移量broker offset 与 消费端的当前偏移量 consumer offer存在较大差值)
消息堆积原因
消息堆积发生的常见原因有以下情况:
- 生产者短期间生产大量消息到Broker, 消费者无法及时消费(消费者并发低);
- 生产者无法感知消息堆积,持续生产消息,导致消息堆积进一步加剧
- 消费者能力不足,消费时间长,消费者宕机、网络异常与Broker无法通信
- 分区设置异常
- 新上线消费者功能存在bug,无法消费消息
总结以上
解决方案
从主要消息堆积原因来看,主要分为这几个类型,消费者端,生产者端,服务端;
- 消费者端
- 增加消费者实例个数,并发消费线程数量
- 提高消费者消费的速度,避免消费消息时间过长。如果消费者处理慢,可以提高每批次拉取的数量。批次拉取数量过少(拉取数据/处理时间 < 生产速度),就容易堆积。
- 消费kafka消息时,应该尽量减少每次消费时间,可通过减少调用三方接口、读库等操作, 从而减少消息堆积的可能性。
- 增加消费组服务数量,合理增加 topic 的 partition 的个数 ,消费数 >= 分区数 (二者缺一不可)
- 消息者支持灰度发布
- 配置消费者参数,任务启动从上次提交offset处开始消费处理
- 如果确实容易出现堆积,消息来不及消费,建议可以先存在数据库中,然后逐条消费,不仅方便重新触发生产消息,还可以保留消费记录)
- 生产者端
- 支持熔断与隔离, 当broker消息堆积时,对生产者能进行熔断,或将生产的消息先发送到其他topic
- 设计时,Kafka消息key设置,给key加随机后缀,使其更均衡
- 服务端
-
合理设置parition很重要,Kafka parition数是Kafka并行度调优的最小单元,如果Kafka分区数设置的太少,会直接影响Kafka consumer消费的吞吐量
-
生产环境kafka必须集群, 有条件的支持异地多活,应对极端情况
-
需要注意kafka消息保留时间(修改kafka配置文件, 默认一周)
合理设置parition很重要,且看下篇。