Podczas korzystania z Unicorn na Heroku. Skalowanie, będzie miało problemy, ponieważ nowe skalowalne dyna internetowe mogą być dostępne przez żądanie, gdy wciąż ładuje aplikację. Co zwykle powoduje błąd limitu czasu.Czy poprawnie ładuję aplikację w Heroku + Unicorn?
Zrobiłem trochę czytania w http://codelevy.com/2010/02/09/getting-started-with-unicorn.html i https://github.com/blog/517-unicorn
dwóch artykułów zasugerował użycie preload_app true
. I blok after_fork
i before_fork
.
W Railsach 3+, czy kod w before_block
jest nadal wymagany? Czytałem gdzieś, w przeciwnym razie. Ktoś, kto doświadczył już wcześniej tego ustawienia i chciałby się z nami podzielić?
Czy brakuje mi czegoś jeszcze? Czy poprawnie ładuję aplikację?
# config/initializers/unicorn.rb
# Read from:
# http://michaelvanrooijen.com/articles/2011/06/01-more-concurrency-on-a-single-heroku-dyno-with-the-new-celadon-cedar-stack/
worker_processes 3 # amount of unicorn workers to spin up
timeout 30 # restarts workers that hang for 90 seconds
# Noted from http://codelevy.com/2010/02/09/getting-started-with-unicorn.html
# and https://github.com/blog/517-unicorn
preload_app true
after_fork do |server, worker|
ActiveRecord::Base.establish_connection
end
before_fork do |server, worker|
##
# When sent a USR2, Unicorn will suffix its pidfile with .oldbin and
# immediately start loading up a new version of itself (loaded with a new
# version of our app). When this new Unicorn is completely loaded
# it will begin spawning workers. The first worker spawned will check to
# see if an .oldbin pidfile exists. If so, this means we've just booted up
# a new Unicorn and need to tell the old one that it can now die. To do so
# we send it a QUIT.
#
# Using this method we get 0 downtime deploys.
old_pid = Rails.root + '/tmp/pids/unicorn.pid.oldbin'
if File.exists?(old_pid) && server.pid != old_pid
begin
Process.kill("QUIT", File.read(old_pid).to_i)
rescue Errno::ENOENT, Errno::ESRCH
# someone else did our job for us
end
end
end
Cześć Neil. Rozwiązaniem jest wstępne załadowanie aplikacji, aby zapobiec przychodzeniu żądań, dopóki dyno (mistrz jednorożca) nie załaduje aplikacji w pełni. Moje obawy tutaj jest, czy potrzebuję kod w bloku 'before_fork'? –
Twoja before_fork nic nie da. Jak już wcześniej wspomniałem, problem polega na tym, że sieć rutowania Heroku będzie wysyłać ci prośby, zanim Twój jednorożec się zacznie. Wstępne załadowanie aplikacji nie rozwiąże problemu. –
Jeśli tak jest. W jaki sposób uniknąć błędów limitu czasu podczas obracania/skalowania nowych dynamo internetowych na Heroku? –