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