Планирование задач для нескольких приложений Rails без загрузки нескольких сред - PullRequest
0 голосов
/ 26 сентября 2010

На наших серверах мы развернули несколько приложений Rails с помощью Phusion Passenger.Каждое приложение имеет набор задач, которые нужно планировать и периодически запускать (обычные очистить кеши, отправлять почту и т. Д.)

Все примеры, которые я видел в дикой природе, обычно показывают отдельный демон, который обрабатываетзапланированные задачи для приложения.Однако для этого требуется, чтобы демон загружал среду приложения.Хотя это работает, когда у вас развернуто одно или два приложения, оно не масштабируется, когда на сервере может быть развернуто 100 приложений.(Например, каждый «демон» загружает всю среду Rails плюс код приложения, размер которого может превышать 50 МБ. Разверните 100 приложений, и вы потратите 5 ГБ только в демонах планировщика.)

Имееткто-нибудь решил эту проблему?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2010

У меня была похожая проблема для решения.Я нашел следующие доступные решения:

  1. запуск задач, инициализированных Cron в новом процессе
    • минусов: время запуска для нового экземпляра
  2. запуск задачв долгоживущем демоне
    • минусы: демон, занимающий память
  3. запуск задач в потоке внутри существующего экземпляра
    • минусы: пассажир порождает X экземпляров, и это сложночтобы гарантировать, что будет запущен только 1 поток в 1 экземпляре.
    • cons: вызов чего-либо вне цикла запрос-ответ может привести к утечкам или нестабильности у пассажира.
  4. запускать задачиинициализируется HTTP-запросом к существующему экземпляру
    • pro: нет времени запуска, использует существующий экземпляр, обеспечивает однократное выполнение, безопасен для жизненного цикла passanger
    • cons: блокирует один экземпляр приложения на время выполнения задачи - этоможет не быть проблемой, если приложение является поточно-ориентированным, но нуждается в изучении, так как поточно-ориентированная безопасность - это совершенно новая вещь в Rails.

Наконец я решил перейти с option 4. Используя cron и curl (или wget), а также собственный CronController, доступный только для localhost.

0 голосов
/ 26 сентября 2010

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

Если вашим задачам не нужно много времени, вы можете сделать что-то вродеэто: использовать доступные методы (например, delayed_job ), но периодически запускать и останавливать демон (см. здесь для некоторых советов).Таким образом, вы можете запустить 10 демонов в 9 часов утра и остановить их в 10 часов утра. Затем вы можете запустить еще 10 демонов и так далее.Запуск и остановку можно выполнить с помощью cron или любого другого аналогичного инструмента.

Однако, если ваши задачи действительно просты и очень похожи в каждом приложении, вы можете просто написать свои сценарии для выполнения этой работы.Например, если «обычный очистить кэш» означает, что вы удаляете некоторые файлы из некоторых каталогов, просто поместите их в скрипт и периодически запускайте.Отправка электронной почты также может быть осуществлена ​​через скрипт (программа ruby).Получить данные из БД в рубине действительно легко.Таким образом, эта программа может периодически проверять что-то вроде mails_queue таблицы в базах данных и отправлять электронные письма.Если ваши приложения похожи, то достичь этого будет довольно просто.

Возможно, есть некоторые готовые решения для этого, но я не слышал о них.

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