RabbitMQ, обмен мертвыми буквами -> Не можете направить сообщение на обмен по умолчанию?
С администратором RabbitMQ (v3) я попытался создать очередь, которая будет отправлять сообщения о недоставленных письмах в обмен по умолчанию, с ключом маршрутизации "MyErrorRoutingKey", к которому привязана очередь ошибок. Таким образом, в интерфейсе администрирования я оставил поле "Обмен мертвыми буквами" пустым.
Мне просто интересно, нормально ли иметь следующее сообщение при попытке создать очередь:
406 PRECONDITION_FAILED - недопустимый аргумент 'x-dead-letter-routing-key' для очереди 'MyQueue' в vhost '/': routing_key_but_no_dlx_defined
Кажется возможным направить сообщения мертвой буквы на обмен по умолчанию, потому что далее в документации сказано:
Можно сформировать цикл очередей недоставленных сообщений. Например, это может произойти, когда очередь сообщений с ошибками отправляется на обмен по умолчанию без указания ключа маршрутизации недоставленных сообщений. Сообщения в таких циклах (то есть сообщения, которые попадают в одну и ту же очередь дважды) будут отбрасываться.
Так как я должен направлять сообщения на обмен по умолчанию? В отличие от "циклической бесполезной мертвой буквы", описанной выше, я хочу иметь возможность указать ключ маршрутизации, чтобы мои сообщения не терялись.
2 ответа
Старый вопрос, но никто, кажется, не ответил, поэтому я попробую.
У меня были проблемы с точно такой же ошибкой при использовании веб-интерфейса, но я смог обойти ее, задав вместо этого вручную "x-dead-letter-exchange" и "x-dead-letter-routing-key" в качестве пользовательских аргументов использования предоставленных полей.
Похоже, мне кажется, что routing_key_but_no_dlx_defined говорит о том, что вы не должны определять ключ маршрутизации мертвой буквы, если вы не определяете обмен мертвой буквой, что тоже имеет смысл.
Я не уверен, что именно вы пытаетесь сделать с обменом по умолчанию, но у него тоже есть имя, так что, возможно, вы можете просто установить обмен мертвыми буквами...
Что касается вашей последней цитаты из документов, это означает, что если вы настроили цикл, используя обмен мертвыми буквами, то есть:
QUEUE-A> DEAD-LETTER-QUEUE> QUEUE-A
... RabbitMQ будет отбрасывать сообщение, когда оно возвращается к QUEUE-A, если оно покидает DEAD-LETTER-QUEUE из-за истечения времени ожидания. Если вам нужна такая отложенная повторная попытка, вам придется вручную поставить ваше сообщение в очередь DEAD-LETTER-QUEUE, но есть указание на то, что RabbitMQ может позволить вам выполнить такие циклы позже ( http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-April/026489.html).