Поведение каналов в режиме «подтверждения» с RabbitMQ - PullRequest
9 голосов
/ 01 декабря 2011

У меня возникли проблемы с пониманием подтверждения RabbitMQ, я вижу следующее объяснение от RabbitMQ:

Примечания

Брокер теряет постоянные сообщения, если он падает перед указанными сообщениямизаписываются на диск.При определенных условиях это заставляет брокера вести себя удивительным образом.Например, рассмотрим следующий сценарий:

  • клиент публикует постоянное сообщение в долговременную очередь

  • клиент получает сообщение из очереди (отмечая, что сообщение является постоянным и очередь надежной), но еще не подтвердило его,

  • брокер умирает и перезапускается, а

  • клиент переподключается и начинает принимать сообщения.

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

Затем я использую это http://hg.rabbitmq.com/rabbitmq-java-client/file/default/test/src/com/rabbitmq/examples/ConfirmDontLoseMessages.java, чтобы выполнить базовый тест и проверить подтверждение, но получаю некоторые странные результаты:

  1. Метод waitForConfirmsOrDie не блокирует производителя, которыйотличается от моих ожиданий, я полагаю, что waitForConfirmsOrDie будет блокировать производителя, пока все сообщения не будут ack'd или одно из них не nack'd.() от издателя, и меняю получателя с автоматического подтверждения на подтверждение вручную, я публикую все сообщения в очередь и получаю сообщения одно за другим, затем останавливаю сервер rabbitmq во время процесса потребления, и теперь я ожидаю, что левые сообщения будутпотеряться после перезапуска сервера rabbitmq, потому что канал не находится в режиме подтверждения, но я все еще вижу всеl другие сообщения в очереди после перезапуска сервера.

Поскольку я новичок в RabbitMQ, может кто-нибудь сказать мне, где моя проблема с подтверждением понимания?

Ответы [ 2 ]

3 голосов
/ 13 мая 2013

Насколько я понимаю, «Подтверждение канала» предназначено для Брокера и подтверждает, что оно успешно получило сообщение от производителя, независимо от того, подтвердил пользователь это сообщение или нет. В зависимости от типа очереди и режима доставки сообщений, см. http://www.rabbitmq.com/confirms.html,

сообщения подтверждаются, когда:

  • решает, что сообщение не будет направлено в очереди (если установлен обязательный флаг, то сначала отправляется basic.return) или
  • временное сообщение достигло всех своих очередей (и зеркал) или
  • постоянное сообщение достигло всех своих очередей (и зеркал) и было сохранено на диск (и fsynced) или
  • постоянное сообщение было использовано (и при необходимости подтверждено) из всех его очередей
1 голос
/ 13 апреля 2017

Старый вопрос, ну да ладно ..

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

Это на самом деле так и должно работать, ЕСЛИ постоянство включено. Если сервер выходит из строя или что-то еще идет не так, сообщения не могут быть подтверждены и, следовательно, не будут удалены из очереди.

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

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

Подробнее о подтверждениях и подтверждениях: https://www.rabbitmq.com/reliability.html

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