rabbitmq集群持續齣現少量unacked消息

2020-04-14 22:48:00
CJL
原創
5453

問題描述:

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.




發錶評論
評論通過審核後顯示。
流量統計