Как фоновая служба, запущенная на веб-сервере, может информировать браузер клиента о ходе службы? - PullRequest
0 голосов
/ 12 декабря 2011

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

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

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

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

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

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

Я могу придумать два пути:

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

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

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

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

Ответы [ 3 ]

1 голос
/ 12 декабря 2011

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

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

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

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

Приветствия

1 голос
/ 12 декабря 2011

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

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

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

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

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

1 голос
/ 12 декабря 2011

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

...