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