[RUBY] Spécifiez le délai d'expiration pour chaque chemin avec Rack :: Timeout

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

Spécifiez le délai d'expiration pour chaque chemin avec Rack :: Timeout
Changez la cible d'injection pour chaque environnement avec Spring Boot 2
Modifiez la valeur du paramètre pour chaque environnement avec Digdag (RubyOnRails)
Balisage commun: modifiez le chemin de l'URL pour chaque action
Spécifiez la valeur par défaut avec @Builder of Lombok
Réécrivez le code de java.io.File avec java.nio.Path et java.nio.Files
Comment spécifier le chemin de la ressource dans l'importation HTML
Préparer l'environnement pour java11 et javaFx avec Ubuntu 18.4
Spécifiez VS Code comme éditeur par défaut pour jshell