2017-09-18 4 views
0

Mit Feder AMQP (rabbitmq):RabbitMQ Verbindung Timeout Ausnahme

Mein Verbraucher nimmt ziemlich viel Zeit manchmal zu verarbeiten Nachricht meine Business-Logik mehr als 2 Stunden in Anspruch nimmt, aber dann nach der Verarbeitung, wenn ich versuche, die rabbitmq anzuerkennen Für "basic ack" gibt es eine Verbindungstimeout-Ausnahme.

Was soll ich tun? Soll ich die Verbindung für immer herstellen oder Herzschläge machen?

Antwort

0

Wenn Ihre Logik definitiv auf MANUAL Ack basiert, haben Sie in der Tat keine Wahl, wenn Sie Ihre Verbindungen nicht lange leben. Heartbeat sollte sowieso standardmäßig vorhanden sein.

Andernfalls die Lösung mit der AUTO-Ack und im Falle von Fehlern nach dem Downstream nur Nachrichten zurück in die Warteschlange für die Zukunft zu speichern.

+0

Die Verbindung sollte offen bleiben, solange die Heartbeats konfiguriert sind (was standardmäßig der Fall ist). Es ist jedoch ziemlich ungewöhnlich, eine Nachricht in einem solchen Zustand so lange zu halten. Es ist ein Anti-Pattern für Messaging; Im Allgemeinen ist es besser, lang andauernde Aufgaben in einem dauerhaften Speicher wie einer Datenbank zu speichern. –

0

Betrachten Sie eine alternative Option mit Bestätigung direkt nach dem Beginn Ihrer lang andauernden Geschäftsoperation und informieren Sie später über ihren Status: entweder Fehler oder Erfolg, falls Sie abhängige Akteure haben.

Als Artem & Gary schlagen vor, dass es ein Anti-Pattern ist, um Nachrichten für eine lange Zeit zu halten, möchten Sie den Prozess wirklich async machen - Ihr Dienst konsumierte eine Nachricht und fing an, einige Sachen zu tun: Gut dann, lasst uns erkenne das an. Und falls Sie bei einem Fehler wiederholt werden müssen, machen Sie einfach eine separate Nachricht, sobald ein Fehler auftritt, also würde ein anderer Verbraucher es nehmen und verarbeiten.