2014-06-24 11 views
9

Ich habe mich gefragt, ob das möglich ist. Ich möchte eine Aufgabe aus einer Warteschlange ziehen und einige Arbeiten ausführen, die möglicherweise 3 Sekunden oder länger (möglicherweise) Minuten dauern können, bevor eine Bestätigung an RabbitMQ gesendet wird, um darüber zu informieren, dass die Arbeit abgeschlossen wurde. Die Arbeit wird von einem Benutzer ausgeführt, daher variiert die Zeit, die für die Bearbeitung des Auftrags benötigt wird.Einstellung eines langen Timeouts für RabbitMQ ack Nachricht

Ich möchte die Nachricht nicht sofort quittieren, nachdem ich die Warteschlange ausgeblendet habe, weil ich möchte, dass die Nachricht erneut angefordert wird, wenn keine Quittung empfangen wird. Kann mir jemand Einblick geben, wie ich mein Problem lösen kann?

Antwort

7

einen langen Timeout Mit sollte in Ordnung sein, und erst recht, wie Sie sagen, Sie wollen redelivery, wenn etwas schief geht, so Sie wollen nur acknach Sie fertig ist.

Der beste Weg, um das zu erreichen, IMO, wäre mehrere Verbraucher in der Warteschlange (d. H. Mehrere Threads/Prozesse verbrauchen von der gleichen Warteschlange). Das sollte in Ordnung sein, solange es keine bestimmte Ordnungseinschränkung für Ihre Warteschlangeninhalte gibt (d. H. Die Art und Weise, wie es möglicherweise wäre, wenn die Warteschlange Inhalte enthalten würde, die Postgres-Daten darstellen, die FK-Einschränkungen beinhalten).

Dieses Tutorial auf der RabbitMQ Website weitere Informationen bietet (Python verbunden, aber es sollten ähnliche Tutorials für andere Sprachen sein): https://www.rabbitmq.com/tutorials/tutorial-two-python.html

bearbeiten als Antwort von OP Kommentar:

Was ist Ihr Herzschlag festgelegt? Wenn Ihr Mitarbeiter den Heartbeat innerhalb des festgelegten Zeitraums nicht bestätigt, wird der Server die Verbindung als tot betrachten.

Nicht sicher, welche Sprache Sie verwenden, aber für Java würden Sie die Methode setRequestedHeartbeat verwenden, um den Heartbeat anzugeben.

Die Art, wie Sie Ihre Mitarbeiter implementieren, ist es wichtig, dass der Herzschlag immer noch an den RabbitMQ Server gesendet werden kann. Wenn etwas den Client daran hindert, den Heartbeat zu senden, beendet der Server die Verbindung nach Ablauf des Zeitintervalls.

+1

Danke für den Tipp. Ich kann nicht finden, wo diese Timeout-Konfiguration für die Nachricht mit RabbitMQ eingestellt werden soll. Sieht aus, als ob ich die Nachricht nach 10 Sekunden oder so nicht quittiert hat. RabbitMQ platziert die Nachricht zurück in die Warteschlange, um von einem anderen Arbeiter konsumiert zu werden, was ich nicht will. Irgendwelche Vorschläge? – Wanged

+0

Zur Antwort hinzugefügt. – khampson