Уведомления о ходе выполнения от службы HTTP / REST

StackOverflow https://stackoverflow.com/questions/1043883

  •  20-08-2019
  •  | 
  •  

Вопрос

Я работаю над веб-приложением, которое отправляет задачи в систему master / worker, которая распределяет задачи по любому из серии экземпляров worker.Мастер рабочей очереди выполняется как отдельный процесс (вообще на отдельной машине), и задачи передаются мастеру через HTTP / REST запросы.Как только задачи отправлены в рабочую очередь, клиентские приложения могут отправить еще один HTTP-запрос, чтобы получить информацию о состоянии задач.

Для моего веб-приложения я бы хотел, чтобы оно предоставляло своего рода индикатор выполнения, который дает пользователю некоторое представление о том, как далеко продвинулась обработка задачи.Очевидным способом реализации этого был бы виджет AJAX progress meter, который периодически опрашивает рабочую очередь на предмет статуса отправленных задач.Мой вопрос в том, есть ли лучший способ добиться этого без частых опросов?

Я рассматривал возможность того, чтобы клиентское веб-приложение открыло серверный сокет, на котором оно могло бы прослушивать уведомления от мастера работы.Еще одна похожая мысль, которая у меня возникла, - использовать XMPP или аналогичный протокол для уведомлений о состоянии.(Конечно, систему master / worker необходимо было бы обновить, чтобы предоставлять уведомления в любом случае, но у меня есть код для этого, поэтому я могу самостоятельно вносить любые необходимые обновления.)

Есть какие-нибудь мысли о наилучшем способе настройки подобной системы уведомлений?Стоят ли затраченных дополнительных усилий, или лучше воспользоваться простым решением для опроса?

Это было полезно?

Решение

Я думаю, это зависит от нескольких факторов

  • Насколько точной может быть обратная связь (1 процент, 5 процентов, 50 процентов)
    Точная обратная связь делает целесообразным использовать какой-то индикатор выполнения и подталкивание в стиле comet.Если бы вы только могли сказать: "Занят...держись...почти на месте...готово", затем простой ajax-опрос "мы еще там", безусловно, проще кодировать.
  • Насколько своевременно сделанное сообщение должно быть замечено клиентом
  • Сколько времени занимает выполнение каждого задания (1 секунда, 10 секунд, 10 минут)
    1 секунда делает это немного спорным.10 секунд того стоят.10 минут означают, что вам лучше предложить пользователю пойти на кофе-брейк :-)
  • Сколько будет одновременных запросов
    Если у вас нет "специального" сервера, системы в стиле live push, как правило, потребляют соединения, и вы довольно быстро исчерпаете их.Необходимость использовать больше веб-серверов для создания модного индикатора выполнения может нанести ущерб бюджету.

У меня есть несколько примеров кода на 871184 это показывает свернутую руку " .вечный кадр" который, кажется, работает хорошо.Проект, для которого я его разработал, не так уж и сложен, хотя операции занимают несколько секунд, и мы можем дать довольно точный процент.Код использует asp.net и jquery, но общие методы будут работать с любым сервером и фреймворком javascript.

Редактировать Как Джон указывает на то, что отчет о состоянии, вероятно, не входит в обязанности службы RESTful.Но нет ничего, что говорило бы о том, что вы не можете открыть iframe на клиенте, который подключается к странице на сервере, который опрашивает службу.Теория гласит, что сервер и сервис, по крайней мере, будут ближе друг к другу :-)

Другие советы

Опрос

Клиент продолжает опрашивать сервер, чтобы получить статус ответа.

Плюсы

  • Быть действительно RESTful - это значит быть кэшируемым и масштабируемым.

Минусы

  • Не самая лучшая скорость реагирования, если вы не хотите слишком часто опрашивать свой сервер.

Постоянное соединение

Сервер не закрывает свое HTTP-соединение с клиентом до тех пор, пока ответ не будет завершен.Сервер может отправлять промежуточный статус через это соединение, используя HTTP multiparts.

Комета это самый известный фреймворк для реализации такого поведения.

Плюсы

  • Лучшая скорость реагирования, уведомления с сервера поступают практически в режиме реального времени.

Минусы

  • Лимит подключений на веб-сервере ограничен, и слишком долгое сохранение соединения открытым может в лучшем случае нагрузить ваш сервер, в худшем - открыть сервер для атак типа "отказ в обслуживании".

Клиент как сервер

Сделайте так, чтобы сервер отправлял обновления статуса и ответ клиенту, как если бы это было другое приложение RESTful.

Плюсы

  • Лучше всего то, что никакие ресурсы не тратятся впустую в ожидании ответа ни на сервере, ни на стороне клиента.

Минусы

  • Вам нужен полноценный HTTP-сервер и стек веб-приложений на клиенте
  • Брандмауэры и маршрутизаторы с их стандартным "вообще никаких входящих подключений" будут мешать.

Не стесняйтесь редактировать, чтобы добавить свои мысли или новый метод!

Мое мнение заключается в том, чтобы придерживаться решения опроса, но вас может заинтересовать эта статья в Википедии о HTTP Push-запрос Технологии.

REST зависит от HTTP, который является протоколом запроса / ответа.Я не думаю, что вы получите чистый HTTP-сервер, перезванивающий клиенту со статусом.

Кроме того, составление отчетов о состоянии не входит в обязанности службы.Клиент сам решает, когда и хочет ли он, чтобы ему сообщали о статусе.

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

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

PS:Если бы вы открыли сокет из клиента, это бы мало что изменило - PHP-браузер показал бы страницу как все еще "загружающуюся", что не очень удобно для пользователя.(предполагая, что вы бы нажали или очистили буфер, чтобы раньше отображались другие объекты)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top