2016-08-04 35 views
2

Meine Anwendung verbraucht einige Nachrichten von RabbitMQ und verarbeitet sie. Ich habe etwa 10 Warteschlangen und jede Warteschlange hat bis zu zehn Verbraucher (Threads). Ich habe einen Prefetch von 5. Ich verwende mein Setup in Heroku mit dem CloudAMQP-Plugin (RabbitMQ als Dienst).RabbitMQ Java-Client hört auf, Nachrichten zu konsumieren

Ich bin mit den Standard-Heartbeat und Connection Timeout-Einstellungen (60 Sekunden) ausgeführt.

Meine Java-Anwendung ist eine Spring-Boot-Anwendung mit der Feder-Kaninchen-Bibliothek.

Versionen:

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

Das Problem ist, dass für die Verbraucher von einer bestimmten Warteschlange Stop raubend Nachrichten nach einiger Zeit. Wenn ich meine Java-Anwendung neu starte, funktioniert alles einwandfrei. Die anderen Warteschlangen werden jedoch normal verbraucht. Keine Fehler auf der Anwendungsseite. Auf dem Protokollstrom Seite des Kaninchens Ich sehe einige Einträge wie

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

ich lokal oder in einer Testumgebung in Heroku nicht wiedergeben kann.

aktualisieren

Der folgende Code kann in 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); 
} 

ich über 60 Sekunden (das ist, was ich bin immer vom Server des Herzschlages kann nicht den Wert erhöhen finden).

Antwort

2

Leider scheint dies ein Netzwerkproblem. Dies könnte an ein paar Dinge liegen:

  • Der CloudAMQP-Dienst hat einige Probleme und tötet Ihre Verbindung (nicht wahrscheinlich, da Ihre anderen Verbraucher in Ordnung sind).
  • Ihr CloudAMQP-Plan erlaubt nicht so viele gleichzeitige Verbindungen wie Sie möchten. Haben Sie überprüft, ob Sie einen ausreichend hohen Plan haben, um alle Ihre Kunden zu unterstützen? https://elements.heroku.com/addons/cloudamqp
  • Ihr Heroku-Prüfpunkt mit dem fraglichen Verbraucher wird neu gestartet, wodurch die Verbindung unterbrochen wird. Heroku Dynos starten regelmäßig neu. Wenn Ihre Dynos nicht ordnungsgemäß neu gestartet werden können, sollten Sie untersuchen, warum.
  • Einer Ihrer Heroku-Dyna ist mit Netzwerkproblemen verbunden (in diesem Fall wird er wahrscheinlich ohne Ihr Eingreifen neu gestartet).
  • Eine Möglichkeit, alle Ihre Dynos zum Neustart zu zwingen, besteht darin, $ heroku ps:restart auszuführen. Dadurch wird Heroku gezwungen, Ihre Dynos neu zu starten, was häufig bedeutet, dass Sie sie auf einen neuen EC2-Host verschieben müssen. Dies kann helfen, wenn es sich um ein einmaliges Problem handelt.

    +0

    Hallo @rdegges. Danke für Ihre Hilfe. Der Plan ist groß genug, um alle Verbindungen zu bewältigen. Außerdem (das ist mein schlechtes, ich war nicht klar genug) arbeiten die Konsumenten alle anfänglich, aber gelegentlich hören die Konsumenten dieser besonderen Warteschlange auf zu konsumieren. Wenn ich die App neu starte, funktioniert alles einwandfrei und die Verbraucher beginnen wieder zu arbeiten. Ich kann es jedoch nicht reproduzieren. Meine App läuft auf einem großen Rechner (PL Web 1). Ich bin vertraut mit der Natur von Heroku infra (Neustart usw.) und die Anwendung kann damit umgehen. – alkis

    +0

    Ich dachte, dass dies auf Überlastung zurückzuführen sein könnte, die zusammen mit der Heartbeat-Konfiguration dies verursacht.Ich warte darauf, dass dies wieder passiert und sehen, ob diese bestimmte Verbraucherverbindung von Kaninchen fallen gelassen wird, aber der Verbraucher bleibt unbewusst (dies würde das Fehlen von Fehlerprotokollen erklären). Wenn dies der Fall ist, könnte das Ändern des Heartbeats auf einen größeren Wert das Problem beheben. Aber ich weiß nicht, ob das möglich ist. Überprüfen Sie mein Update. – alkis

    +0

    Ah, das macht es ein bisschen schwieriger zu diagnostizieren. Vor allem, wenn es nicht leicht reproduziert werden kann :(Aber dieser Verbraucher sollte die Verbindung neu starten, wenn es fällt. Ihre Heartbeat-Konfiguration sieht gut aus. – rdegges