Как фоновая служба, работающая на веб-сервере, может информировать клиентский браузер о ходе работы службы?

Во-первых, я совершенно новичок во многих вещах, поэтому я буду рад любому вкладу, включая предложения, существующие проекты, существующие модели и т. д.

Мои текущие проблемы:

  1. Фоновая служба поддерживает очередь задач. Фоновая служба написана на C++ или Python.

  2. Когда клиент нажимает кнопку «Создать задачу» в браузере, информация будет отправлена ​​на веб-сервер, а сценарий веб-сервера (написанный на PHP) инициирует вызов RPC к фоновой службе, чтобы добавить задачу во внутреннюю очередь.

  3. Браузер клиента инициирует запрос AJAX, чтобы дождаться завершения задачи. Запрос AJAX будет удерживаться до тех пор, пока задача не будет завершена (или завершится сбоем) или клиент не отменит запрос.

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

Я могу думать о двух способах:

  1. Фоновая служба может заблаговременно информировать AJAX-скрипт сервера о ходе выполнения. Это низкая стоимость, но я на самом деле не знаю, как это сделать. Предоставляет ли какой-либо фреймворк RPC такой асинхронный обратный вызов? В настоящее время я решил использовать платформу RPC Thrift из-за ее многоязычной поддержки.

  2. Сценарий AJAX на стороне сервера будет выполнять вызов RPC для получения текущего прогресса каждые несколько секунд, а в промежутках будет спать. По завершении сценарий AJAX вернется, в противном случае он просто позволит клиентскому браузеру подождать, не возвращаясь. Это на самом деле проще, но я не уверен в его стоимости. Обратите внимание, что задержка здесь для меня не проблема, потому что я полагаю, что клиенты могут подождать еще несколько секунд.

Есть ли какой-либо общий способ/модель решения этой проблемы?

Спасибо за помощь.


person user534498    schedule 12.12.2011    source источник
comment
Вы смотрели на веб-сокеты? websocket.org или длинный опрос: stackoverflow.com/questions/333664/   -  person 0x6A75616E    schedule 12.12.2011
comment
Спасибо. просто прочитайте оба. websocket слишком нов, чтобы его поддерживало большинство браузеров, поэтому лучше всего использовать длинные опросы.   -  person user534498    schedule 12.12.2011


Ответы (3)


Зависит от того, как вы кодируете. Обычный способ сделать это - делать javascript-запрос ajax каждые 1-3 секунды или около того и опрашивать ход выполнения с сервера.

Это временно закроет соединение и будет более щадящим для сервера. Если вы используете постоянное соединение (веб-сокеты также попадают в эту категорию), вы будете загружать сервер. Кроме того, «сон» заставляет ЦП быть загруженным, чего я бы старался избегать на вашем месте. С другой стороны, если у вас есть ресурсы для этого...

Я могу только повториться: это зависит от того, как вы это кодируете и что вы ожидаете от этого в конце.

Если вы хотите, чтобы клиент выполнял дополнительную работу и обращался с сервером бережно, выберите 1-й вариант, и если вы думаете, что ваш сервер справится с этим, выберите 2-й вариант и выберите «постоянный» и даже используйте WebSockets (которые представляют собой постоянные подключения к вашему серверу). - помните, что они еще не широко поддерживаются клиентами веб-браузера).

Хотя я думаю, что, в конце концов, компромисс простого прогресса по сравнению с перегрузкой ЦП вашего сервера постоянными спящими режимами и некоторыми постоянными соединениями вдобавок к этому заставит вас выбрать свой 1-й вариант: опросить серверный скрипт для значения прогресса. каждые x секунд со стороны клиента. Кстати: это то, что делает Twitter, и их серверы сохранились до наших дней! ;)

person Community    schedule 12.12.2011

Я думаю, вы можете использовать для этого WebSockets.

person Nick Shvelidze    schedule 12.12.2011

Вы можете использовать WebSockets.

Установите соединение WebSockets между клиентом и веб-службой, имеющей доступ к информации, которую необходимо передать клиенту.

С веб-сокетами вам не нужно опрашивать сервер, спрашивая его о прогрессе, а лучше, чтобы сервер уведомлял клиента, когда он готов.

Обратно совместимой реализацией будет длинный опрос.

Ваше здоровье

person 0x6A75616E    schedule 12.12.2011