Фоновые процессы для пользовательских задач? - PullRequest
4 голосов
/ 21 марта 2012

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

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

Является ли это целесообразным использованием фоновых рабочих или они должны использоваться только в тех случаях, когда пользователь неожидание результатов немедленно (например, отправка электронных писем)?

Это лучший способ для разработки этого приложения?

1 Ответ

2 голосов
/ 24 марта 2012

Для меня это выглядит как идеальный вариант использования комбинации WebSockets и реакторной конструкции , такой как EventMachine или node.js.

Почему WebSockets?

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

С другой стороны, соединение WebSocket устанавливается один раз, и с тех пор оно действует как своего рода двунаправленный канал, который можно использовать для передачи сообщений. Эти сообщения могут быть ответами различных служб, которые будут переданы клиенту, как только они поступят. Это избавляет вас от лишних затрат и позволяет максимально быстро получать ответы от пользователей.

Почему каркас реактора?

Если вы используете фоновое задание для обработки ответов, есть вероятность, что у вас будет меньше рабочих процессов, чем число запросов, которые будут сделаны. Это означает, что некоторые запросы должны будут ждать, пока рабочие не будут готовы, поэтому пользователь получит ответ позже, чем он мог бы получить, если бы все запросы были выполнены параллельно. Асинхронный ввод / вывод позволяет выполнять все эти запросы параллельно и возвращать результаты пользователю по мере его поступления.

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

Подводя итог: использование структуры реактора + WebSockets не только улучшит пользовательский опыт, но и упростит его реализацию. Посмотрите библиотеку socket.io для node.js: она должна позволить реализовать ваш сценарий использования в дюжине строк кода или около того.

...