Как вернуть ответ от RabbitMQ в браузер - PullRequest
0 голосов
/ 16 октября 2018

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

Для INSERT с и UPDATE с это былоотносительно просто.Тем не менее, у меня есть пара интенсивных SELECT с, которые я хотел бы отправить в очередь.Однако у меня проблема в том, как вернуть ответ браузеру пользователя, когда он будет готов.

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

У кого-нибудь есть опыт или совет?

Спасибо

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

В итоге я использовал метод, отличный от описанного @IMSoP;Мне было бы интересно услышать любые мнения, которые являются более эффективными или считаются лучшими практиками.

В конце поставленной в очередь задачи ответ JSON помещается в хранилище Redis (ключом является уникальный идентификатор пользователя изначение является ответом JSON).В браузере AJAX используется для запуска PHP-файла каждые две секунды, причем этот файл проверяет, есть ли в хранилище Redis ключ, соответствующий идентификатору пользователя.Найдя его, он возвращает значение в браузер, а затем удаляет пару ключ => значение в Redis.

0 голосов
/ 08 ноября 2018

На сайте RabbitMQ есть учебник по созданию потока RPC "запрос-ответ" , который звучит именно так, как вы хотите.

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

Вы делаете это, объявляя «анонимным»"очередь, которая на самом деле не является анонимной, ее имя выбрано для вас RabbitMQ.Затем вы можете отправить это имя как часть вашего запроса (условно, в заголовке reply_to сообщения AMQP), чтобы рабочий на другом конце знал, куда отправить ответ.В php-amqplib это выглядит так:

list($reply_queue_name, ,) = $channel->queue_declare("", false, false, true, false);

Примечание:

  • Вызов queue_declare возвращает массив с именем и состоянием очереди;нам нужно только имя, поэтому мы отбрасываем оставшуюся часть массива с помощью конструкции list().
  • Имя очереди передается как пустая строка, сообщая серверу создать имя по своему выбору.
  • 4-й параметр установлен на true, чтобы объявить очередь "исключительной";это означает, что как только это соединение закончится, очередь будет очищена.
...