rabbitmq集群持续出现少量unacked消息

2020-04-14 22:48:00
CJL
原创
782

问题描述:

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的,后因为服务端兼容问题默认改为关闭了。需主动打开心跳或服务端配置心跳


php-amqplib关于心跳请求的讨论:https://github.com/php-amqplib/php-amqplib/issues/563

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.




发表评论
评论通过审核后显示。
流量统计