Rack :: Améliorations du délai d'attente pour Rails
Ajoutez cette ligne au Gemfile de votre application :
gem "slowpoke"
Et exécutez :
rails generate slowpoke:install
Cela crée un public/503.html
que vous pouvez personnaliser.
Pour essayer des pages d'erreur personnalisées en développement, ajoutez temporairement à config/environments/development.rb
:
config . slowpoke . timeout = 1
config . consider_all_requests_local = false
Et ajoutez un appel sleep
à l'une de vos actions :
sleep ( 2 )
La page d'erreur personnalisée devrait apparaître.
Le délai d'expiration par défaut est de 15 secondes. Vous pouvez modifier cela dans config/environments/production.rb
avec :
config . slowpoke . timeout = 5
Pour les délais d'attente dynamiques, utilisez :
config . slowpoke . timeout = lambda do | env |
request = Rack :: Request . new ( env )
request . path . start_with? ( "/admin" ) ? 15 : 5
end
Abonnez-vous aux délais d'attente avec :
ActiveSupport :: Notifications . subscribe "timeout.slowpoke" do | name , start , finish , id , payload |
# report timeout
end
Pour en savoir plus, consultez la documentation Rack::Timeout.
Rack::Timeout peut déclencher une exception à tout moment dans le code, ce qui peut laisser votre application dans un état impur. Le moyen le plus sûr de récupérer après un délai d'attente d'une requête est de générer un nouveau processus. C'est le comportement par défaut de Slowpoke.
Pour les serveurs threadés comme Puma, cela signifie tuer tous les threads lorsque l'un d'entre eux expire. Cela peut avoir un impact significatif sur les performances.
Vous pouvez personnaliser ce comportement avec :
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
Remarque : Pour accéder env["action_dispatch.exception"]
en développement, ajoutez temporairement à config/environments/development.rb
:
config . consider_all_requests_local = false
C'est une bonne idée de définir un délai d'attente pour les instructions et un délai d'attente pour la connexion. Pour Postgres, votre config/database.yml
devrait inclure quelque chose comme :
production :
connect_timeout : 3 # sec
variables :
statement_timeout : 5s
Afficher le journal des modifications
Tout le monde est encouragé à contribuer à l’amélioration de ce projet. Voici quelques façons dont vous pouvez aider :
Pour commencer le développement :
git clone https://github.com/ankane/slowpoke.git
cd slowpoke
bundle install
bundle exec rake test