Rack::Timeout-Verbesserungen für Rails
Fügen Sie diese Zeile zur Gemfile Ihrer Anwendung hinzu:
gem "slowpoke"
Und laufe:
rails generate slowpoke:install
Dadurch wird eine public/503.html
erstellt, die Sie anpassen können.
Um benutzerdefinierte Fehlerseiten in der Entwicklung auszuprobieren, fügen Sie vorübergehend Folgendes zu config/environments/development.rb
hinzu:
config . slowpoke . timeout = 1
config . consider_all_requests_local = false
Und fügen Sie einer Ihrer Aktionen einen sleep
hinzu:
sleep ( 2 )
Die benutzerdefinierte Fehlerseite sollte angezeigt werden.
Das Standard-Timeout beträgt 15 Sekunden. Sie können dies in config/environments/production.rb
ändern mit:
config . slowpoke . timeout = 5
Für dynamische Zeitüberschreitungen verwenden Sie:
config . slowpoke . timeout = lambda do | env |
request = Rack :: Request . new ( env )
request . path . start_with? ( "/admin" ) ? 15 : 5
end
Abonnieren Sie Timeouts mit:
ActiveSupport :: Notifications . subscribe "timeout.slowpoke" do | name , start , finish , id , payload |
# report timeout
end
Weitere Informationen finden Sie in der Rack::Timeout-Dokumentation.
Rack::Timeout kann an jeder Stelle im Code eine Ausnahme auslösen, was dazu führen kann, dass Ihre App in einem unsauberen Zustand bleibt. Der sicherste Weg, eine Anforderungs-Zeitüberschreitung zu beheben, besteht darin, einen neuen Prozess zu starten. Dies ist das Standardverhalten für Slowpoke.
Für Threaded-Server wie Puma bedeutet dies, dass alle Threads beendet werden, wenn einer von ihnen das Zeitlimit überschreitet. Dies kann erhebliche Auswirkungen auf die Leistung haben.
Sie können dieses Verhalten anpassen mit:
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
Hinweis: Um in der Entwicklung auf env["action_dispatch.exception"]
zuzugreifen, fügen Sie vorübergehend Folgendes zu config/environments/development.rb
hinzu:
config . consider_all_requests_local = false
Es empfiehlt sich, ein Anweisungs-Timeout und ein Verbindungs-Timeout festzulegen. Für Postgres sollte Ihre config/database.yml
etwa Folgendes enthalten:
production :
connect_timeout : 3 # sec
variables :
statement_timeout : 5s
Sehen Sie sich das Änderungsprotokoll an
Jeder wird ermutigt, zur Verbesserung dieses Projekts beizutragen. Hier sind einige Möglichkeiten, wie Sie helfen können:
Um mit der Entwicklung zu beginnen:
git clone https://github.com/ankane/slowpoke.git
cd slowpoke
bundle install
bundle exec rake test