Auparavant (jusqu'aux rails 5.2.3, rack-timeout 0.5.1) pour utiliser rack-timeout et modifier la spécification de délai d'expiration pour chaque chemin A été spécifié comme suit (légèrement simplifié).
Gemfile
gem 'rack-timeout', require: 'rack/timeout/base'
config/initializers/rack_timeout.rb
module Rack
class DynamicTimeout < Rack::Timeout
def call(env)
#L'URL est/30 secondes si vous commencez par admin, 10 secondes sinon
@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
Cependant, depuis Rails 6 ou rack-timeout 0.6.0, le timeout a été plus court que la valeur spécifiée dynamiquement de service_timeout
.
Elle était en fait plus courte (10 secondes) que la valeur sortie dans le journal (30 secondes) comme indiqué ci-dessous.
severity:ERROR message:source=rack-timeout id=0284947e-c24c-4024-a9ba-c542b3eb58f9 timeout=30000ms service=10000ms state=timed_out
Après avoir enquêté sur la cause en préparant divers journaux, il semble que «l'appel» de «Rack :: Timeout» lui-même soit appelé séparément de «l'appel» de «Rack :: DynamicTimeout».
Pour plus de commodité, la méthode call
a été exécutée deux fois, d'abord avec Rack :: DynamicTimeout
, puis avec Rack :: Timeout
, et enfin la valeur de timeout a été spécifiée avec Rack :: Timeout
. La valeur est utilisée.
Il me semblait que cela prendrait un certain temps pour savoir où il était appelé et s'il pouvait être changé, donc cette fois j'ai décidé d'utiliser un patch qui écrase Rack :: Timeout
.
Gemfile
gem 'rack-timeout'
config/initializers/rack_timeout.rb
module Rack
module DynamicTimeout
def call(env)
#L'URL est/30 secondes si vous commencez par admin, 10 secondes sinon
@service_timeout = env['REQUEST_URI'].start_with?('/admin') ? 30 : 10
super(env)
end
end
end
Rack::Timeout.prepend Rack::DynamicTimeout
Activé pour gérer même si call
of Rack :: Timeout
est appelé en insérant le module avec Module # prepare
.
Avec cela pour le moment.
Recommended Posts