7

我已经安装了 rack-timeout gem 并在初始化程序中创建了 rack_timeout.rb。我在 rack_timeout.rb 中设置了 Rack::Timeout.service_timeout = 1。我想限制 rack-timeout 以在其他控制器超时时停止执行比 api 中的控制器。只有 api 控制器的执行应该停止。我在 lib 中创建了一个名为 my_middleware.rb 的自定义中间件

 class MyMiddleware < Rack::Timeout
  def initialize(app, options = {})
    @app = app
    @exclude = options[:exclude]
  end

  def call(env)
    if env['PATH_INFO'].include? "api"
      super(env)
    else
      @app.call(env)
    end
  end
end

配置/开发.rb

config.middleware.use "MyMiddleware"

但它不起作用。发生超时时,任何地方的机架超时都会引发异常。

4

1 回答 1

2

非常有趣的问题。在执行请求之外的任何时候超时并不是一个很好的做法,但似乎没有其他现成的解决方案。

我继续 fork rack_timeout,并根据您的代码添加了基于请求路径的过滤。

基本上,它Rack::TimeoutSelect类扩展

class Select < Timeout
  def call(env)
    if exclude_or_any?(env) #checking for parameters passed on init
      super(env)
    else
      @app.call(env)
    end
  end
  ...
end

它使用原始的初始化方法并接受 2 个附加参数:

  • exclude: ["paths", "to", "exclude"]- 不要对来自包含提供的字符串的路径的请求运行超时。
  • only: ["only_timeout_this"]- 仅处理来自这些路径的请求。

我不建议定期使用它,因为最好将超时保持在您的请求中,但为了开发和简单性,它应该足够了。

回购中提供的更多信息:

于 2018-11-16T18:07:36.277 回答