Consumer处理一张大报表要十几分钟,中途RabbitMQ关闭连接,日志里是missed heartbeats。把heartbeat直接设成0看似解决,实际上失去了断线检测。

先看任务期间CPU、网络和单条消息耗时。一个消息做十万条数据,PHP长时间计算或外部API阻塞,连接没有机会维持心跳。更好的修复是把任务拆成小批,每条消息只处理可控数量,并保存游标。

grep -n "heartbeat" app/etc/env.php
rabbitmq-diagnostics environment | grep heartbeat
rabbitmqctl list_connections name user state timeout channels send_pend

超时要成套看

AMQP heartbeat、代理idle timeout、外部HTTP timeout和Supervisor stopwaitsecs互相影响。heartbeat可以适度提高,但必须小于中间网络设备的空闲断开时间。

拆分后故意重启Consumer,确认未完成批次能从游标继续,不重复生成数据。再跑超过原故障时长的压力测试,观察连接状态和ack速率。