AJAX: как получить обратную связь о прогрессе в веб-приложениях и избежать таймаутов на длинные запросы? - PullRequest
3 голосов
/ 09 июня 2010

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

Вот требования:

  • создайте веб-форму, куда вы можете загрузить CSV-файл, содержащий список URL
  • , когда пользователь нажимает «отправить»,сервер извлекает файл и проверяет каждый URL-адрес, чтобы выяснить, является ли он живым и какой тег заголовка страницы.
  • в результате получается загружаемый CSV-файл, содержащий URL-адрес и полученный HTTP-код * 1010.*
  • входной CSV может быть очень большим (> 100000 строк), поэтому процесс выборки может занять 5-30 минут.

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

Я использую perl, template toolkit и jquery, но любое решение, использующее любую веб-технологию, будет приемлемым.

edit: Пример возможного решения в этом вопросе: Как реализовать базовый «длинный опрос»?

Ответы [ 3 ]

3 голосов
/ 09 июня 2010

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

В любом случае я рекомендую передать работу другому процессу, как только он попадет на сервер.

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

Пакетный процессор может быть реализован несколькими способами:

  • Разветвите и отсоедините дочерний элемент от ввода-вывода, чтобы завершить пакетную обработку. Родитель завершает веб-запрос.
  • Сохраните загружаемый контент в очередь обработки (например, файл в файловой системе, записи в базе данных) и попросите веб-сервер уведомить внешнего процессора - либо пользовательского демона, либо готового планировщика, например, «at» для * nix систем.

Затем вы можете предложить пользователю несколько способов мониторинга процесса:

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

Пакетный процессор может сообщить о своем состоянии несколькими способами:

  • Обновление записи в базе данных
  • Создание журнала обработки
  • Использовать именованную трубу

Передача кода другому процессу имеет ряд преимуществ:

  • Процесс будет продолжаться, когда пользователь случайно остановит браузер.
  • Использование внешнего процесса вынуждает вас сообщать о состоянии партии таким образом, чтобы вы могли отсоединить монитор и заново подключить его в любое время. Например: КОГДА пользователь случайно уходит со страницы до завершения процесса.
  • Реализовать пакетное регулирование и отсрочку проще, если вы решите, что вам нужно распределить пакетную обработку, чтобы она выполнялась в часы с низким трафиком.
  • Вам не нужно беспокоиться о таймаутах в сети (на стороне клиента или на стороне сервера).
  • Вы можете перезапустить веб-сервер, не беспокоясь о том, прерываете ли вы пакетный процесс.
1 голос
/ 09 июня 2010

Самым простым будет пакетный процесс или даже потоковая работа. Если вы рассматриваете это как таблицу данных, которую вы имеете на своей странице. Если в таблице> 100000 записей, вы просто запросите все записи одновременно. Я бы сделал это:

  1. Отправить запрос на скачивание файла.

  2. Отправить запрос на обработку 100 ( произвольных чисел ) записей.

    а. Обработка записей.

    б. Сохранить во временный CSV-файл.

    с. Ответ обратно со статусом завершен / не завершен процесс.

    * * 1 022 д. Если статус не завершен , повторите шаг два.
0 голосов
/ 07 августа 2017

Вы упомянули, что клиенту нельзя доверять, поэтому я рекомендую (на стороне клиента) предварительно проанализировать файл по числу записей X, добавить контрольную сумму к каждому подмножеству записей, а затем разрешить клиенту фиксированное количество соединений загружать через прокси, чтобы вы могли более точно отслеживать прогресс.

...