簡體   English   中英

如何在可配置的超時內響應Rails請求

[英]How to respond a Rails request within a configurable timeout

我希望在沒有使用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

我想避免使用Timeout,因為它導致我的應用程序中出現許多錯誤,包括數據庫連接泄漏。 報告的其他一些問題: http//www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/

不要使用紅寶石。 問題是超時模塊將在執行代碼中的任何地方中止代碼,這將導致打開和懸空的套接字,連接和文件或更糟。 (如果您正在為每個作業啟動一個外部腳本或炮轟,這不是一個真正的問題,我猜,但在這些情況下只需使用unix / linux native io timeout)

這就是為什么ruby CI服務器從未起飛的原因(Jenkins是java)。 我設計了一個單獨的服務來處理你可以使用API​​ ping的運行作業; 然后,在您的視圖中,每隔幾秒鍾ping一次,以便他們可以看到持續更新。 在這種情況下,rails應用程序不需要在其中包含任何污染超時代碼。

編輯:因為您正在該塊中執行HTTP請求,只需使用http庫中內置的超時設置(例如https://github.com/lostisland/faraday

您可以使用gem "rack-timeout" https://github.com/heroku/rack-timeout來滿足您的要求。

# Gemfile

gem "rack-timeout"

# config/initializers/rack_timeout.rb
Rack::Timeout.timeout = 5  # seconds

希望這會幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM