Наилучшая практика для обработки большого количества данных, пока пользователь ждет (в Rails)? - PullRequest
5 голосов
/ 09 ноября 2010

У меня есть букмарклет, который при использовании отправляет все URL-адреса на текущей странице браузера в приложение Rails 3 для обработки. За кулисами я использую Typhoeus , чтобы проверить, что каждый URL возвращает код состояния 2XX. В настоящее время я запускаю этот процесс через AJAX-запрос к серверу Rails и просто жду, пока он обработает и вернет результаты. Для небольшого набора это очень быстро, но когда количество URL-адресов достаточно велико, пользователь может ждать, скажем, до 10-15 секунд.

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

В идеале, я думаю, должно произойти следующее:

  • Пользователь нажимает на закладку
  • Данные отправляются на сервер для обработки
  • Ждущая страница мгновенно возвращается при выделении потока для обработки
  • Страница ожидания периодически опрашивает через ajax результаты обработки и обновляет страницу ожидания (например: «4 из 567 URL-адресов обработано ...»)
  • страница ожидания обновляется с результатами, как только они будут готовы

Некоторые дополнительные детали:

  • Я использую Heroku (долго работающие процессы останавливаются через 30 секунд)
  • Эту функцию могут использовать как зарегистрированные, так и анонимные пользователи

Это типичный способ сделать это, или есть лучший способ? Должен ли я просто выполнить свою собственную обработку вне потока, которая обновляет базу данных во время обработки, или есть что-то вроде отложенного задания, которое я могу использовать для этого (и это работает на Heroku)? Любые толчки в правильном направлении приветствуются.

1 Ответ

1 голос
/ 10 ноября 2010

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

...