Jruby на рельсах варианты планирования - PullRequest
13 голосов
/ 08 декабря 2010

Я использую JRuby 1.5.6 на Rails, чтобы создать себе приложение, которое будет периодически уходить и получать любые RSS-подкасты, на которые я тоже подписан.

Я выбрал JRuby прежде всего потому, что я знаком с Java, хочу использовать инфраструктуру Rails и, что важнее всего, я могу выполнять «тяжелые» задачи в Java, когда Ruby не соответствует моим требованиям. До сих пор (и я все еще на ранних стадиях разработки) этот гибридный подход работал очень хорошо.

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

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

Некоторые из драгоценных камней, которые я пробовал ...

rufus scheduler

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

delayed_job

Мое идеальное решение - это delayed_job. Хорошая документация, все еще поддерживаемая и поддерживаемая базой данных, однако, ломается под JRuby из-за выключения ObjectSpace (однако мы можем исправить это путем повторного включения), но более пагубно зависимость от гема демонов, который выбрасывает вилку, небезопасна и отключена по умолчанию на JRuby "ошибка из-за ограничений в реализации JRuby.

На github есть разветвление, которое не зависит от демонов, однако я не рад переключиться на разветвление из основной ветки разработки, и у меня все еще остается проблема ObjectSpace, в которой я не уверен, так как к его влиянию на производительность.

кварц-JRuby

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

Проблема

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

Так что вопросы ...

Кто-нибудь еще был в этой ситуации и придумал решение?

Кому-нибудь удалось заставить delayed_job работать в любой форме?

Есть ли какие-нибудь лучшие решения, которые я упустил из виду и удовлетворит мои потребности?

Ответы [ 4 ]

4 голосов
/ 12 февраля 2011

Я бы рекомендовал resque в качестве системы очередей. Resque похож на DelayedJob, но на мой взгляд намного лучше. Он был разработан на GitHub и используется в качестве системы очередей . Я также использовал его в производстве почти год, и я был очень доволен этим.

Resque определенно имеет поддержку JRuby, и все, что вам нужно сделать, чтобы получить запланированные задания, - это простой планировщик. Некоторые рекомендуют resque-scheduler , хотя мне нравится быть простым и использовать clockwork , который имеет хороший DSL для написания простых задач, похожих на cron, для постановки в очередь планировщиков (см .: часовой механизм README ). При этом вы можете просто запланировать такие вещи:

every(1.hour, 'tasks.alert') { Resque.push(:cron, :class => 'TaskAlert', :args => []) }
4 голосов
/ 10 февраля 2011

Мы используем delayed_job (colleideidea / v1.8.4) под JRuby в производстве уже более года. Мы не включили ObjectSpace, а также не используем гем демонов.

Создано простое рейк-задание

  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 голосов
/ 19 апреля 2011

Чек https://github.com/kares/jruby-rack-worker Это позволяет решение delayed_job в среде jruby. Все еще работа в процессе. На момент написания статьи, мой опыт показывает, что он отлично работает с одним работником. Хотя у меня возникают трудности с побегом дополнительных работников.

1 голос
/ 09 сентября 2011

Первоначально я задал этот вопрос в декабре '10 и с тех пор разработал решение, которое, как я думал, стоило бы опубликовать, чтобы другие могли сослаться на него.

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

Результат - acts_as_executor который позволяет приложению Rails 3.x взаимодействовать с исполнителями и задачами (которые будут выполняться в соответствующем потоке Java) так же, как и с любой другой моделью ActiveRecord.

Недавно я переместил гем для выпуска кандидата1. Взгляните на GitHub и Rubygems .

NB. По умолчанию на странице RubyGems по-прежнему отображается бета2.Однако, rc1 все еще является последней версией.

...