Я хочу прочитать полезную нагрузку или messageId неподтвержденных сообщений в очереди RabbitMQ. Это возможно?
Причина, по которой я хочу это сделать, заключается в том, что я пытаюсь использовать функцию мертвого письма RabbitMQ для создания цикла для периодического автоматического создания сообщения. Вкратце, создайте две очереди - рабочую очередь и очередь задержки.
- Задайте TTL сообщения в очереди задержки как периодичность необходимости периодически. Могут иметь разные сообщения с разным TTL для разных целей работы;
- поместить сообщение в очередь задержки. Когда срок действия сообщения истекает, оно повторно публикуется в рабочей очереди. Сообщение может находиться в очереди работы столько времени, сколько необходимо, пока потребитель не воспользуется им.
- Один потребитель берет сообщение и обрабатывает его. Если обработка успешна, потребителю необходимо подтвердить рабочую очередь, а затем записать сообщение обратно в очередь задержки; Если обработка завершается неудачно (например, происходит сбой потока), подтверждения нет. Тогда сообщение автоматически снова появится в очереди рабочих. Затем за работу может взяться другой потребитель. Когда срок действия сообщения, отправленного обратно в очередь задержки, снова истекает, оно публикуется повторно, а затем повторно используется потребителем ... Построенный цикл, распределенная рабочая нагрузка.
Я хочу убедиться, что в цикле нет пропущенных или повторяющихся сообщений, поскольку я не хочу, чтобы отсутствовала работа или выполнялась двойная работа одновременно. Однако есть крошечный шанс, что повторяющиеся сообщения могут появиться. Ниже показано, как потребитель сначала отправляет сообщение в очередь задержки и подтверждает рабочую очередь. Если поток выйдет из строя прямо между двумя нижеприведенными строками, сообщение окажется в очереди задержки, и Rabbit повторно опубликует сообщение в рабочей очереди. В итоге в цикле появляются повторяющиеся сообщения.
channel.basicPublish(DELAY_EXCHANGE, "", null, message.getBytes());
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
Чтобы предотвратить это, я хочу добавить логику наблюдения за собакой после двух строк выше:
Проверьте общее количество сообщений в цикле (общее количество сообщений в обеих очередях), чтобы узнать, совпадает ли оно с моим ожидаемым числом (я ожидал, что число будет меньше 10);
Если число не совпадает, я хочу выяснить, какой из них отсутствует, а какой дублируется, а затем разобраться с этим. Меня не волнует последовательность этих сообщений, или частота была нарушена, так как это действительно действительно крайний случай, который следует учитывать. Я могу легко получить те сообщения, которые уже готовы, и запросить их. Но проблема в том, как поступить с этими неподтвержденными сообщениями?
Заранее большое спасибо!
Рой