Возможно ли, чтобы один дочерний Unicorn обрабатывал очередь, а остальные обрабатывали веб-запросы на Heroku single Dyno? - PullRequest
5 голосов
/ 18 января 2012

Если у вас есть единорог, настроенный на одного динамо на Heroku, скажем, с 3 работниками.Возможно ли, чтобы 2 дочерних работника обрабатывали веб-запросы и 1 дочерний Unicorn выполнял фоновые задания, такие как очередь восстановления или запланированные задачи?

Или это просто не подходит?


Теперь все работает!

ОК, поэтому, используя приведенный ниже ответ, мне удалось получить его, чтобы он взял сигнал, но сначала потребовалось немного повозиться.Вот что у меня сработало.

Procfile

web: bundle exec unicorn_rails -p $PORT -c config/unicorn.rb

unicorn.rb

worker_processes 2
preload_app true
timeout 30

@resque_pid = nil

before_fork do |server, worker|
  @resque_pid ||= spawn("bundle exec rake environment resque:work QUEUE=*")
end

after_fork do |server, worker|
  ActiveRecord::Base.establish_connection
end

1 Ответ

1 голос
/ 18 января 2012

Это, конечно, возможно - прочитайте http://bugsplat.info/2011-11-27-concurrency-on-heroku-cedar.html. Я сам не пробовал, но скоро буду.По сути, у вас получится Unicorn.rb, который выглядит как

worker_processes 3
timeout 30

@resque_pid = nil

before_fork do |server, worker|
  @resque_pid ||= spawn("bundle exec rake " + \
  "resque:work QUEUES=scrape,geocode,distance,mailer")
end

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

...