赞
踩
问题描述:
rabbitmq队列经常出现unacked消息,且长时间无法重现ready。
在rabbitmq上可以看到多个tcp连接(ESTABLISHED),实际仅一个进程在运行,可能php进程退出后未断开连接,导致消息一直在unacked状态,时间分布上有15分钟重试一次的特征,随机时间后重试消失,初步怀疑和tcp默认配置的超时15分钟有关。
仅rabbitmq集群出现怀疑与集群负载均衡的tcp连接保持配置有关。
解决方案:
1、rabbitmq异常没有处理,php因异常或主动结束进程未主动断开连接,通过负载均衡后会保持此连接。需catch异常主动断开连接
2、几分钟未接受消息,在推送消息后接收消息成功,发送ack失败,程序异常退出,无法主动断开连接。可能负载均衡会对无数据的tcp单向断开,经测试加心跳后可解决。php-amqplib 2.9.0~2.10.0 之间是默认打开heartbeat=60的,后因为服务端兼容问题默认改为关闭了。需主动打开心跳或服务端配置心跳
Heartbeats can be disabled by setting the timeout interval to 0. This is not a recommended practice.
Heartbeat timeouts from 10 to 30 seconds will produce periodic network traffic often enough (roughly every 5 to 15 seconds)) to satisfy defaults of most proxy tools and load balancers. Also see the section on low timeouts and false positives above.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。