Как установить несколько попыток повтора в RabbitMQ?

Я использую RabbitMQ, и у меня есть очередь, в которой хранятся сообщения электронной почты. Мой потребительский сервис отключает сообщения и пытается их отправить. Если по какой-либо причине мой потребитель не может отправить сообщение, я хотел бы снова отправить сообщение для отправки. Я понимаю, что могу сделать basicNack и установить флаг Requeue как истинный, однако я не хочу запрашивать сообщение бесконечно (скажем, если наша система электронной почты опускается, я не хочу постоянно запрашивать неотправленные сообщения). Я хотел бы определить конечное число раз, чтобы я мог повторно отправить сообщение для отправки. Я не могу установить поле в объекте сообщения электронной почты, однако, когда я удаляю его и отправляю нюк. Обновленное поле отсутствует в сообщении в очереди. Есть ли другой способ, с помощью которого я могу подойти к этому? Заранее спасибо.

Нет такой функции, как попытки повтора в RabbitMQ (а также в протоколе AMQP).

Возможное решение для выполнения попыток попыток попыток:

  1. Сообщение Redeliver, если оно ранее не было повторно добавлено (проверьте параметр basic.deliver методе basic.deliver – ваша библиотека должна иметь некоторый интерфейс для этого), и отбросьте его, а затем поймайте в обмене мертвых букв , а затем обработайте его как-нибудь.

  2. Каждый раз, когда сообщение не может быть обработано, опубликуйте его снова, но укажите заголовок или увеличивайте / уменьшайте заголовок поля, скажем, x-redelivered-count (вы можете выбрать любое имя, которое вам нравится). Чтобы получить контроль над redeliveries, в этом случае вам нужно проверить поле, которое вы установили, достигает ли он определенного предела (верхний или нижний – 0 – мой выбор, a-la ttl в заголовке ip от tcp / ip).

  3. Храните уникальный ключ сообщения (скажем, uuid, но вы должны установить его вручную при публикации сообщения) в Redis, memcache или другом хранилище, даже в mysql вместе с подсчетом повторных отправлений, а затем при каждом добавлении / уменьшении количества повторной доставки это значение до тех пор, пока оно не достигнет предела ,

  4. (для реальных выродков) напишите плагин, который будет реализовывать такое поведение, как вы хотите.

Про № 3 – это то, что сообщение с повторным сообщением остается в очереди. Это важно, если у вас длинная очередь или если порядок сообщений важен для вас (обратите внимание, что redeliveries нарушают строгий порядок сообщений, см. Официальные документы для получения подробной информации или этот вопрос на SO ).

PS:

В этом разделе есть аналогичный ответ , но в php. Посмотрите, возможно, это поможет вам немного (начните читать его со слов «Существует множество методов решения проблемы повторного цикла» .

Interesting Posts

Проверяет ли readdir () заказ?

MySql SELECT для разных столбцов?

Элегантный способ проверить недостающие пакеты и установить их?

Word: отключить проверку орфографии для абзаца?

Уничтожение объектов с именами свойств, которые не являются допустимыми именами переменных

Полноскоростное соединение 802.11n между двумя ноутбуками без точки доступа

Как получить bitmap из URL-адреса в андроиде?

Настройка папки imap для отправки

Как ограничить авторотацию одной ориентацией для некоторых видов, позволяя при этом все ориентации на других?

Как проверить, какой class является объектом Objective-C?

Я перезаписал переменную окружения PATH

Как выполнить rsync большой файл с минимальными затратами на процессор и пропускную способность?

C ++: ссылка const, перед vs после спецификатора типа

Вставить разрыв строки / специальный символ в строке в командной строке

Каково значение url-шаблона в web.xml и как настроить сервлет?

Давайте будем гением компьютера.