RabbitMQ использование непосредственных и обязательных битов - PullRequest
44 голосов
/ 17 июня 2011

Я использовал сервер RabbitMQ и для публикации сообщений, когда было установлено немедленное поле true , я попытался отправить 50 000 сообщений и использовать rabbitmqctl list_queues , я увидел, что количество сообщений в очереди было ноль . Затем я изменил флаг немедленный на false и снова попытался отправить 50 000 сообщений, а затем, используя rabbitmqctl list_queues , увидел, что всего 100 000 сообщений были в очередях. (До сих пор покупатель не присутствовал)

И после этого я стал потребителем, и он потреблял все 100 000 сообщений. Может кто-нибудь помочь мне разобраться в немедленном битовом поле и этом поведении тоже. Также я не смог понять концепцию обязательного битового поля.

Заранее благодарим.

Гурприт Сингх.

Ответы [ 2 ]

111 голосов
/ 17 июня 2011

Поля immediate и mandatory являются частью спецификации AMQP и также рассматриваются в FAQ для RabbitMQ, чтобы пояснить, как его реализации интерпретировали их значение:

Обязательно

Этот флаг сообщает серверу, как реагировать, если сообщение не может быть перенаправлено на очередь. В частности, если обязательным является установить и после запуска привязок сообщение было помещено в нулевые очереди, то сообщение возвращается отправителю (с базовым возвратом). Если обязательно не был установлен под тем же обстоятельства бы сервер молча отбросить сообщение.

Или, по моим словам, "Поместите это сообщение хотя бы в одну очередь. Если не можете, отправьте его мне."

Немедленное

Для сообщения, опубликованного с немедленным установить, если соответствующая очередь готова потребители тогда один из них будет иметь сообщение направлено на него. Если повезет потребитель падает до подтверждения квитанция сообщение будет поставлено в очередь и / или доставлены другим потребителям на эта очередь (если нет сбоя сообщение подтверждено и все готово как обычно). Если, однако, соответствующая очередь готова к нулю потребители сообщения не будут поставлен в очередь на последующую доставку из этой очереди. Только если все соответствующие очереди не готовы потребители, что сообщение возвращается отправителю (через basic.return).

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

6 голосов
/ 30 ноября 2018

http://www.rabbitmq.com/blog/2012/11/19/breaking-things-with-rabbitmq-3-0/

Снятие "немедленного" флага

Что изменилось? Мы убрали поддержку редко используемыхФлаг «немедленного» в basic.publish AMQP.

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

Что мне нужно сделать? Если вы просто хотите иметь возможность публиковать сообщения, которые будутбыть отброшенным, если они не потребляются немедленно, вы можете опубликовать в очереди с TTL 0. 0. 1019 *

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

Просто скопировал объявление здесь для быстрого ознакомления.

...