2016-08-17 87 views
1

工作。隊列顯示消費者不再存在,我假設發生的事情是RabbitMQ繼續向消費者傳遞消息。它們表現爲不斷增加的未消息信息數量。我使用php-amqplib在PHP中執行此操作。的RabbitMQ無法獲得與心跳我所觀察到的RabbitMQ「卡住」與UNACKED消息PHP-amqplib

我可以通過殺死消費者進程(命令行上的控制-C)產生的問題。

我試圖指定3秒的心跳,並試圖保持活躍真假兩。有了心跳,消費者最終將失敗:

Exception fwrite(): send of 573 bytes failed with errno=32 Broken pipe 
PhpAmqpLib\Wire\IO\StreamIO->error_handler(8, 'fwrite(): send ...', 
php-amqplib/PhpAmqpLib/Wire/IO/StreamIO.php(281): fwrite(Resource id #176, '\x01\x00\x01\x00\x00\x00\x15\x00<\x00(\x00\x00\fb...', 8192) 

問題#374可能涉及:https://github.com/php-amqplib/php-amqplib/issues/374

消費者從多個隊列耗時,但我認爲,不應該的問題。

我試圖解決的問題是,RabbitMQ繼續認爲,消費者存在時,它沒有,結果是RabbitMQ無處傳遞這些消息,他們去不承認。我正在尋找一種擺脫虛假連接的方式,以便這些消息可以重新傳送給現場消費者。我認爲這就是心跳,但我沒有得到它的工作。

+0

死的TCP連接你有沒有在你的消費者自動啓用ACK? – cantSleepNow

+0

我不知道。消息工作完成後,我需要通過ack進行節流。 –

回答

2

第一,更重要的認爲我們需要在這種情況下能做的就是盡力「打印」你的內容信息,只返回true消費者,不處理你真正的代碼,如果你能「消費」消息這個問題不是在兔子身上,而是在我們的過程中,因爲我們可能花費很多時間來承認給兔子的信息,並且兔子關閉我們的聯繫。

在我來說,我改變這個問題的辦法,因爲我對每封郵件與其花費很長時間才能ACK處理這麼多的產品ID,我適合我的消息,並且效果很好做了。

我們可以改變技術途徑想創建另一個隊列,以適應這個消息,我不知道,但90%的問題是它。

你可以閱讀更多有關檢測與心跳here

+0

不幸的是,這並沒有幫助指出的問題。問題不在於消費者花了很長時間來確認消息。消息在約20毫秒內消失。我相信問題在於消費者流程不再存在,但RabbitMQ認爲消費者仍然存在。我可以在RabbitMQ管理頁面上看到這一點(消費者到隊列的連接數量)。然後RabbitMQ繼續「傳遞」消息,但實際上並沒有被任何東西接收到。我可以在管理頁面上看到這個數字的上升和下降。 –