[英]Rails DB Connection Pool Hydration
我正在開發一個響應時間 SLA 非常嚴格的 Rails 7 應用程序。 在正常運行時,我完全符合 SLA。 我痛苦地缺乏的地方是第一個請求。 我添加了一個初始化程序,它將加載 ActiveRecord 並確保我的所有數據庫模型都已加載。 它滋潤了一些各種 memory 緩存等。這讓我走了很遠。 我的第一次響應時間減少了大約 60%。 但是,我一直在試圖弄清楚有幾件事仍在減慢第一響應時間。
在初始化程序中,我可以這樣做:
connections = []
ActiveRecord::Base.connection.pool.size.times do
connections << ActiveRecord::Base.connection.pool.checkout
end
connections.each { ActiveRecord::Base.connection.pool.checkin(_1) }
根據我的 PG 日志,這會打開連接,Rails 會執行所有這些鍵入查詢,設置 session 屬性等。但是,當我 go 觸發我的第一個 API 調用時,我的池是空的。
最后,最終成為普遍問題的是我需要通過正確的連接為泳池補水。 on_worker_boot
是因為這是在 puma 后面運行的。
on_worker_boot do
ActiveRecord::Base.connected_to(role: :reading) do
# spin up db connections
connections = []
(ActiveRecord::Base.connection.pool.size - 1).times do
connections << ActiveRecord::Base.connection.pool.checkout
end
connections.each { |x| ActiveRecord::Base.connection.pool.checkin(x) }
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.