Подтвердить что ты не робот

Разница в RabbitMQ между эксклюзивным и автоматическим удалением?

В книге "RabbitMQ in Action" на стр. 19 приведено описание эксклюзивного и автоматического удаления:

exclusive - если установлено значение true, ваша очередь становится частной и может быть использованным вашим приложением. Это полезно, когда вам нужно ограничить очередь только одному потребителю.

auto-delete - очередь автоматически удаляется, когда последняя потребитель не подписывается. Если вам нужна временная очередь, используемая только одной потребитель, объединить auto-delete с эксклюзивным. Когда потребитель отключается, очередь будет удалена.

Но насколько я могу видеть, когда используется эксклюзивное, автоматическое удаление является избыточным. Только эксклюзивный. RabbitMQ tutorial, кажется, говорит, что это так.

... после отключения потребителя очередь должна быть удалена. Там в исключительный флаг для этого:

result = channel.queue_declare(exclusive=True)

В этом учебнике нет упоминания об автоматическом удалении, а sudo rabbitmqctl list_bindings означает, что очередь фактически удаляется после того, как приемник уходит.

4b9b3361

Ответ 1

Ну, верно, что очереди exclusive будут автоматически удаляться, когда потребитель отключается (см. документация, вставленная ниже). Однако бывают случаи, когда вы хотите, чтобы очереди были неэксклюзивными, но все же автоматически удалялись (например, если я хочу добавить другого пользователя).

ЭКСКЛЮЗИВ

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

автоудаление

Если установлено, очередь будет удалена, когда все потребители закончат использовать Это. Последний потребитель может быть отменен либо явно, либо потому, что его канал закрыт. Если в очереди не было потребителя, это не будут удалены. Приложения могут явно удалять автоматическое удаление очереди с использованием метода Delete как обычно.

Лично я предпочитаю использовать ни один из этих параметров, вместо этого выбираю параметр RabbitMQ expue queue, что лучше, если у меня есть потребитель отсоедините, а затем снова подключите сразу (или короткое время) позже; в этом случае сообщения не теряются. Но, конечно, все зависит от вашего приложения и требований.

Ответ 2

В отличие от того, что описал Mayer, мое тестирование показало, что существует разница в поведении, когда auto-delete переключается, а эксклюзив - true. Если для параметра auto-delete установлено значение false, очередь действительно привязана к соединению и исчезнет, ​​когда соединение будет завершено. Если для параметра auto-delete установлено значение true, очередь будет удалена после отмены последнего пользователя. Существует различие между соединением и потребителем. Вы можете подключиться, но не потреблять заданную очередь. Если вам нужно, чтобы жизненный цикл очереди привязывался к вашему соединению, а не к тому, активно ли вы его потребляете, установите auto-delete в false вместе с исключением = true.