используя rabbitmq с рельсами, как создать процесс бесконечного цикла? - PullRequest
1 голос
/ 19 марта 2011

В веб-приложении rails, если я пишу сообщения в очередь, например rabbitmq, как клиенты будут уведомлены, когда производитель отправит сообщение в очередь?

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

Если это так, возможно ли повторно использовать модели / библиотеки, которые уже есть в приложении rails? тогда я должен скопировать этот код в 2 местах?

Ответы [ 2 ]

5 голосов
/ 19 марта 2011

Похоже, что вашему приложению требуется то, что обычно называется background или worker process. Это довольно распространенное требование для любого умеренно сложного веб-приложения.

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

Да, вы правы. Хотя вполне возможно использовать потоки для обработки фоновых задач (в вашем случае чтение и обработка сообщений из RabbitMQ), стандартным и рекомендуемым маршрутом для приложения Rails является запуск отдельного фонового процесса.

Если это так, возможно ли повторно использовать модели / библиотеки, которые уже есть в приложении rails?

Абсолютно. Самый простой способ добиться этого - использовать встроенную в Rails команду .

Rails *.

Другой вариант - создать скрипт ruby, который загружает ваше Rails-приложение. Например, вы можете создать файл my_script.rb в корне вашего проекта, который может выглядеть примерно так:

# Load my application:
require File.join(File.dirname(__FILE__), 'config/environment.rb')

# Now you can access your Rails environment as normal:
MyModel.all.each { |x| x.do_something }

Если ваши потребности становятся более сложными, или вы обнаружите, что вам нужно запустить более одного фонового процесса, чтобы не отставать от объема данных, которые вам нужно обработать, вы можете обратиться к одному из многих доступных библиотеки и фреймворки , которые могут помочь с этим.

После того как вы создали фоновый процесс, вам потребуется способ его непрерывного запуска при развертывании на рабочем сервере. Хотя можно использовать библиотеки, такие как daemons , как рекомендует ctcherry, я бы порекомендовал использовать специальный инструмент, например upstart (при развертывании в Ubuntu) или runit . Хорошее резюме наиболее популярных опций: доступно здесь .

0 голосов
/ 19 марта 2011

Вы правы, вам нужен фоновый процесс. И вы можете хранить код для этого процесса в папке lib проекта Rails, если хотите, я делал это раньше без проблем, и он сохраняет связанный код вместе, что приятно.

Я использовал эту библиотеку для создания своего долгого процесса, все было довольно просто:

http://daemons.rubyforge.org/

Чтобы повторно использовать модели из вашего приложения rails, вы можете запустить require в файле config/environment.rb, чтобы загрузить все. (Сначала установите RAILS_ENV в качестве переменной среды, чтобы выбрать правильное окружение). С этого момента скрипт ведет себя так, как будто вы находитесь в сеансе консоли rails.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...