Оптимизация загрузки Rails для сценариев обслуживания - PullRequest
0 голосов
/ 11 июля 2010

Я написал скрипт, который выполняет задачи по обслуживанию приложения rails. Скрипт использует класс, который использует модели, определенные в приложении. В качестве примера, скажем, приложение определяет модель User, а мой класс (используемый в скрипте) отправляет ему сообщения, например, User.find id.

Я ищу способы оптимизировать этот скрипт, потому что сейчас он должен загружать среду приложения: require '../config/environment'. Это занимает ~ 15 секунд.

Если бы скрипт не использовал кодовую базу приложения для своей работы, я мог бы заменить абстракции модели на сырой SQL. Но, к сожалению, я не могу этого сделать, потому что мне придется повторять код в сценарии, который уже присутствует в кодовой базе. Мало того, что это нарушит принцип DRY и потребует много работы, сценарий будет не очень удобен в обслуживании, если меняются методы модели, которые я использую.

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

Надеюсь, я достаточно ясно описал проблему. Спасибо.

1 Ответ

1 голос
/ 11 июля 2010

Не могли бы вы написать небольшого демона, который находится в read в канале (или с именем fifo, или в сокете домена unix, или, что более сложно, в порт tcp), который принимает «команды», которые будут выполняться на вашембаза данных?

#!/usr/bin/ruby

require '../config/environment'

while (true) do
  File.open("/tmp/fifo", "r") do |f|
    f.each_line do |line|
      case line     
        when "cleanup" then puts "clean!"
        when "publish" then puts "published!"
        else puts "invalid command, ignoring"
      end           
    end     
  end
end

Вы можете запустить это с помощью спецификатора @reboot vixie cron, или запустить его с помощью команд capistrano, или запустить его из сценариев init или init.Затем вы пишете свои правила capistrano (которые у вас есть сейчас), чтобы просто выводить команды в fifo:

Сначала,

mkfifo /tmp/fifo

В одном терминале:

$ ./env.rb

В другом терминале:

$ echo -n "cleanup" > /tmp/fifo
$ echo -n "publish" > /tmp/fifo
$ echo -n "go away" > /tmp/fifo

Вывод в первом терминале выглядит следующим образом:

clean!
published!
invalid command, ignoring

Вы можете сделать сопоставление дружественным (возможно, разрешить обычный echo, а не требоватьecho -n как мой пример) или недружелюбно, как вы хотите.И команды, которые запускаются, могут, конечно, вызывать файлы вашей модели для выполнения своей работы.

Пожалуйста, убедитесь, что вы выбрали хорошее место для fifo - / tmp /, вероятно, плохое место, так как многие дистрибутивыочистить его при перезагрузке.Также убедитесь, что вы правильно установили владельца и разрешения fifo (chown и chmod) для своего приложения - возможно, вы не захотите, чтобы флеш-плагин Firefox записывал в этот файл и управлял вашей базой данных.

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