我在Sidekiq的后臺作業中得到一個ActiveRecord::ConnectionTimeoutError: could not obtain a connection from a pool例外
我有一個 PUMA Web 行程和一個 SIDEKIQ 行程在 Heroku 上運行(2 個愛好 dynos)[一個有后臺作業的 Rails 應用程式]
在database.yml中我有pool。40(在default和production中)
在sidekiq.yml中我有:concurrency: 7
在puma.rb中,我有max_threads_count = ENV.fetch("PUMA_MAX_THREADS") { 5 }并且已經設定ENV["PUMA_MAX_THREADS"] = 5
我使用的是Heroku的pgsql hobby實體,它允許有20個連接
預期行為
當 7 個 Sidekiq 作業者忙于運行作業時,他們應該有足夠的可用 db 連接。
原因是:
需要的資料庫連接
需要的資料庫連接:
需要的資料庫連接?
- 5個用于5個PUMA執行緒 12:[7 5]用于SIDEKIQ執行緒(7個作業者 5個Redis? - 不確定這背后的原因)
需要的db連接:
需要的db連接:
實際行為
當7個Sidekiq作業者忙于運行作業時,2個作業失敗并引發ConnectionTimeOutError(總是2個作業,所以實際最大并發量是5)
我注意到的細節(可能會有幫助):
在SIDEKIQ儀表盤中,Redis連接數達到最大10(從未更高)[我猜是5個執行緒 5]
在Heroku db中,當排隊等待大量作業時,連接數總是比可用的20個低得多(所以pgsql實體沒有問題)
在SIDE中,我們可以看到有很多人都在使用這個軟體。
如果有任何幫助或建議,我們將不勝感激:))
預先感謝!
更新:添加我的database.yml檔案
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("DB_POOL"/span>) { 10 } %>
開發:
<<: *default
資料庫: tracker_app_development
測驗:
<<: *default
資料庫: tracker_app_test
生產:
url: <%= ENV['DATABASE_URL'] %>
pool: <%= ENV.fetch("DB_POOL"/span>) { 10 } %>
web: DB_POOL=$PUMA_MAX_THREADS bundle exec puma -C config/puma.rb
工人。DB_POOL=14 bundle exec sidekiq -C config/sidekiq.yml
release: rake db:migrate
uj5u.com熱心網友回復:
這個例外是從Rails中的ActiveRecord::ConnectionAdapters::ConnectionPool::Queue類中引發的,特別是在該類的poll方法中,它接受一個超時時間(默認為5s)。這就是錯誤是如何被提出的:
if elapsed >= timeout
msg = "無法在%0.3f秒內從池中獲得一個連接(等待了%0.3f秒);所有池中的連接都在使用中" %。
[timeout, elapsed]
raise ConnectionTimeoutError, msg
結束
我認為這是說,如果它試圖獲取一個連接后所經過的時間大于所提供的超時(默認為5s),那么它將引發這個例外。出現這種情況是因為池子里的可用連接數是10,而你在Sidekiq中提到14是默認的池子大小。試著將您的Web dyno的池大小增加到大于或等于Sidekiq dyno中指定的默認池連接數。希望這能解決這個例外。
如果這不起作用,那么您可以嘗試將checkout_timeout從5s增加到更長的時間,比如:
default: & default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("DB_POOL"/span>) { 10 } %>
checkout_timeout: 10
開發:
<<: *default
資料庫: tracker_app_development
測驗:
<<: *default
資料庫: tracker_app_test
生產:
url: <%= ENV['DATABASE_URL'] %>
pool: <%= ENV.fetch("DB_POOL"/span>) { 10 } %>
這就是Rails的API檔案中關于ConnectionPools的內容。
https://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html
uj5u.com熱心網友回復:
找到了解決方案:
在我的database.yml檔案中,production配置有1個縮進,而它應該是0。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/307023.html
標籤:
