RabbitMQ: получение базового ответа.ответ ConsumeOk не по порядку

#rabbitmq #amqp

#rabbitmq #amqp

Вопрос:

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

Конвейер запросов клиента:

Exchange.Declare -> Queue.Declare -> Queue.Bind -> Basic.Consume -> Basic.Qos

Конвейер ответа сервера:

Exchange.DeclareOk -> Queue.DeclareOk -> Queue.BindOk -> Basic.QosOk -> Basic.ConsumeOk

Обратите внимание, что ответ Basic.ConsumeOk приходит после Basic.QosOk , даже несмотря на то, что порядок запросов в конвейере был другим. Читая спецификации, я пришел к выводу, что между синхронным запросом и соответствующим ответом могут быть получены только асинхронные методы ( Basic.Deliver , Basic.Return , Channel.Flow , Connection.Close , Channel.Close ). ,,,,,,,,,,,,,,,,,,,).

В противном случае, если, например, я отправлю несколько Queue.Declare запросов или даже Basic.Consume запросов подряд, было бы невозможно узнать, какой ответ соответствует каким запросам, если порядок не сохранен.

Считается ли это нормальным? Является ли мое понимание ошибочным? Или, может быть, конвейерная обработка не поддерживается RabbitMQ?

Ответ №1:

Я предполагаю, что вы используете пользовательскую библиотеку или свой собственный код, потому что конвейерная обработка не поддерживается RabbitMQ или какой-либо из клиентских библиотек, которые мы поддерживаем. Это легко заметить, когда вы запускаете некоторый код с использованием официально поддерживаемой библиотеки.

Когда я запускаю последовательность методов, которые вы описываете, используя Pika, я вижу запросы и ответы, отправленные в ожидаемом порядке.

Я изменил receive.py приведенный здесь код, а также включил перехват пакетов со своего компьютера.

Я использую RabbitMQ 3.7.13, Erlang 21.3.2, Python 3.7.2 и Pika 0.13.1.

Комментарии:

1. Да, это действительно моя собственная реализация. Если вы говорите, что клиентские библиотеки не поддерживают конвейерную обработку, то, очевидно, в Pika вы бы не наблюдали этого эффекта. Являетесь ли вы сопровождающим брокера RabbitMQ? Если да, не могли бы вы, пожалуйста, сказать мне, где документы, описывающие методы, которые могут быть конвейерными, а те, которые не могут? Очевидно, что конвейерная обработка должна поддерживаться для Basic.Publish .

2. Я рекомендую использовать Java-клиент RabbitMQ в качестве эталонной реализации для клиентской библиотеки. В документах есть методы, которые возвращают значение, и те, которые этого не делают. Когда возвращается значение, клиенты должны дождаться, пока оно сочтет эту операцию завершенной.

3. И когда клиент ожидает завершения операции, другая операция такого рода не должна выполняться (метод не должен быть отправлен), это правильно?

4. Я полагаю, это правильно. Конечно, вы можете отправить тот же метод по другому каналу.