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

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

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

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

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

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

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос