2016-03-24 4 views
2

HintergrundWarum bekomme ich bei der Anfrage die gleiche Nachricht von RabbitMQ?

Es gibt zwei Nachrichten in meiner Warteschlange:

  • foo
  • bar

Ich habe einen Kanal, einen Verbraucher mit Qos aktiv mit einer Prefetch Zahl von 1 .

Szenario

Eine Nachricht Lieferung foo kommt in, und ich lehne die Nachricht mit requeue=true ab.

Erwartet: Die nächste Nachricht, die geliefert wird, ist bar

Aktuell: Die nächste Nachricht, die geliefert wird, ist foo

Frage:

Warum kommt der Verbraucher Holen Sie die Nachricht, die es nur requeued anstelle der nächsten? Und wie bekomme ich das oben beschriebene Ergebnis?

Ich erwartete, dass die requeued-Nachricht am Ende der Warteschlange sein wird.

Ich habe überlegt, die Nachricht anzuerkennen und erneut zu veröffentlichen, aber dadurch besteht die Gefahr, dass Nachrichten verloren gehen.

Antwort

4

Von https://www.rabbitmq.com/semantics.html

Nachrichten in die Warteschlange unter Verwendung AMQP Verfahren zurückgeführt werden können, die einen Requeue Parameter FEATURE (basic.recover, basic.reject und basic.nack) oder durch> eine Kanalschließ während unbestätigte Nachrichten halten. Alle diese Szenarios haben dazu geführt, dass Nachrichten an der Rückseite der Warteschlange für RabbitMQ-Versionen früher als 2.7.0 erneut angefordert wurden. Von RabbitMQ Release 2.7.0, Nachrichten werden immer in der Warteschlange in der Reihenfolge der Veröffentlichung gehalten, auch in der Anwesenheit von requeueing oder Kanalschließung.

Emphasis Mine

Da Sie nur einen Verbraucher haben, ist dieses Verhalten

Sie erwartet wird, könnte die Nachricht an die gleiche Warteschlange erneut veröffentlichen, , die sicher die Problemmeldung auf dem Schwanz endet machen würden .

Ihre andere Option ist es, eine neue Warteschlange für fehlgeschlagene Nachrichten zu erstellen, so dass Sie separat behandeln können.

+0

Vielen Dank, dass Sie darauf hingewiesen haben. Ich habe diese Dokumentationsseite vorher nicht gefunden. Haben Sie einen Vorschlag, wie Sie die Nachrichten so konsumieren können, wie ich es möchte? –

+0

Hm, ich denke, Ihre einzige Option ist die erneute Veröffentlichung in der gleichen Warteschlange. Ihre andere Option besteht darin, eine neue Warteschlange für fehlgeschlagene Nachrichten zu erstellen und sie dann getrennt zu verarbeiten? – vranac

+0

Ich fürchte, so. Ich werde ein paar Tests machen, wie zuverlässig das ist. Danke noch einmal! –