У меня есть букмарклет, который при использовании отправляет все URL-адреса на текущей странице браузера в приложение Rails 3 для обработки. За кулисами я использую Typhoeus , чтобы проверить, что каждый URL возвращает код состояния 2XX. В настоящее время я запускаю этот процесс через AJAX-запрос к серверу Rails и просто жду, пока он обработает и вернет результаты. Для небольшого набора это очень быстро, но когда количество URL-адресов достаточно велико, пользователь может ждать, скажем, до 10-15 секунд.
Я рассмотрел возможность использования отложенного задания для обработки этого вне потока пользователя, но это не совсем подходящий вариант использования. Поскольку пользователю необходимо дождаться окончания обработки, чтобы увидеть результаты, а отложенное задание может занять до пяти секунд, прежде чем задание будет даже запущено, я не могу гарантировать, что обработка произойдет как можно скорее. Это время ожидания не приемлемо в этом случае, к сожалению.
В идеале, я думаю, должно произойти следующее:
- Пользователь нажимает на закладку
- Данные отправляются на сервер для обработки
- Ждущая страница мгновенно возвращается при выделении потока для обработки
- Страница ожидания периодически опрашивает через ajax результаты обработки и обновляет страницу ожидания (например: «4 из 567 URL-адресов обработано ...»)
- страница ожидания обновляется с результатами, как только они будут готовы
Некоторые дополнительные детали:
- Я использую Heroku (долго работающие процессы останавливаются через 30 секунд)
- Эту функцию могут использовать как зарегистрированные, так и анонимные пользователи
Это типичный способ сделать это, или есть лучший способ? Должен ли я просто выполнить свою собственную обработку вне потока, которая обновляет базу данных во время обработки, или есть что-то вроде отложенного задания, которое я могу использовать для этого (и это работает на Heroku)? Любые толчки в правильном направлении приветствуются.