Как читать неподтвержденные сообщения RabbitMQ / цикл RabbitMQ

Я хочу прочитать полезную нагрузку или messageId неподтвержденных сообщений в очереди RabbitMQ. Это возможно?

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

  1. Задайте TTL сообщения в очереди задержки как периодичность необходимости периодически. Могут иметь разные сообщения с разным TTL для разных целей работы;
  2. поместить сообщение в очередь задержки. Когда срок действия сообщения истекает, оно повторно публикуется в рабочей очереди. Сообщение может находиться в очереди работы столько времени, сколько необходимо, пока потребитель не воспользуется им.
  3. Один потребитель берет сообщение и обрабатывает его. Если обработка успешна, потребителю необходимо подтвердить рабочую очередь, а затем записать сообщение обратно в очередь задержки; Если обработка завершается неудачно (например, происходит сбой потока), подтверждения нет. Тогда сообщение автоматически снова появится в очереди рабочих. Затем за работу может взяться другой потребитель. Когда срок действия сообщения, отправленного обратно в очередь задержки, снова истекает, оно публикуется повторно, а затем повторно используется потребителем ... Построенный цикл, распределенная рабочая нагрузка.

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

  channel.basicPublish(DELAY_EXCHANGE, "", null, message.getBytes());
  channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

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

  1. Проверьте общее количество сообщений в цикле (общее количество сообщений в обеих очередях), чтобы узнать, совпадает ли оно с моим ожидаемым числом (я ожидал, что число будет меньше 10);

  2. Если число не совпадает, я хочу выяснить, какой из них отсутствует, а какой дублируется, а затем разобраться с этим. Меня не волнует последовательность этих сообщений, или частота была нарушена, так как это действительно действительно крайний случай, который следует учитывать. Я могу легко получить те сообщения, которые уже готовы, и запросить их. Но проблема в том, как поступить с этими неподтвержденными сообщениями?

Заранее большое спасибо!

Рой


person Roy Wu    schedule 11.11.2014    source источник


Ответы (1)


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

person pinepain    schedule 11.11.2014
comment
Большое спасибо за ответ. Я подробно изложил свой первоначальный вопрос. Не могли бы вы взглянуть? Еще раз спасибо! - person Roy Wu; 11.11.2014
comment
Не стоит так сильно менять вопрос, пока он выглядит как совершенно новый. - person pinepain; 11.11.2014
comment
Что касается TTL для каждого сообщения, обратите внимание, что независимо от TTL для каждого сообщения они будут перемещены из очереди (а затем переадресованы, если настроен DLX), только когда они достигнут заголовка очереди. - person pinepain; 11.11.2014
comment
Также идея с подсчетом сообщений может не сработать, поскольку сложно предсказать поведение нескольких потребителей и издателей. Просто создайте дубликаты толерантного потока. Для дальнейшего обсуждения я бы рекомендовал задать этот вопрос в официальной группе пользователей RabbitMQ (сначала поищите аналогичный вопрос). - person pinepain; 12.11.2014
comment
@ zaq178miami Я пытаюсь использовать RabbitMQ на своем локальном хосте, но у меня проблемы с этим, не могли бы вы дать мне какие-либо указания относительно этого? - person Pankaj Nimgade; 18.11.2014
comment
@PankajNimgade Хотя вы не предоставили никакой информации, вам трудно помочь. Если вы новичок в RabbitMQ, на документации официального сайта RabbitMQ есть много документации. и если у вас есть какая-то конкретная проблема, вы можете объяснить - опубликуйте ее здесь или в официальном сайте RabbitMQ группа пользователей. PS. такой комментарий - это своего рода оффтоп на SO. - person pinepain; 18.11.2014
comment
@ zaq178miami, я понимаю, что вы имеете в виду, я попытаюсь задать этот вопрос в группе, я действительно пытался задать вопрос об этом здесь, stackoverflow.com/questions/26996141/error-in-loading-send-and-recv-in- rabbtimq - person Pankaj Nimgade; 18.11.2014