Rack::Aprimoramentos de tempo limite para Rails
Adicione esta linha ao Gemfile da sua aplicação:
gem "slowpoke"
E corra:
rails generate slowpoke:install
Isso cria um public/503.html
que você pode personalizar.
Para testar páginas de erro personalizadas em desenvolvimento, adicione temporariamente a config/environments/development.rb
:
config . slowpoke . timeout = 1
config . consider_all_requests_local = false
E adicione uma chamada sleep
a uma de suas ações:
sleep ( 2 )
A página de erro personalizada deve aparecer.
O tempo limite padrão é de 15 segundos. Você pode alterar isso em config/environments/production.rb
com:
config . slowpoke . timeout = 5
Para tempos limite dinâmicos, use:
config . slowpoke . timeout = lambda do | env |
request = Rack :: Request . new ( env )
request . path . start_with? ( "/admin" ) ? 15 : 5
end
Assine os tempos limite com:
ActiveSupport :: Notifications . subscribe "timeout.slowpoke" do | name , start , finish , id , payload |
# report timeout
end
Para saber mais, consulte a documentação do Rack::Timeout.
Rack::Timeout pode gerar uma exceção em qualquer ponto do código, o que pode deixar seu aplicativo em um estado impuro. A maneira mais segura de se recuperar de um tempo limite de solicitação é gerar um novo processo. Este é o comportamento padrão do Slowpoke.
Para servidores encadeados como o Puma, isso significa eliminar todos os encadeamentos quando qualquer um deles atingir o tempo limite. Isso pode ter um impacto significativo no desempenho.
Você pode personalizar esse comportamento com:
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 acessar env["action_dispatch.exception"]
em desenvolvimento, adicione temporariamente a config/environments/development.rb
:
config . consider_all_requests_local = false
É uma boa ideia definir um tempo limite de instrução e um tempo limite de conexão. Para Postgres, seu config/database.yml
deve incluir algo como:
production :
connect_timeout : 3 # sec
variables :
statement_timeout : 5s
Veja o registro de alterações
Todos são incentivados a ajudar a melhorar este projeto. Aqui estão algumas maneiras de ajudar:
Para começar com o desenvolvimento:
git clone https://github.com/ankane/slowpoke.git
cd slowpoke
bundle install
bundle exec rake test