2012-11-29 12 views
7

Ich versuche, eine dlx-Warteschlange in RabbitMQ zu implementieren. Das Szenario ist ganz einfach Ich habe 2 Warteschlangen: 1) lebendig 2) tot (x-dead-letter-Austausch: "sofort", x-message-ttl: 5000)Dead Letter Austausch RabbitMQ Drop-Nachrichten

und einen Austausch „immediate "das ist gebunden an 1) lebendig

ich versuchte, dieses Beispiel auszuführen: http://blog.james-carr.org/2012/03/30/rabbitmq-sending-a-message-to-be-consumed-later/ aber es scheint, dass die Nachrichten gelöscht werden, nachdem die ttl abläuft und sie nicht an der Börse veröffentlicht werden, so dass meine lebendig Warteschlange ist immer leer .

Ich habe auch versucht, die Warteschlangen von Hand in der Management-Konsole zu erstellen, und ich bekomme das gleiche Verhalten.

Getestet habe ich es mit Ubuntu/rabbitmq 3.0.0 und mit Mac OS X und rabbitmq 2.8.7

bin ich etwas fehlt?

+0

Möchten Sie, dass die Nachrichten, die aus der 'alive'-Warteschlange ablaufen, in die' tote 'Warteschlange gelangen? – kzhen

+0

nein ist eigentlich das Gegenteil, ich möchte, dass abgelaufene Nachrichten aus der toten Warteschlange in die Warteschlange leben. –

+0

Wie kommen sie in die tote Warteschlange? – kzhen

Antwort

8

Wenn Nachrichten in RabbitMQ "verschwinden", liegt das Problem normalerweise an den Bindungen. Also, Ihr Beispiel zum Laufen zu bringen Ich habe folgende:

  1. Erstellt 2 Warteschlangen, lebendig, tot (mit TTL und DLX)

  2. Erstellt ein Austausch von Typ sofort genannt DIRECT

  3. Erstellt eine Bindung zwischen der Vermittlungsstelle "sofort" und der Warteschlange "lebendig" mit einem Routing-Schlüssel "tot" - der Grund dafür ist, dass der Routing-Schlüssel für Nachrichten in die tote Warteschlange (wenn die Standard-Exchange ist "tot" dies muss in der Bindung an den Dead Letter Exchange übereinstimmen).

Der wichtigste Teil ist hier in der Bindung zwischen dem sofort Austausch und die lebendig Warteschlange.

Um zu testen, habe ich eine Nachricht in die Warteschlange dead veröffentlicht, kann ich sehen, dass es in der Dead-Warteschlange kurz erscheinen dann in der Warteschlange angezeigt werden.

+0

funktioniert jetzt! vielen Dank! –

+0

Ich habe einen Spike und traf ein paar Showstopper: 1. Nachrichten sind nur DLQ: en wenn oben im Q (http://www.rabbitmq.com/ttl.html - Caveats Abschnitt) Dies bedeutet, dass Wenn ich zuerst setze, dass msg 1 in 4 Stunden abläuft und msg2 in 1 Stunden abläuft, läuft msg2 nur ab, nachdem msg1 abgelaufen ist. 2. Die TTL für die Nachricht wird von Rabbit gehalten. Nehmen wir an, Sie verwenden eine kurze Zeitüberschreitung von 10 s. Wenn der Verbraucher die Nachricht nicht innerhalb von 10 Sekunden nach dem Ablauf (aufgrund eines Rückstands) konsumieren konnte, wird er verworfen und verloren Das obige wurde mit Rabbit 3.0.1 verifiziert. Siehst du Workarounds? –

+2

@ AndreasÖhlund, versuchen Sie, mit "pro Warteschlange TTL", nicht "per Nachricht TTL", wenn möglich zu entwerfen. –