Mejoras en Rack::Timeout para Rails
Agregue esta línea al Gemfile de su aplicación:
gem "slowpoke"
Y ejecuta:
rails generate slowpoke:install
Esto crea un public/503.html
que puedes personalizar.
Para probar páginas de error personalizadas en desarrollo, agréguelas temporalmente a config/environments/development.rb
:
config . slowpoke . timeout = 1
config . consider_all_requests_local = false
Y agrega una llamada sleep
a una de tus acciones:
sleep ( 2 )
Debería aparecer la página de error personalizada.
El tiempo de espera predeterminado es de 15 segundos. Puedes cambiar esto en config/environments/production.rb
con:
config . slowpoke . timeout = 5
Para tiempos de espera dinámicos, utilice:
config . slowpoke . timeout = lambda do | env |
request = Rack :: Request . new ( env )
request . path . start_with? ( "/admin" ) ? 15 : 5
end
Suscríbete a los tiempos de espera con:
ActiveSupport :: Notifications . subscribe "timeout.slowpoke" do | name , start , finish , id , payload |
# report timeout
end
Para obtener más información, consulte la documentación de Rack::Timeout.
Rack::Timeout puede generar una excepción en cualquier punto del código, lo que puede dejar su aplicación en un estado sucio. La forma más segura de recuperarse del tiempo de espera de una solicitud es generar un nuevo proceso. Este es el comportamiento predeterminado de Slowpoke.
Para servidores con subprocesos como Puma, esto significa eliminar todos los subprocesos cuando alguno de ellos agota el tiempo de espera. Esto puede tener un impacto significativo en el rendimiento.
Puede personalizar este comportamiento con:
Slowpoke . on_timeout do | env |
next if Rails . env . development? || Rails . env . test?
exception = env [ "action_dispatch.exception" ]
if exception && exception . backtrace . first . include? ( "/active_record/" )
Slowpoke . kill
end
end
Nota: Para acceder a env["action_dispatch.exception"]
en desarrollo, agregue temporalmente a config/environments/development.rb
:
config . consider_all_requests_local = false
Es una buena idea establecer un tiempo de espera para la declaración y un tiempo de espera para la conexión. Para Postgres, su config/database.yml
debería incluir algo como:
production :
connect_timeout : 3 # sec
variables :
statement_timeout : 5s
Ver el registro de cambios
Se anima a todos a ayudar a mejorar este proyecto. A continuación se muestran algunas formas en las que puede ayudar:
Para comenzar con el desarrollo:
git clone https://github.com/ankane/slowpoke.git
cd slowpoke
bundle install
bundle exec rake test