Для меня это выглядит как идеальный вариант использования комбинации WebSockets и реакторной конструкции , такой как EventMachine или node.js.
Почему WebSockets?
Для части запроса это не имеет большого значения. Однако различные внешние службы будут реагировать с различными задержками, что означает, что для того, чтобы представить пользователю результаты как можно скорее, вам, вероятно, придется запустить запрос длинного опроса для каждой из этих служб (который обычно блокирует процессы которые обрабатывают эти запросы), или используйте последовательность запросов с длительным опросом для получения ответов по мере их поступления. Каждый HTTP-запрос имеет определенную нагрузку, необходимую для установления соединения, и вы будете передавать намного больше данных в заголовках HTTP, чем в самом ответе.
С другой стороны, соединение WebSocket устанавливается один раз, и с тех пор оно действует как своего рода двунаправленный канал, который можно использовать для передачи сообщений. Эти сообщения могут быть ответами различных служб, которые будут переданы клиенту, как только они поступят. Это избавляет вас от лишних затрат и позволяет максимально быстро получать ответы от пользователей.
Почему каркас реактора?
Если вы используете фоновое задание для обработки ответов, есть вероятность, что у вас будет меньше рабочих процессов, чем число запросов, которые будут сделаны. Это означает, что некоторые запросы должны будут ждать, пока рабочие не будут готовы, поэтому пользователь получит ответ позже, чем он мог бы получить, если бы все запросы были выполнены параллельно. Асинхронный ввод / вывод позволяет выполнять все эти запросы параллельно и возвращать результаты пользователю по мере его поступления.
Если вы используете очередь фоновых заданий, вам также потребуется сохранить результаты в каком-либо хранилище данных, чтобы ваш веб-сервер мог опрашивать их, чтобы узнать, когда завершился конкретный запрос. Этот опрос на стороне сервера также увеличивает задержку при получении данных пользователем.
Подводя итог: использование структуры реактора + WebSockets не только улучшит пользовательский опыт, но и упростит его реализацию. Посмотрите библиотеку socket.io для node.js: она должна позволить реализовать ваш сценарий использования в дюжине строк кода или около того.