2015-02-20 8 views
1

Вот что мы имеем здесь:Dead-буквенное мертвых литерных сообщений в RabbitMQ

  • Тема Обмен DLE, который предназначен, чтобы быть буквальные Обмен
  • Тема Обмен E, который является «основным «Обмен
  • Несколько очередей (EQ1, ..., EQn) связаны с E (и инициализированы x-dead-letter-exchange = DLE), каждый с собственным ключом маршрутизации. Эти очереди из них потребляются.
  • Для каждого EQn, есть DLEQn (инициализируется x-dead-letter-exchange = E и x-message-ttl = 5000), связанный с DLE с тем же ключом маршрутизации как EQn. Эти очереди не потребляется от

То, что я хочу, это следующее: если потребитель не может обработать сообщение от EQn, это NACKS сообщение с requeue: false и он попадает в DLEQn - то есть к соответствующей очереди на бирке мертвых букв. Теперь я хочу, чтобы это сообщение некоторое время сидело на DLEQn, а затем перенаправлялось обратно в исходную очередь EQn для обработки.

Попытайтесь, как я мог, я не смог получить «возврат к исходной очереди». Я вижу, что сообщения сидят в DLEQn со всеми правильными заголовками и ключом маршрутизации неповрежденными, но после истечения TTL они просто исчезают в воздухе.

Что я здесь делаю неправильно?

ответ

5

Да, вы можете это сделать. В настоящее время мы делаем это на производстве, и он отлично работает. Код слишком длинный, чтобы включить сюда, но я покажу вам созданную диаграмму, представляющую процесс. Основная идея заключается в том, что в первом DLX есть TTL, после того, как TTL истечет, сообщение переходит во вторую очередь, которая должна быть отправлена ​​обратно в исходное.

enter image description here

+0

Как он возникает в исходной очереди?Является ли RabbitMQ выполнением повторной отправки или есть отдельный потребитель в очереди повторных попыток? –

+1

Отдельный потребитель берет сообщение из очереди повторной перенаправления и просматривает заголовки кролика. Заголовком, представляющим интерес, является «x-death», внутри которого он имеет обмен и очередь, из которой пришло сообщение. Мы используем это для отправки сообщений во многие разные очереди, поэтому нам нужна только одна «очередь повторного перенаправления». Имеют смысл? – jhilden

+0

Работает как очарование! Большое спасибо. –

2

RabbitMQ обнаруживает велосипедного потока сообщений (E -> DLE -> E -> DLE ...) и тихо падает сообщения:

DLX manual (Routing Dead-Lettered Messages section) От:

можно сформировать цикл очереди с мертвой буквой. Например, это может произойти, когда сообщения о мертвой букве очереди для обмена по умолчанию без указания ключа маршрутизации мертвой буквы. Сообщения в таких циклах (т. Е. Сообщения, которые достигают одной очереди в два раза) будут опущены , если весь цикл из-за истечения срока действия сообщения.

+0

Интересно, если "25107 разрешение буквальные циклов" в RabbitMQ 3.1 (http://www.rabbitmq.com/release-notes/README-3.1.0.txt) фактически позволяет им. –

+0

Я предполагаю, что прояснение в группе пользователей RabbitMQ (https://groups.google.com/forum/#!forum/rabbitmq-users) освещает этот вопрос. Я не думаю, что это 25107 - это ваш случай, пока вы используете срок действия сообщения, что может привести к отбрасыванию сообщений в соответствии с документом (я сделал полужирным шрифтом эту часть) – pinepain

+0

Ну, мой цикл явно не полностью из-за истечения срока действия. Перенос исходного сообщения перемещает его из E в DLE, и только тогда TTL входит в игру. Тем не менее, спасибо за то, что нашли время! –