一、生产者端优化(发得快、不阻塞)
-
异步发送
- 同步发送会阻塞业务线程,高并发下必须用异步发送。
- 配合回调处理成功 / 失败,不影响主线程吞吐量。
-
批量发送(batch)
- 攒一批消息再一次性发送,大幅减少网络 IO。
- 控制好批量大小:过大会增加延迟,太小没效果。
-
压缩消息
- 开启 gzip/lz4/snappy 压缩。
- 大消息、文本类消息(JSON/XML)效果尤其明显。
-
控制消息大小
- 禁止超大消息(>1MB),大消息拆成小消息或用对象存储。
- 大消息会占队列、拖慢网络、增加 GC、阻塞消费。
-
合理设置重试与超时
- 重试次数不要过高,避免风暴。
- 超时时间合理,防止大量线程阻塞。
-
客户端连接池复用
- 复用 Producer、Channel、Connection,不要频繁创建销毁。
二、服务端 / Broker 优化(存得快、不卡顿)
-
磁盘优化(最关键)
- 使用 SSD,MQ 重度依赖随机读写。
- 日志文件单独挂载,避免与业务磁盘争抢。
- 关闭磁盘冗余、定期清理过期日志。
-
刷盘策略调整
- 追求性能:异步刷盘
- 追求安全:同步刷盘
- 不要无脑同步刷盘,性能掉一个量级。
-
内存配置
- 给 Broker 足够堆外内存 / 页缓存。
- 避免频繁 GC、避免内存水位过高触发阻塞。
-
分区 / 队列数量调优
- Kafka:分区数 = 消费并发上限,一般设置 2~4 倍 CPU 核心。
- RocketMQ:增加 Topic 队列数提升并行度。
- 过多会增加元数据压力,过少无法并发。
-
关闭无用特性
- 关闭自动创建 Topic/Queue。
- 关闭冗余监控、冗余日志。
- 关闭消息追踪(非必要场景)。
-
集群与网络
- 内网部署,低延迟网络。
- 主从同步使用异步,减少等待。
三、消费者端优化(消费快、不堆积)
-
提高消费并发数
- 增加消费者实例(水平扩容)。
- 增加单实例消费线程数。
- 注意:Kafka 并发上限 = 分区数。
-
批量消费 / 批量 ACK
- 一次拉取多条,批量处理,批量提交位点。
- 大幅减少网络往返和 ACK 开销。
-
关闭自动提交,合理手动 ACK
- 自动提交容易丢消息或重复消费。
- 手动 ACK 批量提交,兼顾安全与性能。
-
预取数(prefetch)合理设置
- RabbitMQ:prefetch 太小拉取频繁,太大占内存。
- 一般 10~500 之间根据业务调整。
-
消费逻辑轻量化
- 消费只做核心逻辑,慢操作(DB、HTTP、第三方接口)异步化。
- 避免在消费线程里做复杂计算、大 IO。
-
限流与降级
- 消费过载时限流,保护 Broker 和自身。
- 非核心业务可降级,避免连锁堆积。
四、架构与业务优化(从根源提速)
-
消息幂等设计
- 用唯一 ID 去重,避免重复消费导致重复计算 / DB 压力。
-
顺序消息谨慎使用
- 全局顺序会严重限制并发。
- 尽量只做局部有序(如同一用户 / 订单)。
-
避免死信 / 重试风暴
- 失败快速进入死信,不要无限重试。
- 重试间隔指数退避。
-
** Topic/Queue 拆分 **
- 快慢消息分离:快消息单独队列,不被慢消息堵住。
- 核心 / 非核心分离。
-
延迟消息专用处理
-
监控与扩容
- 实时监控:堆积量、生产速度、消费速度、耗时、GC。
- 自动扩容消费者,防止突然流量打挂。
五、三种 MQ 针对性优化要点
Kafka
- 提高分区数提升并发
- acks=1 比 acks=all 快很多
- 批量发送、压缩、批量提交
- 使用页缓存,避免频繁刷盘
RocketMQ
- 提高 Topic 队列数
- 异步刷盘 + 异步发送
- 关闭无效的事务消息、轨迹消息
- 消费线程池调大
RabbitMQ
- 预取数 prefetch 优化
- 关闭推模式,用拉模式
- 交换机绑定简化,减少路由损耗
- 队列惰性化,避免内存爆炸
六、一句话总结性能优化核心
- 生产者:异步、批量、压缩、发小消息
- Broker:SSD、异步刷盘、足够分区、足够内存
- 消费者:提高并发、批量消费、轻逻辑、防堆积
- 架构:快慢分离、避免全局顺序、做好幂等
版权声明:
作者:SE_Yang
链接:https://www.cnesa.cn/10750.html
文章版权归作者所有,未经允许请勿转载。