#rabbitmq #amqp
#rabbitmq #amqp
Вопрос:
Документы для amqplib (AMQP 0-9-1 NodeJS API) описывают функциональность для Channel#checkQueue
следующим образом…
Проверьте, существует ли очередь. Это приведет к блокировке канала, если именованная очередь не существует; если она существует, вы переходите к следующему раунду!
Предполагая, что я правильно понимаю значение «заблокировать канал» как «отключить канал», тогда для чего хороша эта функция? Кажется, очень вводящим в заблуждение выражение «checkQueue», если это небезопасная проверка.
Аналогично, для Channel#checkExchange
Проверьте, существует ли обмен. Если он не существует, канал будет закрыт с ошибкой. Если он существует, счастливых дней.
Я что-то упускаю или это почти бесполезно? Я предполагаю, что канал может быть воссоздан, но не без потери активности в области канала.
Ответ №1:
Основываясь на моих исследованиях (создание клиента RabbitMQ для производственного использования), ваше утверждение верно: checkQueue
и checkExchange
оба совершенно бесполезны.
- Отказ от ответственности: Если ваш клиент не предназначен для «быстрого сбоя» или полного прерывания, если очередь еще не существует в качестве предварительного условия.
Установленный шаблон amqplib заключается в том, чтобы всегда использовать assertQueue
вместо этого.
Подтвердите существование очереди. Эта операция является идемпотентной при наличии идентичных аргументов; однако она приведет к блокировке канала, если очередь уже существует, но имеет другие свойства (значения, указанные в поле аргументы, могут учитываться, а могут и не учитываться для целей проверки; проверьте документацию borker, я имею в виду брокера).
Как вы можете видеть, в использовании есть пара недостатков assertQueue
— даже если это идемпотентная операция:
- Операция автоматически создает очередь (если она еще не существует), а не просто проверяет, существует ли очередь.
- например, уловка 22: хотите проверить, существует ли очередь, чтобы определить, нужно ли ее создавать.
- Операция может потенциально повредить («bork» … facepalm по поводу использования этой терминологии) канал, если очередь уже существует, и она была создана с использованием других параметров (по сравнению с текущими указанными параметрами)
- например,
exclusive
,durable
,autodelete
messageTtl
,expires
и т.д.
- например,