Гарантии обработки мертвых писем RabbitMQ

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

Однако что происходит, когда сообщение приходит на обмен недоставленными письмами после ручного отклонения у потребителя? (channel.basicReject, я использую Spring AMQP.)

Могу ли я быть уверен в том, что в случае, когда исходное сообщение удаляется из очереди, которую слушает потребитель, а сервер RabbitMQ впоследствии выходит из строя, я в конечном итоге найду сообщение после перезапуска сервера RabbitMQ в очередях. которые привязаны к обмену мертвыми письмами (если бы обычно сообщение пришло туда)?

Если ответ отрицательный, есть ли способ убедиться в этом?


person John Donn    schedule 25.06.2019    source источник
comment
Привет, Джон, поэтому в моем последнем проекте у нас был RabbitMQ с отклонением и уходом в мертвую букву. И из того, что мы испытали, мы никогда не теряли сообщения. И мы подали в суд на эти очереди, чтобы найти проблемы с сообщениями или обработкой.   -  person Brother    schedule 25.06.2019
comment
Спасибо за ваш комментарий; однако, поскольку я знаю, что RabbitMQ был создан с особой заботой о параллелизме, я хотел бы знать, есть ли гарантии для описываемого мной случая (в том смысле, что эта ситуация была принята во внимание; конечно, нет никаких гарантий, если ОС получает повреждения и тому подобное).   -  person John Donn    schedule 25.06.2019
comment
Я предполагаю, что он не будет удален из основной очереди до тех пор, пока не будет записан в DLQ (если есть маршрут от DLX), но будет отброшен, если нет маршрута к очереди из DLX. Однако вам следует задавать вопросы о внутреннем устройстве RabbitMQ в rabbitmq-users группе Google, где тусуются инженеры RabbitMQ; они не так внимательно следят за переполнением стека. Если вы получите ответ оттуда, я предлагаю вам добавить его в качестве ответа здесь.   -  person Gary Russell    schedule 25.06.2019


Ответы (1)


Как предположил @GaryRussell, я разместил аналогичный вопрос в rabbitmq-users группе Google.

Вот ответ, который я получил от Даниила Федотова

"Hi,

There is no delivery guarantees in place. Dead lettering does not check if the message was enqueued or saved to disk.
Dead-lettering does not use publisher confirms or any other confirm mechanisms.

It's not that easy to implement reliable dead-lettering from one queue to another and there are plans to address this issue eventually, but it may take a while.

If you want to safely reject messages from the consumer without a risk of losing them - you can publish them from the consumer application manually to the dead-letter queue, wait for the confirmation and then reject."
person John Donn    schedule 25.06.2019