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