Ruby on rails ActiveRecord::与Heroku的ConnectionTimeoutError
我在Heroku中使用Sidekiq反复出现了一个Ruby on rails ActiveRecord::与Heroku的ConnectionTimeoutError,ruby-on-rails,postgresql,activerecord,heroku,sidekiq,Ruby On Rails,Postgresql,Activerecord,Heroku,Sidekiq,我在Heroku中使用Sidekiq反复出现了一个ActiveRecord::ConnectionTimeoutError。以下是全部错误: ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool within 5.000 seconds (waited 5.008 seconds); all pooled connections were in use 我在Sidekiq中使用1 d
ActiveRecord::ConnectionTimeoutError
。以下是全部错误:
ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool within 5.000 seconds (waited 5.008 seconds); all pooled connections were in use
- 我在Sidekiq中使用1 dyno,大小
,并发性Performance L
15
- 对于web服务器,我使用了
dyno,每个1
puma workers和2
线程,因此总数为(1*2*15=30)15
- 我的数据库池大小是
(我使用的是20
postgres,最多有120个连接)李>Standard-0
condig/sidekiq.yml
-condig/inititalizers/sidekiq.rb
-config/puma
-database.yml
本例中的问题是puma vs数据库配置,您的puma服务器将尝试生成30个线程,但为所有线程共享的数据库池的配置仅设置为20个连接(它忽略了您的数据库仅使用配置中的内容即可处理120个连接),因此10个puma线程将不断遇到该错误 Ref:这显示了活动记录如何在
work()
方法完成后正确释放连接。它描述了运动鞋的问题,但也可以用于Sidekiq,因为这是活动记录问题
def work(msg)
id = JSON.parse(msg)['id']
ActiveRecord::Base.connection_pool.with_connection do
user = User.find(id)
user.name="Homer Simpson"
user.save
end
ack!
end
Sidekiq.configure_client do |config|
config.client_middleware do |chain|
chain.add Sidekiq::Status::ClientMiddleware
end
end
Sidekiq.configure_server do |config|
config.redis = { url: ENV["REDISTOGO_URL"] } if ENV["REDISTOGO_URL"].present?
config.server_middleware do |chain|
chain.add Sidekiq::Status::ServerMiddleware, expiration: 30.minutes
end
config.client_middleware do |chain|
chain.add Sidekiq::Status::ClientMiddleware
end
end
Sidekiq.configure_client do |config|
config.redis = { url: ENV["REDISTOGO_URL"] } if ENV["REDISTOGO_URL"].present?
end
if Rails.env.production?
Sidekiq.configure_server do |config|
config.redis = { url: ENV["REDISTOGO_URL"] }
end
Sidekiq.configure_client do |config|
config.redis = { url: ENV["REDISTOGO_URL"] }
end
end
Sidekiq.default_worker_options = {
queue: "myapp",
backtrace: true,
retry: false
}
workers Integer(ENV["WEB_CONCURRENCY"] || 2)
threads_count = Integer(ENV["RAILS_MAX_THREADS"] || 15)
threads threads_count, threads_count
preload_app!
rackup DefaultRackup
port ENV["PORT"] || 3000
environment ENV["RACK_ENV"] || "development"
on_worker_boot do
ActiveRecord::Base.establish_connection
end
production:
pool: 20
def work(msg)
id = JSON.parse(msg)['id']
ActiveRecord::Base.connection_pool.with_connection do
user = User.find(id)
user.name="Homer Simpson"
user.save
end
ack!
end