Kafka使用之消息堆积

5,508 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

在日常工作中,你是否有偶尔出现的消息堆积而不知所措,今天我们就消息堆积的问题讨论一下。

MQ消息堆积,Broker中存在大量未被消费者及时消费的消息,导致业务功能异常(也就是指当前队列有效数据最大的偏移量broker offset 与 消费端的当前偏移量 consumer offer存在较大差值)

消息堆积原因

消息堆积发生的常见原因有以下情况:

  • 生产者短期间生产大量消息到Broker, 消费者无法及时消费(消费者并发低);
  • 生产者无法感知消息堆积,持续生产消息,导致消息堆积进一步加剧
  • 消费者能力不足,消费时间长,消费者宕机、网络异常与Broker无法通信
  • 分区设置异常
  • 新上线消费者功能存在bug,无法消费消息

总结以上

解决方案

从主要消息堆积原因来看,主要分为这几个类型,消费者端,生产者端,服务端;

  1. 消费者端
  • 增加消费者实例个数,并发消费线程数量
  • 提高消费者消费的速度,避免消费消息时间过长。如果消费者处理慢,可以提高每批次拉取的数量。批次拉取数量过少(拉取数据/处理时间 < 生产速度),就容易堆积。
  • 消费kafka消息时,应该尽量减少每次消费时间,可通过减少调用三方接口、读库等操作, 从而减少消息堆积的可能性。
  • 增加消费组服务数量,合理增加 topic 的 partition 的个数 ,消费数 >= 分区数 (二者缺一不可)
  • 消息者支持灰度发布
  • 配置消费者参数,任务启动从上次提交offset处开始消费处理
  • 如果确实容易出现堆积,消息来不及消费,建议可以先存在数据库中,然后逐条消费,不仅方便重新触发生产消息,还可以保留消费记录)
  1. 生产者端
  • 支持熔断与隔离, 当broker消息堆积时,对生产者能进行熔断,或将生产的消息先发送到其他topic
  • 设计时,Kafka消息key设置,给key加随机后缀,使其更均衡
  1. 服务端
  • 合理设置parition很重要,Kafka parition数是Kafka并行度调优的最小单元,如果Kafka分区数设置的太少,会直接影响Kafka consumer消费的吞吐量

  • 生产环境kafka必须集群, 有条件的支持异地多活,应对极端情况

  • 需要注意kafka消息保留时间(修改kafka配置文件, 默认一周)

合理设置parition很重要,且看下篇。