如何在可配置的超时内响应Rails请求

bar*_*olo 9 ruby timeout ruby-on-rails thread-safety

我希望在没有使用Timeout模块的情况下在控制器的操作中实现以下行为:

class AdminController < ApplicationController
  def example
    Timeout.timeout(params[:timeout].to_i) do
      ... # try to process the request within params[:timeout] seconds
    end
  rescue Timeout::Error
    render nothing: true, status: :gateway_timeout
  end
end
Run Code Online (Sandbox Code Playgroud)

我想避免使用Timeout,因为它导致我的应用程序中出现许多错误,包括数据库连接泄漏.报告的其他一些问题:http: //www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/

cou*_*nay 4

不要为此使用红宝石。问题是超时模块会在执行代码中的任何地方中止代码,这将导致打开和悬空的套接字、连接和文件或更糟的情况。(我猜,如果您启动外部脚本或为每项工作付出代价,这并不是真正的问题,但在这些情况下,只需使用 unix/linux 本机 io 超时)

这几乎就是为什么 ruby​​ CI 服务器从未流行起来的原因(Jenkins 是 java)。我会用一个单独的服务来设计它,该服务可以处理正在运行的作业,您可以使用 API 进行 ping 操作;然后,在您看来,每隔几秒钟就对其进行 ping 操作,以便他们可以看到持续的更新。在这种情况下,rails 应用程序不需要包含任何污染超时代码。

编辑:由于您在该块中执行 HTTP 请求,因此只需使用 http 库中内置的超时设置(例如https://github.com/lostisland/faraday