[RUBY] Geben Sie das Zeitlimit für jeden Pfad mit Rack :: Timeout an

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

Geben Sie das Zeitlimit für jeden Pfad mit Rack :: Timeout an
Ändern Sie das Injektionsziel für jede Umgebung mit Spring Boot 2
Ändern Sie den Einstellungswert für jede Umgebung mit Digdag (RubyOnRails).
Allgemeines Markup: Ändern Sie den URL-Pfad für jede Aktion
Geben Sie den Standardwert mit @Builder of Lombok an
Schreiben Sie den Code für java.io.File mit java.nio.Path und java.nio.Files neu
So geben Sie den Ressourcenpfad beim HTML-Import an
Bereiten Sie die Umgebung für Java11 und JavaFx mit Ubuntu 18.4 vor
Geben Sie VS Code als Standardeditor für jshell an