簡體   English   中英

Rails 數據庫連接池水合

[英]Rails DB Connection Pool Hydration

我正在開發一個響應時間 SLA 非常嚴格的 Rails 7 應用程序。 在正常運行時,我完全符合 SLA。 我痛苦地缺乏的地方是第一個請求。 我添加了一個初始化程序,它將加載 ActiveRecord 並確保我的所有數據庫模型都已加載。 它滋潤了一些各種 memory 緩存等。這讓我走了很遠。 我的第一次響應時間減少了大約 60%。 但是,我一直在試圖弄清楚有幾件事仍在減慢第一響應時間。

  1. 第一個 API 請求會檢查我是否需要進行 Rails 遷移。 我還沒有想出如何將此檢查移動到 init。
  2. 第一個 API 請求似乎正在使用新的數據庫池……而不是在初始階段使用的那個。 我已經嘗試完全補水池以防止 API 在 Rails 啟動時創建它們,但我還沒有弄清楚。

在初始化程序中,我可以這樣做:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM