slowpoke
1.0.0
Rack::Rails 的超时增强功能
将此行添加到应用程序的 Gemfile 中:
gem "slowpoke"
并运行:
rails generate slowpoke:install
这将创建一个您可以自定义的public/503.html
。
要在开发中尝试自定义错误页面,请临时添加到config/environments/development.rb
:
config . slowpoke . timeout = 1
config . consider_all_requests_local = false
并向您的其中一项操作添加sleep
调用:
sleep ( 2 )
应出现自定义错误页面。
默认超时为 15 秒。您可以在config/environments/production.rb
中更改此设置:
config . slowpoke . timeout = 5
对于动态超时,请使用:
config . slowpoke . timeout = lambda do | env |
request = Rack :: Request . new ( env )
request . path . start_with? ( "/admin" ) ? 15 : 5
end
订阅超时:
ActiveSupport :: Notifications . subscribe "timeout.slowpoke" do | name , start , finish , id , payload |
# report timeout
end
要了解更多信息,请参阅 Rack::Timeout 文档。
Rack::Timeout 可以在代码中的任何点引发异常,这可能会使您的应用程序处于不干净的状态。从请求超时中恢复的最安全方法是生成一个新进程。这是 Slowpoke 的默认行为。
对于像 Puma 这样的线程服务器,这意味着当其中任何一个线程超时时,将杀死所有线程。这会对性能产生重大影响。
您可以通过以下方式自定义此行为:
Slowpoke . on_timeout do | env |
next if Rails . env . development? || Rails . env . test?
exception = env [ "action_dispatch.exception" ]
if exception && exception . backtrace . first . include? ( "/active_record/" )
Slowpoke . kill
end
end
注意:要在开发中访问env["action_dispatch.exception"]
,请临时添加到config/environments/development.rb
:
config . consider_all_requests_local = false
设置语句超时和连接超时是个好主意。对于 Postgres,您的config/database.yml
应包含以下内容:
production :
connect_timeout : 3 # sec
variables :
statement_timeout : 5s
查看变更日志
鼓励每个人帮助改进这个项目。您可以通过以下几种方式提供帮助:
开始开发:
git clone https://github.com/ankane/slowpoke.git
cd slowpoke
bundle install
bundle exec rake test