Как уведомить мой клиент JS без опроса? - PullRequest
4 голосов
/ 26 августа 2009

Контекст: Из моего веб-интерфейса javascript я запускаю длительную (несколько минут) операцию, выполняемую на бэкенде .NET2.0. Вызов немедленно возвращается с идентификатором операции, в то время как длительная операция выполняется параллельно. Операции не загружают процессор, но выполняют медленные сетевые вызовы. После завершения операции я хочу увидеть результаты в веб-интерфейсе.

Вопрос: Как я могу уведомить клиента о завершении работы?

Варианты, которые я рассмотрел:

Вариант 1 : я запускаю длительную операцию асинхронно напрямую из JS и ожидаю, что возвращаемое значение будет конечным результатом, а не идентификатором операции. Моя библиотека AJAX позаботится обо всем, и жизнь выглядит очень легкой и аккуратной. Проблема в том, что на стороне сервера поток является потоком ThreadPool, который я сейчас блокирую на несколько минут . Вам не нужно слишком много длительных параллельных запросов, чтобы заставить ThreadPool голодать и поставить весь сервер на колени, даже если имеется достаточная вычислительная мощность.

Опция 2 : С идентификатором операции я начинаю опрашивать сервер, если операция завершена. Однако это атака типа «отказ в обслуживании» против моего собственного сервера. Кроме того, должно быть справедливое решение AJAX. Это не единственная проблема.

Ответы [ 6 ]

3 голосов
/ 20 ноября 2009

Проверьте WebSync , кометную реализацию для .NET. Должно быть именно то, что вы ищете.

3 голосов
/ 26 августа 2009

Опрос, если все сделано правильно, не окажет заметного влияния на нагрузку на ваш сервер. Вы должны настроить интервал, чтобы наилучшим образом покрыть специфику работы вашего сервера - например, Вы не опрашиваете сервер в течение как минимум 2 минут, если знаете, что операция обычно занимает больше времени. Даже после этого вы выбираете достаточно большой интервал - например, 10 сек Использование запроса веб-службы или пользовательского обработчика минимизирует трафик и время сервера, необходимое для обработки запроса.

2 голосов
/ 26 августа 2009

Возможно, обратный ajax полезен, если у вас не слишком много одновременных клиентов. Это иногда называют кометой.

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

http://en.wikipedia.org/wiki/Reverse_Ajax

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

0 голосов
/ 26 августа 2009

ICEfaces Framework поддерживает технологию AJAX Push . Они поддерживают масштабируемую асинхронную обработку запросов на различных серверах приложений, таких как Jetty, Tomcat и Glassfish.

Хотя это все Java, это может помочь найти правильные условия поиска для Google.

0 голосов
/ 26 августа 2009

Ваш вариант 2 именно то, что я делал раньше. Используйте setTimeout, чтобы ограничить ваш опрос каждые 30 секунд или около того.

0 голосов
/ 26 августа 2009

как насчет того, чтобы скрытый (или маленький) iframe запустил долго работающий скрипт и создал javascript для проверки только содержимого iframe? например Сценарий записывает идентификатор в iframe в конце.

...