2016-08-17 4 views
1

Ich habe beobachtet RabbitMQ "stecken" mit unpacked Nachrichten. Die Warteschlange zeigt einen Verbraucher an, der nicht mehr existiert, und ich gehe davon aus, dass RabbitMQ weiterhin Nachrichten an diesen Verbraucher liefert. Sie zeigen sich als eine immer größer werdende Anzahl von nicht gepackten Nachrichten. Ich mache das in PHP mit php-amqplib.rabbitMQ nicht in der Lage, Herzschlag mit php-amqplib arbeiten

Ich kann das Problem durch das Töten des Verbraucherprozesses (Kontrolle-C auf der Befehlszeile) erzeugen.

Ich versuchte, einen Herzschlag von 3 Sekunden zu spezifizieren und versucht, Keep-Alive wahr und falsch. Mit Herzschlag, nicht der Verbraucher schließlich:

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) 

Ausgabe # 374 beziehen könnte: https://github.com/php-amqplib/php-amqplib/issues/374

Der Verbraucher ist aus mehreren Warteschlangen raubend, aber ich glaube, sollte keine Rolle spielen.

Das Problem, das ich versuche zu lösen, ist, dass RabbitMQ weiterhin denkt, dass ein Verbraucher existiert, wenn es nicht, mit dem Ergebnis, dass RabbitMQ diese Nachrichten nirgends liefert, und sie unbestätigt bleiben. Ich bin auf der Suche nach einer Möglichkeit, diese falsche Verbindung loszuwerden, damit diese Nachrichten an einen Live-Verbraucher weitergeleitet werden können. Ich denke, dafür ist der Herzschlag da, aber ich habe es nicht zur Arbeit gebracht.

+0

Haben Sie Auto-ack in Ihrem Verbraucher aktiviert? – cantSleepNow

+0

Ich nicht. Ich muss in der Lage sein, via acking zu drosseln, nachdem die Arbeit der Nachricht abgeschlossen ist. –

Antwort

2

Die erste und wichtigere Meinung, die wir in diesem Fall tun müssen, ist versuchen, Sie Content-Nachricht zu "drucken" und nur an den Verbraucher zurückgeben, verarbeiten Sie nicht Ihren echten Code, wenn Sie die Nachrichten "konsumieren" können Das Problem ist nicht in Kaninchen, sondern in unserem Prozess, weil wir wahrscheinlich zu viel Zeit verbrauchen, um die Nachricht an Kaninchen und Kaninchen unsere Beziehungen zu schließen.

In meinem Fall ändere ich die Herangehensweise dieses Problems, weil ich viele Produkt-IDs für jede Nachricht habe und es lange Zeit zum ACK-Prozess verbringe, also passe ich meine Nachrichten an und es funktioniert gut danach.

Wir können die Ansätze wie erstellen Sie eine andere Warteschlangen, um diese Nachrichten passen, weiß ich nicht, aber 90% der Probleme ist es.

Sie können mehr über Erkennen von toten TCP-Verbindungen mit Herzensbrecher lesen here

+0

Leider hilft das nicht das angegebene Problem. Das Problem ist NICHT, dass der Verbraucher zu lange braucht, um Nachrichten zu bestätigen. Nachrichten werden innerhalb von etwa 20 Millisekunden bestätigt. Das Problem ist, glaube ich, dass der Verbraucherprozess nicht mehr existiert, aber RabbitMQ glaubt, dass der Verbraucher noch existiert. Ich kann dies auf der RabbitMQ-Verwaltungsseite sehen (Anzahl der Verbraucherverbindungen zur Warteschlange). RabbitMQ fährt fort, Nachrichten zu "liefern", aber sie werden tatsächlich von nichts empfangen. Ich kann dies auf der Verwaltungsseite durch die Anzahl der nicht gehackten Nachrichten sehen, die hoch und runter gehen. –