Rack::Peningkatan batas waktu untuk Rails
Tambahkan baris ini ke Gemfile aplikasi Anda:
gem "slowpoke"
Dan jalankan:
rails generate slowpoke:install
Ini menciptakan public/503.html
yang dapat Anda sesuaikan.
Untuk mencoba halaman kesalahan khusus dalam pengembangan, tambahkan sementara ke config/environments/development.rb
:
config . slowpoke . timeout = 1
config . consider_all_requests_local = false
Dan tambahkan panggilan sleep
ke salah satu tindakan Anda:
sleep ( 2 )
Halaman kesalahan khusus akan muncul.
Batas waktu default adalah 15 detik. Anda dapat mengubahnya di config/environments/production.rb
dengan:
config . slowpoke . timeout = 5
Untuk batas waktu dinamis, gunakan:
config . slowpoke . timeout = lambda do | env |
request = Rack :: Request . new ( env )
request . path . start_with? ( "/admin" ) ? 15 : 5
end
Berlangganan batas waktu dengan:
ActiveSupport :: Notifications . subscribe "timeout.slowpoke" do | name , start , finish , id , payload |
# report timeout
end
Untuk mempelajari lebih lanjut, lihat dokumentasi Rack::Timeout.
Rack::Timeout dapat memunculkan pengecualian pada titik mana pun dalam kode, yang dapat membuat aplikasi Anda dalam keadaan tidak bersih. Cara paling aman untuk pulih dari waktu tunggu permintaan adalah dengan menelurkan proses baru. Ini adalah perilaku default untuk Slowpoke.
Untuk server berulir seperti Puma, ini berarti mematikan semua utas ketika salah satu dari mereka kehabisan waktu. Hal ini dapat berdampak signifikan terhadap kinerja.
Anda dapat menyesuaikan perilaku ini dengan:
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
Catatan: Untuk mengakses env["action_dispatch.exception"]
dalam pengembangan, tambahkan sementara ke config/environments/development.rb
:
config . consider_all_requests_local = false
Merupakan ide bagus untuk menetapkan batas waktu pernyataan dan batas waktu koneksi. Untuk Postgres, config/database.yml
Anda harus menyertakan sesuatu seperti:
production :
connect_timeout : 3 # sec
variables :
statement_timeout : 5s
Lihat log perubahan
Setiap orang didorong untuk membantu meningkatkan proyek ini. Berikut beberapa cara Anda dapat membantu:
Untuk memulai pengembangan:
git clone https://github.com/ankane/slowpoke.git
cd slowpoke
bundle install
bundle exec rake test