Как получить результаты из фонового процесса - PullRequest
2 голосов
/ 01 марта 2010

Я разрабатываю приложение Ruby on Rails, которое запрашивает XML-каналы, считывает их и разбирает их на объекты, которые будут использоваться в представлениях. Поскольку запрос на подачу XML и последующее его получение из некоторых источников может занять несколько секунд, мне нужен способ разгрузить эти задачи от уровня моих приложений. Я не хочу, чтобы мои серверы приложений обрабатывали запрос более чем на несколько сотен миллисекунд. В настоящее время обслуживающие процессы приложения сидят и ждут, когда будут возвращены данные фида XML, чтобы они могли проанализировать их и завершить возврат пользовательского запроса. Я знаю о DelayedJobs, однако, учитывая, что результат этого действия должен быть возвращен пользователю в режиме реального времени, я не уверен, как перенести его в фоновую задачу и получить результат.

Если я перенесу эту задачу в фоновую задачу, как результат будет возвращен пользователю, загружающему страницу?

Ответы [ 4 ]

1 голос
/ 01 марта 2010

Одна из распространенных моделей для такого рода вещей - использовать предпочитаемую библиотеку фоновых заданий (вы упоминаете DelayedJob, которая кажется популярной), чтобы выгрузить задачу из цикла запрос / ответ, а затем настроить опрос AJAX наклиент должен обновить страницу с результатами, как только они станут доступны.

0 голосов
/ 03 марта 2010

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

0 голосов
/ 02 марта 2010

Вы можете заставить свою основную возвращаемую страницу запускать запрос AJAX на втором уровне серверов, которые обрабатывают извлечение XML, и возвращать HTML для раздела страницы, который будет содержать эту информацию. Таким образом, вы не выполняете никаких асинхронных заданий (с точки зрения сервера), и поиск не начнется, пока не поступит запрос AJAX, что уменьшит пропускную способность, которую вы тратите на ботов.

Это стандартное использование AJAX, поэтому я не уверен, что я упустил что-то в вашей проблеме, что делает его неуместным для вас.

0 голосов
/ 01 марта 2010

Если вы открыты для кода Perl, запущенного на вашем сервере, я бы поднял часть инфраструктуры LiveJournal: Gearman и TheSchwartz

Звучит так, будто вы хотите Gearman - и у него есть привязки к Ruby-клиенту.

(см http://www.livejournal.com/doc/server/lj.install.workers_setup_install.html)

...