Thread Safe Resque Workers в JRuby при развертывании как WAR

В настоящее время мы используем Resque в JRuby и используем два способа запуска Worker при разработке.

  • Использование рейка:
QUEUE=* jruby -J-cp /path/to/library -S rake environment resque:work
  • Программно, инициализируется через приложение Sinatra Rack (или что-то еще), в конечном итоге вызывая класс с помощью:

def start
   @worker = Resque::Worker.new(@queues)
   @worker.verbose = @vervose
   @worker.work(@interval)
end

def stop
   @worker.try(:shutdown)
end

Хотя оба эти решения приемлемы для нас в разработке. Меня беспокоит, как это будет работать, например, при развертывании на Tomcat.

В Ruby обычно вы создаете или демонизируете рабочих, а затем используете инструмент мониторинга для наблюдения за pid.

Имеет ли смысл программно запускать Workers при развертывании? Мне интересно, запускает ли он новый поток в java или загромождает процесс jruby, если нет, следует ли мне использовать еще одну библиотеку планирования, такую ​​​​как кварц, для запуска рабочего? или задача rake, которая запускается при задаче развертывания?

Я мог бы создать модель Worker, а затем отслеживать рабочих в БД, но для меня это не имеет смысла.

Любая помощь или знания будут оценены.

Спасибо.

Ссылки:

https://github.com/defunkt/resque

http://rubydoc.info/github/defunkt/resque/master/Resque/

http://blog.thomasmango.com/post/636319317/resque-in-production

https://gist.github.com/486161


person Luis R.    schedule 28.04.2011    source источник


Ответы (2)


Использование rake resque:work загрузит вашу среду Rails и запустит одного рабочего, который опрашивает задание, разветвляется на (под) рабочий процесс, обрабатывает это задание и затем завершает работу.

Если вы хотите запустить несколько воркеров, используйте переменную COUNT:

QUEUE=* COUNT=5 jruby -J-cp /path/to/library -S rake environment resque:work

Какой аспект этого будет развернут в Tomcat? Это все командная строка.

person Cody Caughlan    schedule 12.07.2011
comment
Как бы вы заставили это работать, если бы ваше приложение JRuby/Rails было развернуто через файл WAR в Tomcat? Нужно ли мне развертывать 2 Tomcats, один для сервера rails и один для среды rake resque:work? Если да, то как? - person Jay Godse; 31.01.2012

С опозданием более чем на год, но я думаю, что ответ, который вы искали, заключается в том, чтобы запускать Resque worker вместе с вашим приложением в (собственных) потоках Java. Поскольку вы используете JRuby::Rack, ответ будет JRuby::Rack::Worker. . Добавьте это в свой web.xml :

<context-param>
  <param-name>jruby.worker</param-name>
  <param-value>resque</param-value>
</context-param>
<!--
<context-param>
  <param-name>QUEUES</param-name>
  <param-value>mails,posts</param-value>
</context-param>-->

<listener>
  <listener-class>org.kares.jruby.rack.WorkerContextListener</listener-class>
</listener>

Если вам интересно, есть образец web.xml.erb https://github.com/kares/jruby-rack-worker просто создайте файл config/web.xml.erb и скопируйте в него содержимое... Если вы используете Trinidad, есть расширение, созданное поверх него (поэтому вам не нужно настраивать web.xml и копировать файл . jar-файл).

person kares    schedule 31.10.2012