Если Channel#checkQueue (из amqplib для NodeJS) выводит из строя канал, зачем использовать?

#rabbitmq #amqp

#rabbitmq #amqp

Вопрос:

Документы для amqplib (AMQP 0-9-1 NodeJS API) описывают функциональность для Channel#checkQueue следующим образом…

Проверьте, существует ли очередь. Это приведет к блокировке канала, если именованная очередь не существует; если она существует, вы переходите к следующему раунду!

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

Аналогично, для Channel#checkExchange

Проверьте, существует ли обмен. Если он не существует, канал будет закрыт с ошибкой. Если он существует, счастливых дней.

Я что-то упускаю или это почти бесполезно? Я предполагаю, что канал может быть воссоздан, но не без потери активности в области канала.

Ответ №1:

Основываясь на моих исследованиях (создание клиента RabbitMQ для производственного использования), ваше утверждение верно: checkQueue и checkExchange оба совершенно бесполезны.

  • Отказ от ответственности: Если ваш клиент не предназначен для «быстрого сбоя» или полного прерывания, если очередь еще не существует в качестве предварительного условия.

Установленный шаблон amqplib заключается в том, чтобы всегда использовать assertQueue вместо этого.

Подтвердите существование очереди. Эта операция является идемпотентной при наличии идентичных аргументов; однако она приведет к блокировке канала, если очередь уже существует, но имеет другие свойства (значения, указанные в поле аргументы, могут учитываться, а могут и не учитываться для целей проверки; проверьте документацию borker, я имею в виду брокера).

Как вы можете видеть, в использовании есть пара недостатков assertQueue — даже если это идемпотентная операция:

  1. Операция автоматически создает очередь (если она еще не существует), а не просто проверяет, существует ли очередь.
    • например, уловка 22: хотите проверить, существует ли очередь, чтобы определить, нужно ли ее создавать.
  2. Операция может потенциально повредить («bork» … facepalm по поводу использования этой терминологии) канал, если очередь уже существует, и она была создана с использованием других параметров (по сравнению с текущими указанными параметрами)
    • например, exclusive , durable , autodelete messageTtl , expires и т.д.