2016-04-08 5 views
1

Я планировал отложить обработку сообщений в очереди, следуя этим двум ссылкам: link1link2. Итак, как было предложено в ссылке. Я объявил исходную очередь с аргументами x-dead-letter-exchange и x-dead-letter-routing-key. Который опубликовал сообщения так называемому dead-letter-queue, когда сообщение либо не получило обработки потребителем, либо ttl, либо длина очереди превысила. Теперь в dead-letter-queue аналогичные аргументы были установлены вместе с параметром ttl. Предположим, что переиздание сообщений в исходную очередь после ttl превышает. Но проблема в том, что это удаление всех сообщений.Мертвые письма, не получающие запрос в исходную очередь после ttl

Кроме того, здесь есть улов. Если я явно публикую неудавшиеся сообщения из исходной очереди в dead-letter-queue. Затем после ttl он переиздает сообщения в исходную очередь. Почему это так и как я могу заставить его работать. Так что очередь мертвых букв переиздает сообщения в исходную очередь, а не отбрасывает. Я использую RabbitMQ 3.0.0.

FYI, я создал как обмены direct типа наряду с маршрутизацией ключа

ответ

2

Когда очередь имеет настройки TTL, что означает, что сообщения в этой очереди будут отправлены в мертвой буквой обмена (DLX), связанный с этой очередью после истечения срока действия TTL. Если в очереди нет назначенного DLX, сообщения переходят в ведро бит.

Если вы хотите отправить сообщения обратно в очередь, из которой они пришли, чтобы переработать, вам необходимо установить настройку, описанную в этом сообщении.

Dead-lettering dead-lettered messages in RabbitMQ

Надеется, что это полезно для вас.

+0

Вместо того, чтобы делать то, что вы предложили. Мы могли бы также публично опубликовать сообщение об ошибке из исходной очереди в «мертвую букву» вместо того, чтобы использовать «х-мертвую букву» и «х-мертвую букву-маршрутизацию-ключ». Затем также очередь мертвых букв переиздает сообщения в исходную очередь после ttl. Таким образом, я не могу понять, в чем разница в публикации сообщения явно и с помощью встроенных функций. – Naresh

+0

способ, которым вы описываете, будет работать только в том случае, если у вас есть одна очередь. В моей ссылке этот метод работает для того, чтобы иметь N количество очередей, которые мертвая буква в одну очередь повторов. – jhilden

+0

В любом случае, но почему существует разница в публикации сообщения явно и с помощью встроенных функций. Любые идеи – Naresh

0

Предположим, что ваш исходный обмен является x.notification и привязан к очереди q.A с очередью маршрутизации A. И ваш namae с мертвой буквой - это dlx.notification. Теперь в очереди q. Установите ttl временной интервал, который вы хотите подождать, и dead-lleter-exchange, как dlx.notification. Теперь создайте еще одну очередь dlq.A для маршрутизации сообщения с истекшим сроком действия из dlx.notification в dlq.A с ключом маршрутизации «A». Я думаю, это все, что вам нужно сделать, чтобы достичь своей цели.