На сайте RabbitMQ есть учебник по созданию потока RPC "запрос-ответ" , который звучит именно так, как вы хотите.
Как вы говорите, один "ответ"Очередь не будет работать, потому что вы не можете выбрать, какие элементы вы получаете из очереди, вы получаете их все по порядку.Вместо этого, хитрость заключается в создании отдельной очереди ответов для каждого клиента (или, для простейшей реализации, очереди ответов для каждого запроса).
Вы делаете это, объявляя «анонимным»"очередь, которая на самом деле не является анонимной, ее имя выбрано для вас RabbitMQ.Затем вы можете отправить это имя как часть вашего запроса (условно, в заголовке reply_to
сообщения AMQP), чтобы рабочий на другом конце знал, куда отправить ответ.В php-amqplib это выглядит так:
list($reply_queue_name, ,) = $channel->queue_declare("", false, false, true, false);
Примечание:
- Вызов
queue_declare
возвращает массив с именем и состоянием очереди;нам нужно только имя, поэтому мы отбрасываем оставшуюся часть массива с помощью конструкции list()
. - Имя очереди передается как пустая строка, сообщая серверу создать имя по своему выбору.
- 4-й параметр установлен на
true
, чтобы объявить очередь "исключительной";это означает, что как только это соединение закончится, очередь будет очищена.