沉梦听雨的编程指南 沉梦听雨的编程指南
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)

沉梦听雨

时间是最好的浸渍剂,而沉淀是最好的提纯器🚀
首页
  • 基础篇
  • 集合篇
  • 并发篇
  • JVM
  • 新特性
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 基础篇
  • MySql
  • Redis
  • 达梦数据库
  • Spring
  • SpringBoot
  • Mybatis
  • Shiro
  • 设计须知
  • UML画图
  • 权限校验
  • 设计模式
  • API网关
  • RPC
  • 消息队列
  • SpringCloud
  • 分布式事务
  • 云存储
  • 搜索引擎
  • 多媒体框架
  • 虚拟机
  • 开发工具篇
  • 工具库篇
  • 开发技巧篇
  • 工具类系列
  • 随笔
  • 前端环境搭建
  • HTML与CSS
  • JS学习
  • Axios入门
  • Vue Router入门
  • Pinia入门
  • Vue3入门
  • Vue3进阶
  • 黑马Vue3
  • 脚手架搭建
  • 瑞吉外卖
  • 黑马点评
  • vue-blog
  • 沉梦接口开放平台
  • 用户中心
  • 聚合搜索平台
  • 仿12306项目
  • 壁纸小程序项目
  • RuoYi-Vue
  • 博客搭建
  • 网站收藏箱
  • 断墨寻径摘录
  • 费曼学习法
Github (opens new window)
  • API网关

  • RPC

  • 消息队列

    • 内存

    • Redis

    • RocketMQ

    • Kafka

      • Kafka基础小结
      • Kafka的下载安装以及使用
      • SpringBoot使用Kafka示例
      • SpringCloud使用Kafka
      • Kafka实现延迟消息
      • 消息堆积处理方案
        • 什么是消息堆积?
        • 定位消息堆积的原因
        • 处理消息堆积的策略
          • 1. 快速扩容消费端
          • 2. 开启并发消费 / 多线程处理
          • 3. 优化消费逻辑
          • 4. 使用消费补偿机制
          • 5. 使用消息优先级 / 分流
          • 6. 使用限流+削峰
          • 7. 增加 Partition / Queue 数量
          • 8. 监控与报警
        • 模拟场景与对策
        • 总结
      • Kafka实现顺序消费
  • Spring Cloud

  • 分布式事务

  • 云存储

  • 搜索引擎

  • 多媒体框架

  • 虚拟机

  • 微服务
  • 消息队列
  • Kafka
沉梦听雨
2025-06-26
目录

消息堆积处理方案

# 消息堆积处理方案

处理消息堆积是分布式系统和消息队列架构中的高频面试题和实战问题,需要从监控、定位、扩容、削峰、限流、重构等多个角度去分析和解决。

# 什么是消息堆积?

消息堆积指的是:消息生产者发送速度 > 消费者处理速度,导致消息在 Broker 中越积越多,严重时会触发系统报警甚至 OOM 崩溃。

# 定位消息堆积的原因

常见原因:

原因 说明
消费端宕机 无法正常拉取消息
消费端处理慢 业务处理耗时长,如调用慢接口
消费端线程太少 无法并发处理大量消息
消息量突增 秒杀/大促等瞬时高流量
死信消息未清理 消息重复消费失败,卡死积压
网络延迟/带宽瓶颈 消费端到 broker 的网络问题

# 处理消息堆积的策略

# 1. 快速扩容消费端

横向扩容是最直接有效的方式:

  • 增加消费者实例数(Kafka 增加消费者组成员,RocketMQ 新建多个消费者进程)
  • 增加每个消费者的线程池大小,提升消费吞吐量

# 2. 开启并发消费 / 多线程处理

  • Kafka 使用多线程 poll + 线程池处理业务逻辑
  • RocketMQ 设置 consumeMessageBatchMaxSize 和线程数
  • 避免串行消费逻辑

# 3. 优化消费逻辑

比如:

  • 把同步远程调用改成异步
  • 数据库操作改成批量插入
  • 避免事务过大、索引不走等慢 SQL
  • 减少不必要的业务判断、日志打印等

# 4. 使用消费补偿机制

当消费失败时:

  • 限次数重试(避免死循环)
  • 将失败消息投递到死信队列(DLQ)
  • 定时任务异步处理补偿逻辑

# 5. 使用消息优先级 / 分流

  • 将重要消息单独走高优先级 topic 或 consumer
  • 热点数据 / 非热点数据拆开消费
  • 按业务类型拆分队列,防止被长耗时消息阻塞

# 6. 使用限流+削峰

  • 入口处限流(令牌桶 / 漏桶)
  • 将高并发请求转为消息异步处理(削峰)
  • 使用缓存/本地消息缓冲减少写库压力

# 7. 增加 Partition / Queue 数量

  • Kafka 增加 partition,可提高并发消费能力(但注意消息顺序)
  • RocketMQ 增加队列数或 topic 分片

# 8. 监控与报警

必须配合实时的监控与报警:

  • 消费堆积长度(topic lag)
  • 消息消费成功/失败率
  • 消费延迟/耗时
  • 消费异常日志

# 模拟场景与对策

场景:我们使用 Kafka 作为异步处理通道,在高峰期发现消息堆积。

我的应对措施:

  1. 通过监控系统发现某个 topic lag 超过阈值;
  2. 先排查消费端是否存在消费失败或处理慢,确认是某个接口慢;
  3. 我将该接口做了异步优化,DB 写操作改为批量;
  4. 同时扩容了消费线程池和实例数;
  5. 对失败消息引入重试 + 死信队列,确保消费成功率;
  6. 对入口流量做限流和缓存降压,避免产生更多堆积;
  7. 最后加了 dashboard + 消费报警,确保下次能提前发现问题。

# 总结

消息堆积通常是消费处理能力不足引起的,可以通过扩容消费者、优化消费逻辑、异步重试补偿、限流削峰、增加分区数量等方式解决,同时配合监控和报警及时发现问题。

上次更新: 2025/7/1 09:31:37
Kafka实现延迟消息
Kafka实现顺序消费

← Kafka实现延迟消息 Kafka实现顺序消费→

Theme by Vdoing | Copyright © 2023-2025 沉梦听雨 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式