Al usar Unicorn en Heroku. El aumento de escala tendrá problemas, ya que se puede acceder al dyno web recién escalado mediante una solicitud cuando aún está cargando la aplicación. Lo que principalmente resulta en un error de tiempo de espera.¿Precargo correctamente la aplicación en Heroku + Unicornio?
Hice un poco de lectura en http://codelevy.com/2010/02/09/getting-started-with-unicorn.html y https://github.com/blog/517-unicorn
Los dos artículos sugirió el uso de preload_app true
. Y un bloque after_fork
y before_fork
.
En Rails 3+, ¿aún se requiere el código en el before_block
? Leí en alguna parte, de lo contrario. ¿Alguien que haya experimentado la configuración antes y quisiera compartir?
¿Me falta algo más? ¿Precargo la aplicación correctamente?
# 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
Hola Neil. La solución es precargar la aplicación para evitar que las solicitudes entren hasta que el dyno (maestro de unicornios) cargue la aplicación por completo. Mi preocupación aquí es si necesito el código en el bloque 'before_fork'. –
Su before_fork no logrará nada. Como dije antes, el problema radica en el hecho de que la malla de enrutamiento de Heroku te enviará solicitudes antes de que tu Unicornio haya comenzado. Precargar la aplicación no resolverá esto. –
Si ese es el caso. ¿Cómo se pueden evitar los errores de tiempo de espera al hacer girar/escalar nuevas dininas web en Heroku? –