Zuvor (bis zu Rails 5.2.3, Rack-Timeout 0.5.1), um die Timeout-Spezifikation für jeden Pfad mithilfe von [Rack-Timeout] zu ändern (https://github.com/sharpstone/rack-timeout) Wurde wie folgt angegeben (leicht vereinfacht).
Gemfile
gem 'rack-timeout', require: 'rack/timeout/base'
config/initializers/rack_timeout.rb
module Rack
class DynamicTimeout < Rack::Timeout
def call(env)
#URL ist/30 Sekunden, wenn Sie mit admin beginnen, andernfalls 10 Sekunden
@service_timeout = env['REQUEST_URI'].start_with?('/admin') ? 30 : 10
super(env)
end
end
end
timeout_params = {
service_timeout: 10,
wait_timeout: 5.minutes.to_i,
wait_overtime: 5.minutes.to_i,
service_past_wait: false,
}
Rails.application.config.middleware.insert_before Rack::Runtime, Rack::DynamicTimeout, timeout_params
Seit Rails 6 oder Rack-Timeout 0.6.0 war das Timeout jedoch kürzer als der dynamisch angegebene Wert von "service_timeout". Es war tatsächlich kürzer (10 Sekunden) als der Wert, der in das Protokoll ausgegeben wurde (30 Sekunden), wie unten gezeigt.
severity:ERROR message:source=rack-timeout id=0284947e-c24c-4024-a9ba-c542b3eb58f9 timeout=30000ms service=10000ms state=timed_out
Nach der Untersuchung der Ursache durch Vorbereitung verschiedener Protokolle scheint der "Aufruf" von "Rack :: Timeout" selbst getrennt vom "Aufruf" von "Rack :: DynamicTimeout" aufgerufen zu werden.
Der Einfachheit halber wurde die Methode "call" zweimal ausgeführt, zuerst mit "Rack :: DynamicTimeout", dann mit "Rack :: Timeout", und schließlich wurde der Timeout-Wert mit "Rack :: Timeout" angegeben. Der Wert wird verwendet.
Es schien einige Zeit zu dauern, um herauszufinden, wo es aufgerufen wurde und ob es geändert werden konnte. Deshalb entschied ich mich dieses Mal, einen Patch zu verwenden, der Rack :: Timeout
überschreibt.
Gemfile
gem 'rack-timeout'
config/initializers/rack_timeout.rb
module Rack
module DynamicTimeout
def call(env)
#URL ist/30 Sekunden, wenn Sie mit admin beginnen, andernfalls 10 Sekunden
@service_timeout = env['REQUEST_URI'].start_with?('/admin') ? 30 : 10
super(env)
end
end
end
Rack::Timeout.prepend Rack::DynamicTimeout
Aktiviert, um zu verarbeiten, selbst wenn "Aufruf" von "Rack :: Timeout" aufgerufen wird, indem das Modul mit "Modul # vorbereiten" eingefügt wird. Damit vorerst.
Recommended Posts