Как запустить некоторые задачи в фоновом режиме и поместить результаты в глобальный хэш памяти? - PullRequest
1 голос
/ 11 июля 2010

Я создаю веб-сайт с Rails, который позволяет пользователям проверять, были ли зарегистрированы некоторые домены. Логика устроена так:

  1. На странице есть текстовое поле, позволяющее пользователям вводить некоторые доменные имена
  2. Когда пользователь нажимает кнопку check, ввод будет отправлен на сервер
  3. сервер получает входные данные, создает фоновое задание (которое будет выполнено в другом процессе) и немедленно возвращает пользователю некоторый текст, такой как «проверка сейчас ...»
  4. Фоновая задача отправит доменные имена на другой сайт, получит ответ, проанализирует его, чтобы получить полезную информацию, затем поместит данные в хеш-память памяти (задача занимает 3 секунды)
  5. На странице «проверка сейчас ...» имеется функция javascript, запрашивающая сервер для получения результата проверки. Он запускается каждые 2 секунды, пока не получит результат.
  6. На стороне сервера существует действие для обработки "запроса проверки статуса". Он проверяет, что Globle memory hash , он нашел результат, возвращает его, в противном случае возвращает "[]"

(я использую Rails 2.3.8, delayed_job)

Я был Java-разработчиком, это то, что я буду делать на Java. Но мне было трудно удерживать «хэш памяти» для «отложенного рабочего» и «рельсов», потому что они находятся в разных процессах.

Разве мой дизайн невозможен в рельсах? Должен ли я сохранить результат проверки в базе данных или что-то вроде «memcached»?

И могут ли эти фоновые задачи выполняться параллельно?

1 Ответ

3 голосов
/ 11 июля 2010

Не только между работниками DelayedJob и работниками Rails вы не увидите глобальные переменные, но в процессе работы вы также будете иметь дело с несколькими рабочими процессами Rails.Так что даже если бы вы установили глобальную переменную в Rails, какой-то другой работник Rails не увидит ее.

Это сделано специально.Он имеет то преимущество, что вы можете распределить нагрузку по Rails и DelayedJob на несколько компьютеров, поскольку они обрабатывают только запрос без сохранения состояния и смотрят на систему базы данных или другое постоянное хранилище, чтобы добавить состояние, необходимое вашему веб-приложению.

Из того, что я собрал, веб-приложение Java может использовать многопоточную модель, которая позволит вам выполнять фоновые задачи и устанавливать глобальные переменные так, как вы хотите.Но это также ограничивает вас одной машиной;что бы вы сделали, если бы вам пришлось масштабироваться?

Memcached на самом деле звучит как действительно хорошее решение в этом случае.Его легко установить, он требует минимальной настройки и прост в использовании из Rails.

...