Загрузка моделей Ruby on Rails без загрузки всей платформы - PullRequest
1 голос
/ 18 ноября 2009

Я хочу создать пользовательский демон, который будет выполнять различные задачи базы данных, такие как задержка почтовых сообщений и пользовательских уведомлений (каждое уведомление - это отдельная строка в таблице уведомлений). Я не хочу использовать script/runner или rake для выполнения этих задач, потому что вполне возможно, что некоторые задачи требуют только создания одной или двух строк базы данных или тысяч строк в зависимости от задачи. Я не хочу затрат на запуск процесса ruby ​​или загрузку всей структуры rails для каждой операции. Я планирую держать этого демона в памяти полный рабочий день.

Для создания этого демона я хотел бы использовать мои модели из моего приложения ruby ​​on rails. У меня есть несколько плагинов для рельсов, таких как acts_as_tree и AASM, которые мне понадобятся, если я буду использовать эти модели. Некоторые из плагинов, которые мне нужно загрузить, - это пользовательские хаки на ActiveRecord :: Base, которые я создал. (Я готов принять удаление или перекодирование некоторых плагинов, если им нужны компоненты из других частей рельсов.)

Мои вопросы

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

Если не очень хорошая идея

  • Что такое хорошая альтернатива?

(Я не склонен писать свои собственные запросы SQL, но мне нужно было бы добавить ограничения базы данных и отдельного пользователя для демона, чтобы предотвратить любые глупые аварии. Учитывая мое отсутствие знаний о настройке базы данных, я бы хотел используйте активную запись как костыль.)

Ответы [ 2 ]

0 голосов
/ 18 ноября 2009

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

То, что я бы предложил вместо этого, это либо бегать через бегун / консоль, как вы сказали, что вы не хотите, но вместо того, чтобы каждый раз запускать загрузку, попробуйте пакетировать вещи так, чтобы вы выполняли 1000 одновременно, а не 1. Там Есть много проектов, которые используют этот стиль, некоторые из массовых рассылок приходят на ум, если вы хотите примеры. DJ (delayed_job) делает то же самое, сохраняя немного в базе данных, говоря, что этот код должен быть запущен в какой-то момент в будущем, используя стек среды, но он пытается собрать как можно больше пакетов, чтобы вы могли получить от этого выигрыш.

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

Наконец, в качестве запоздалой мысли, это было бы очень полезно для Postgres.

0 голосов
/ 18 ноября 2009

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

Async_worker является хорошим примером такого шаблона: он использует beanstalk для передачи сообщений одному или нескольким рабочим процессам, каждый из которых является просто демоном, загрузившим полный стек рельсов.

Одна вещь, на которую вы должны обратить внимание при этом, это то, что вам нужно будет перезапустить ваши демонизированные процессы при развертывании, чтобы они могли перезагрузить ваш обновленный стек rails. Я использую это для приложения для сокращения URL (единственный асинхронный рабочий процесс, который я запускаю, бездействует в ожидании сохранения реферальных данных после перенаправления посетителя), и он работает хорошо, у меня просто есть задача after:deploy capistrano, которая перезапускается любой асинхронный работник (и).

...