[TOC] #### 1. 消息堆积 --- 系统上线半年了,消息量从每天几千条涨到了每天几百万条 某天你发现:消费者开始跟不上了,队列里的消息越来越多,管理界面看了一下,Ready 数字一直在涨 消息堆积了,为什么会堆积 ?消息堆积的原因通常就两个: + 生产太快:瞬间涌入大量消息,消费者处理不过来。 + 消费太慢:消费者逻辑太重,或者消费者数量不够。 解决思路也很简单:要么让生产慢一点,要么让消费快一点 #### 2. 消费端优化 --- 一、增加消费者数量:最直接的方式就是多启动几个消费者进程 ```bash # 终端 1 php consumer.php & # 终端 2 php consumer.php & # 终端 3 php consumer.php & ``` 一个队列可以被多个消费者同时消费,消息会轮流分配 消费者数量翻倍,处理速度就翻倍 但要注意:消费者数量不能超过队列里的消息数量,否则多余的消费者会空闲 二、减少单条消息处理时间 消费者处理慢,很多时候是业务逻辑太重 比如消费者里调用了外部接口、做了复杂计算、写了大量数据库操作 优化思路: + 外部接口改成异步调用 + 数据库操作批量处理 + 不必要的逻辑移到别的地方 三、使用 prefetch 控制预取数量 ```php $channel->basic_qos(null, 10, null); ``` 这行代码告诉 RabbitMQ:一次最多给这个消费者发 10 条消息 等消费者处理完这 10 条,再发下一批,避免消费者一次性拿到太多消息,处理不过来导致内存溢出 #### 3. 生产端优化 --- 一、控制发送速率 如果消费者确实处理不过来,可以在生产端限流 比如限制每秒最多发 100 条消息,多余的请求先排队等待,或者直接拒绝 二、使用流控机制 RabbitMQ 内置了流控(Flow Control) 当某个节点资源不足时,RabbitMQ 会自动减慢消息接收速度,这是自动的,不需要你手动配置 但如果你看到管理界面出现了flow状态,说明 RabbitMQ 在做流控,可能是资源不足了 #### 4. 监控什么 --- 部署 RabbitMQ 之后,一定要有监控 重点监控这几个指标: 队列层面 | 指标 | 含义 | 告警阈值 | | ------------ | ------------ | ------------ | | Ready | 等待消费的消息数 | 持续增长就告警 | | Unacked | 已发未确认的消息数 | 超过预期就告警 | | Consumers | 消费者数量 | 变成 0 立刻告警 | 节点层面 | 指标 | 含义 | | ------------ | ------------ | | 内存使用 | RabbitMQ 内存占用 | | 磁盘使用 | 消息持久化占用的空间 | | 连接数 | 当前客户端连接数 | | 文件描述符 | 系统资源限制 | 消息速率(如果 publish rate 持续大于 deliver rate,消息一定会堆积) | 指标 | 含义 | | ------------ | ------------ | | publish rate | 消息生产速率 | | deliver rate | 消息消费速率 | | ack rate | 消息确认速率 | #### 5. 监控方式 --- 方式一:管理界面 最简单,打开管理界面直接看,适合开发和测试环境 方式二:Prometheus + Grafana RabbitMQ 支持 Prometheus 指标导出 启用插件: ```plaintext rabbitmq-plugins enable rabbitmq_prometheus ``` 然后用 Grafana 做可视化仪表盘,适合生产环境,可以设置告警规则 方式三:RabbitMQ Management API 通过 HTTP API 获取队列和节点状态: ```bash curl -u guest:guest http://localhost:15672/api/queues ``` 可以写脚本定时检查,发现问题发告警 #### 6. 常见性能问题 --- 几个常见的性能问题 | 问题 | 可能原因 | 解决方案 | | ------------ | ------------ | ------------ | | 消息堆积 | 消费者太少或太慢 | 增加消费者、优化逻辑 | | 内存暴涨 | 大量消息堆积在内存 | 设置队列最大长度 | | 连接数爆满 | 每次发消息都新建连接 | 使用连接池 | | 消息延迟高 | 网络或磁盘瓶颈 | 检查服务器资源 | #### 7. 本文小结 --- RabbitMQ 性能优化的核心思路: + 消费端:增加消费者、优化处理逻辑、控制 prefetch + 生产端:控制发送速率、利用流控机制 + 监控:队列状态、节点资源、消息速率 记住一句话:消息堆积是信号,不是问题本身 堆积说明消费能力跟不上生产速度,要找到瓶颈在哪里 下一讲,我们来做最后一讲:常见问题与排错清单