2012-11-29 15 views
7

Próbuję zaimplementować kolejkę dlx w RabbitMQ. Scenariusz jest dość łatwe Mam 2 kolejki: 1) żyje 2) martwy (x-dead-letter-wymiana: "natychmiastowe", x-message-TTL: 5000)Dead letter exchange RabbitMQ upuszczanie wiadomości

i wymianę „natychmiastowe ", który jest zobowiązany do: 1) żywe

próbowałem uruchomić ten przykład: http://blog.james-carr.org/2012/03/30/rabbitmq-sending-a-message-to-be-consumed-later/ ale wydaje się, że wiadomości są usuwane po TTL wygaśnie, a oni nie są publikowane na giełdzie, więc mój żywy kolejka jest zawsze pusty .

Próbowałem również ręcznie tworzyć kolejki w konsoli zarządzania i otrzymuję to samo zachowanie.

ja testowałem to z Ubuntu/RabbitMQ 3.0.0 oraz Mac OS X i RabbitMQ 2.8.7

Am I czegoś brakuje?

+0

Czy chcesz, aby wiadomości, które wygasają z kolejki "żywe", trafiały do ​​"martwej" kolejki? – kzhen

+0

nie jest wręcz przeciwnie, chcę, aby te wiadomości wygasły z martwego kolejki do kolejki żywych. –

+0

jak dostać się do martwej kolejki? – kzhen

Odpowiedz

8

Gdy wiadomości znikają w RabbitMQ, problem zazwyczaj ogranicza się do powiązań. Tak, aby uzyskać przykładowe pracy zrobiłem następujące:

  1. Utworzony 2 kolejkach, żywe, martwe (z TTL i DLX)

  2. stworzył wymiana nazywa natychmiastowe typu DIRECT

  3. Utworzono powiązanie między "natychmiastową" wymianą a kolejką "żywą" z kluczem routingu "martwym" - powodem jest to, że klucz routingu dla wiadomości w martwej kolejce (jeśli używa się domyślnej wymiany jest "martwy" to musi pasować do powiązania z wymianą martwych liter).

Ważną częścią tutaj jest wiązanie pomiędzy natychmiastowej wymiany i żywy kolejce .

Aby przetestować opublikowałem komunikat w martwej kolejce, widzę, że pojawia się on krótko w martwej kolejce, a następnie pojawia się w kolejce żywej.

+0

działa już teraz! Dzięki wielkie! –

+0

Zrobiłem spike i uderzyłem kilka showstopperów: 1. Wiadomości są tylko DLQ: pl, gdy na górze Q (http://www.rabbitmq.com/ttl.html - sekcja zastrzeżeń) Oznacza to, że jeśli najpierw ustawię msg 1 na wygaśnięcie za 4 godziny, a msg2 na wygaśnięcie za 1 godzinę msg2 wygaśnie dopiero po wygaśnięciu msg1. 2. TTL wiadomości jest przechowywany przez Rabbit, więc powiedzmy, że używasz krótkiego czasu oczekiwania wynoszącego 10 sekund. Jeśli konsument nie był w stanie skonsumować komunikatu w ciągu 10 sekund po jego wygaśnięciu (z powodu zaległości), zostanie on odrzucony i utracony. Powyższe zostało zweryfikowane przez Rabbit 3.0.1. Widzisz jakieś obejścia? –

+2

@ AndreasÖhlund, spróbuj zaprojektować za pomocą "dla każdej kolejki TTL", a nie "dla każdej wiadomości TTL", jeśli to możliwe. –

Powiązane problemy