Работа с мертвыми буквами в RabbitMQ

TL; DR: Мне нужно "переигрывать" сообщения мертвой буквы обратно в свои исходные очереди, как только я исправил код пользователя, изначально вызывающий отклонение сообщений.

Я настроил Dead Letter Exchange (DLX) для RabbitMQ и успешно маршрутизировал отклоненные сообщения в очередь с мертвой буквой. Но теперь я хочу посмотреть сообщения в очереди с мертвой буквой и попытаться решить, что делать с каждым из них. Некоторые (многие?) Из этих сообщений должны быть воспроизведены (запрошены) в их исходные очереди (доступны в заголовках "x-death" ) после исправления кода нарушителя. Но как я вообще это делаю? Должен ли я писать одноразовую программу, которая читает сообщения из очереди с мертвой буквой и позволяет мне указать целевую очередь для их отправки? А как насчет поиска в очереди мертвых букв? Что, если я знаю, что сообщение (пусть говорят, которое закодировано в JSON) имеет определенный атрибут, который я хочу искать и воспроизводить? Например, я исправляю дефект, который, как я знаю, позволит успешно обрабатывать сообщение с PacketId: 1234. Я мог бы написать одноразовую программу для этого, я полагаю.

Я, конечно, не могу быть первым, кто столкнулся с этими проблемами, и мне интересно, разрешил ли кто-нибудь еще их. Кажется, для такого рода должен быть какой-то швейцарский армейский нож. Я сделал довольно обширный поиск в Google и Stack Overflow, но на самом деле не очень много. Самое близкое, что я мог найти, это лопаты, но это действительно не похоже на правильный инструмент для этой работы.

Ответ 1

  Должен ли я написать одноразовую программу, которая читает сообщения из очереди недоставленных писем и позволяет мне указать целевую очередь для их отправки?

вообще говоря, да.

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

но это только автоматизирует повторные попытки с интервалом, и вы, возможно, не устранили проблему до повторных попыток.

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

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

  • Вам нужно искать сообщения, что невозможно. RMQ
  • это означает, что вам понадобится база данных для хранения сообщений из DLX/очереди

поскольку вы извлекаете сообщения из DLX/очереди, вам необходимо убедиться, что вы получаете всю информацию заголовка из сообщения, чтобы можно было повторно опубликовать в нужную очередь, когда придет время.

Я, конечно, не могу быть первым, кто столкнулся с этими проблемами, и мне интересно, если кто-то еще уже решил их.

а ты нет!

Есть много решений этой проблемы, все они сводятся к решению, которое вы предложили.

некоторые большие реализации "служебной шины" имеют встроенную функцию этого типа. я полагаю, что NServiceBus (или его SaaS-версия) встроен, например, - хотя в этом я не уверен на 100%.

если вы хотите разобраться в этом подробнее, поищите термин "ядовитое сообщение" - обычно это термин, используемый в данной ситуации. Я нашел несколько вещей в Google с помощью быстрого поиска, которые могут помочь вам в этом:

надеюсь, это поможет!