Требование к фоновой / асинхронной задаче Rails - PullRequest
3 голосов
/ 20 сентября 2010

У нас есть приложение rails v2.3.8 / apache / passenger и требования асинхронности для некоторых длительных задач.Поэтому я оценивал некоторые решения, связанные с rails / ruby, и хотел получить обратную связь по некоторым решениям.

Также у меня возник один вопрос - как возникают фоновые задачи / рабочие.Учитывая, что наше приложение rails будет работать в контейнере apache / passenger, означает ли это, что фон / рабочие также будут порождать процесс / поток apache / passenger ??

Есть ли только один рабочий поток / процесс, который запущен,что означало бы, что задания будут обрабатываться последовательно или задания обрабатываются параллельно?Я родом из java / j2ee, поэтому хорошо разбираюсь в бинах / потоке сообщений, но понятия не имею, как работают решения для обмена сообщениями в rails?

Вот некоторые параметры, на основе которых мы оцениваем следующие решения:Производительность / Масштаб, Распределенные работники (работающие на отдельных узлах), Поддержка Rails v3

  • Beanstalkd -> асинхронный наблюдатель

  • Запуск -> Работа

  • ActiveMQ (Stomp) -> Обработка / активное сообщение

  • Задержка JOB

Ответы [ 2 ]

1 голос
/ 20 сентября 2010

Phusion Passenger обрабатывает только веб-запросы.Фоновые задачи лучше всего обрабатываются внешней системой очередей.Вы уже упомянули некоторые из них.Эти системы очередей работают как отдельные процессы и не влияют ни на какие процессы, которыми управляет Phusion Passenger.

0 голосов
/ 11 апреля 2012

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

При умном порождении пассажира все соединения должны быть сброшены сразу после создания нового потока. См. http://www.modrails.com/documentation/Users%20guide%20Nginx.html#_smart_spawning_gotcha_1_unintential_file_descriptor_sharing для справки.

Сюда также входят подключения к очереди. Обязательно сбросьте их с помощью соответствующего кода в

PhusionPassenger.on_event(:starting_worker_process) do |forked|
  if forked
    ...
  end
end if defined?(PhusionPassenger)

блок.

...