2016-08-04 137 views
2

我的應用程序從RabbitMQ消費一些消息並處理它們。 我有大約10個隊列,每個隊列有多達10個消費者(線程)。 我有一個預取5.我使用CloudAMQP插件(RabbitMQ作爲服務)在Heroku中運行我的設置。RabbitMQ java客戶端停止消費消息

我正在運行默認的心跳和連接超時設置(60秒)。

我的java應用程序是使用spring-rabbit庫的spring引導應用程序。

版本:

RabbitMQ 3.5.3 
Erlang 17.5.3 
Java 1.8 
Spring boot 1.3.2.RELEASE 
Spring rabbit 1.5.3.RELEASE 

的問題是,對於消費者一個特定的隊列停止消費消息的一段時間後。當我重新啓動我的Java應用程序時,一切正常。其他隊列正在被正常使用。在應用程序方面沒有錯誤。在兔子身邊的日誌流中,我看到一些條目,如

= REPORT==== 2016-08-02 15:53:32 UTC === 
closing AMQP connection <SOMETHING> (SOMETHING_ELSE -> SOMETHING_ELSE_ELSE): 
{heartbeat_timeout,running} 

我無法在Heroku中本地或在測試環境中進行復制。

更新

下面的代碼可以在AMQConnection.class

int heartbeat = negotiatedMaxValue(this.requestedHeartbeat, 
            connTune.getHeartbeat()); 


private static int negotiatedMaxValue(int clientValue, int serverValue) { 
     return (clientValue == 0 || serverValue == 0) ? 
      Math.max(clientValue, serverValue) : 
      Math.min(clientValue, serverValue); 
} 

發現我不能增加超過60秒的心跳值(這是我從服務器獲取)。

回答

2

不幸的是,這似乎是一個網絡問題。這可能是由於幾件事情:

  • CloudAMQP服務有一些問題,並正在消除您的連接(不太可能,因爲您的其他消費者工作正常)。
  • 您的CloudAMQP計劃不允許儘可能多的併發連接。你有沒有檢查過,以確保你有足夠高的計劃來支持你的所有消費者? https://elements.heroku.com/addons/cloudamqp
  • 您的Heroku dyno與正在討論的使用者正在重新啓動,這會導致您的連接斷開。 Heroku dynos定期重啓。如果您的dynos無法正常重啓,您可能需要調查原因。
  • 您的Heroku dynos之一有網絡問題(在這種情況下,它可能會自己重新啓動,而無需您的干預)。

強制所有dynos重新啓動的一種方法是運行$ heroku ps:restart。這將強制Heroku重新啓動您的dynos,這通常意味着將它們移動到新的EC2主機。如果這是一個問題,這可能會有所幫助。

+0

你好@rdegges。感謝您的幫助。該計劃足夠大來處理所有的連接。此外(這是我的不好,我不清楚)消費者最初都在工作,但偶爾這個特定隊列的消費者會停止消費。如果我重新啓動應用程序,那麼一切正常,消費者再次開始工作。我不能重現它。我的應用程序運行在一臺大型機器上(PL Web 1)。我熟悉heroku infra的性質(重新啓動等),應用程序可以處理這個問題。 – alkis

+0

我在想這可能是由於過載與心跳配置相結合導致的。我正在等待這種情況再次發生,看看這個特定的消費者連接是否被兔子丟棄,但消費者仍然沒有意識到(這將解釋沒有任何錯誤日誌)。如果發生這種情況,那麼將心跳更改爲更大的值可能會修復它。但我不知道這是否可能。檢查我的更新。 – alkis

+0

啊,這使診斷更加棘手。特別是如果它不能很容易地複製:(但是,消費者應該重新啓動連接,如果它下降。你的心跳配置看起來很好給我 – rdegges