Вопрос по ruby-on-rails, queue, backgroundworker – Каков наилучший способ организации рабочих процессов в Rails?

15

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

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

Ваш Ответ

4   ответа
2

которая получает запросы, а затем должна вызвать несколько внешних систем, используя веб-сервисы. Некоторые из этих запросов занимают больше времени, чем пользователь может ожидать, и я использую корпоративную систему очередей (activemq) для обработки этих запросов.

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

Я видел Ryan Bates Railscast наСкворец и Ворлинг и они выглядят многообещающими, но я ими не пользовался.

8

delayed_job а такжеbackground_job которые сохраняются в базе данных для выполнения асинхронных заданий. Это просто кажется мне грязным. Временный материал не принадлежит базе данных.

Я большой поклонник очередей сообщений для решения асинхронных задач, даже если у вас нет необходимости в масштабируемой масштабируемости. На мой взгляд, очереди сообщений являются идеальным «языком общения». для сложных систем. С помощью очереди сообщений в большинстве случаев у вас нет ограничений на технологии или языки, которые задействованы во всем, что вы создаете. Преимущества использования очереди сообщений с низким уровнем параллелизма, вероятно, наиболее заметны в «Enterprisey». среда, в которой интеграция всегда вызывает огромную боль. Кроме того, очереди сообщений идеальны, когда ваш асинхронный рабочий процесс включает в себя несколько шагов. RabbitMQ - мой личный фаворит.

Например, рассмотрим сценарий, в котором вы создаете поисковую систему. Люди могут отправлять URI для индексации. Очевидно, вы не хотите извлекать и индексировать страницу в запросе. Итак, вы строите вокруг очереди сообщений: цель отправки формы берет URI, выбрасывает его в очередь сообщений для индексации. Следующий доступный процесс-паук извлекает URI из очереди, извлекает страницу, находит все ссылки, помещает каждую из них обратно в очередь, если они неизвестны, и кэширует содержимое. Наконец, новое сообщение помещается во вторую очередь для процесса индексатора для обработки кэшированного содержимого. Процесс индексатора извлекает это сообщение из очереди и индексирует кэшированное содержимое. Упрощенно конечно & # x2014; В поисковых системах много работы, но вы поняли.

Что касается реальных демонов, то, очевидно, я неравнодушен к моей собственной библиотеке (ChainGang), но на самом деле это всего лишь обертка вокруг Kernel.fork (), которая дает вам удобное место для работы с кодом установки и демонтажа. Это также еще не совсем сделано. На самом деле часть демона гораздо менее важна, чем очередь сообщений.

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

Единственное, что мне не нравится в cron + rake, это то, что rake практически гарантированно печатает на стандартный вывод, а cron имеет тенденцию быть слишком болтливым, если ваши задания cron выдают результат. Мне нравится помещать все мои задачи cron в каталог с соответствующим именем, а затем создавать rake-задачу, которая оборачивает их, чтобы их было легко запускать вручную. Обидно, что rake делает это, потому что я действительно предпочел бы иметь возможность воспользоваться преимуществами зависимостей. В любом случае, вы просто указываете cron непосредственно на сценарии, а не запускаете их через cron.

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Yehuda Katz
Error: User Rate Limit Exceeded Yehuda Katz
5

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

В моем случае я использовалbackground_job а такжеdelayed_job, Сbackground_jobрабочий продолжал работать через cron, поэтому управление демоном отсутствовало. Сdelayed_jobЯ использую Heroku и позволяю им беспокоиться об этом.

С delayed_job вы можете передать столько аргументов, сколько необходимо вашему фоновому работнику.

Delayed::Job.enqueue(MyJob.new(param[:one], param[:two], param[:three])

Я не нашел хорошего решения для запуска вещей по расписанию, кроме использованияscript/runner через cron (я предпочитаю использоватьscript/runner над задачей Rake, потому что мне проще тестировать код).

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

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

Error: User Rate Limit Exceeded
0

легко тестируется, легко понимается и хорошо интегрируется со средой Rails. Затем просто выполните эти грабли с помощью задания cron с любым интервалом, который вам требуется (я используювсякий раз, когда управлять этими работами, потому что я немного неграмотный).

Похожие вопросы