Jruby on rails варианты планирования
Я использую JRuby 1.5.6 на Rails, чтобы создать приложение, которое будет периодически уходить и получать любые подкасты RSS, которые я подписал тоже.
Я выбрал JRuby прежде всего потому, что я знаком с Java, хочу использовать структуру Rails и, самое главное, я могу выполнять задачи "тяжелого подъема" на Java, когда Ruby не соответствует моим требованиям. До сих пор (и я все еще на ранней стадии развития) этот гибридный подход работает очень хорошо.
Теперь я нахожусь в точке, где мне необходимо реализовать планирование периодических и длительных задач для фонового процесса. Мои требования состоят в том, чтобы иметь систему планирования базы данных, которая в идеале хорошо документирована, в настоящее время поддерживается и очищается.
Моя проблема заключается в том, что после многих дней исследования подходящих решений для самоклеящихся упаковок я, похоже, оставил очень мало вариантов из-за моего использования JRuby.
Некоторые из драгоценных камней, которые я пробовал...
планировщик rufus
Используя это до того, как я доволен интерфейсом и документацией, однако отсутствует постоянство базы данных, следовательно, это прерывание транзакций для моих требований.
delayed_job
Моим идеальным решением будет delayed_job. Однако хорошая документация, поддерживаемая и поддерживаемая базами данных, ломается под JRuby из-за отключения ObjectSpace (однако мы можем исправить это путем повторного включения), но более смертельно зависимость от драгоценных камней демонов, которая бросает "вилку", является небезопасной и отключенной по умолчанию на JRuby "из-за ограничений в реализации JRuby.
На github есть вилка, которая не имеет зависимости от демонов, однако я не доволен переходом на вилку из основной ветки разработки, и мне по-прежнему остается проблема ObjectSpace, в которой я не уверен, поскольку к этому влиянию производительности.
кварц-JRuby
Пока существовали различные драгоценные камни на основе кварца, это последнее предложение - еще одна попытка предоставить гладкий рубиновый интерфейс. Существует, однако, минимальная документация, и я не уверен, что если это может быть поддержано базой базы данных, мое чувство кишки состоит в том, что это не так.
Проблема
Пока я выделил только 3 варианта, я знаю, что есть другие. Я, однако, не смог найти решение для отметки всех 3 блоков требований (документы, поддерживаемые, поддерживаемые базами данных).
Итак, вопросы...
Кто-нибудь еще был в этой ситуации и придумал решение?
Кому-нибудь удалось заставить delayed_job работать в любой форме?
Есть ли какие-то лучшие решения, которые я упустил и буду удовлетворять моим потребностям?
Ответы
Ответ 1
Мы используем delayed_job (collectidea/v1.8.4) под JRuby в производстве уже более года.
Мы не включили ObjectSpace, и мы не используем демона gem.
Создал простую задачу рейка
namespace :product do
desc "Start Delayed Job Worker"
task :dw => :environment do
Delayed::Worker.new.start
end
end
и демонзировать его в зависимости от ОС. В linux
nohup jruby -S rake product:dw > $log_dir/delayed_job_console.log 2>&1 &
Ответ 2
Я бы рекомендовал resque как систему очередей. Resque похож на DelayedJob, но, на мой взгляд, намного лучше. Это была разработанная в GitHub и используемая в качестве системы их очередей. Я также использую его в производстве почти год, и я был очень доволен этим.
У Resque определенно есть поддержка JRuby, и все, что вам нужно сделать, чтобы получать запланированные задания, имеет простой планировщик. Некоторые рекомендуют resque-scheduler, хотя мне нравится держать его простым и использовать clockwork, который имеет приятный DSL для написания простых задач, связанных с cron, для очереди планировщиков (см. workwork README). При этом вы можете просто планировать такие вещи:
every(1.hour, 'tasks.alert') { Resque.push(:cron, :class => 'TaskAlert', :args => []) }
Ответ 3
Отметьте https://github.com/kares/jruby-rack-worker
Это позволяет использовать решение delayed_job в среде jruby.
Продолжается работа.
На момент написания статьи, мой опыт заключается в том, что он отлично работает с одним работником.
Хотя у меня возникают трудности при запуске дополнительных рабочих.
Ответ 4
Я изначально задал этот вопрос в декабре '10 и с тех пор разработал решение, которое, как я думал, стоит опубликовать для других, чтобы ссылаться.
Как указывали другие, можно получить библиотеки, такие как delayed_job, работающие с JRuby, и для некоторых это может быть приемлемым решением. Я, однако, не хотел решения, требующего дополнительного процесса, и с учетом этого я разработал камень, который использует инфраструктуру Java Executor и интегрирует его с ActiveRecord.
Результат acts_as_executor, который позволяет приложению Rails 3.x взаимодействовать с исполнителями и задачами (которые будут выполняться в правильной Java thread) так же, как и любая другая модель ActiveRecord.
Недавно я перенял камень для выпуска кандидата 1. Посмотрите GitHub и Rubygems.
N.B. По умолчанию по умолчанию на странице RubyGems по-прежнему отображается бета-версия. Однако rc1 все еще является последним релизом.