有了puma
,可以更改线程数以同时处理多个请求。但是在 Heroku 的情况下,与 postgres 的数据库连接是有限的。
为了处理更多的请求,我们可以增加测功机的数量,其中每个测功机都有默认的0:16线程。在这种情况下,在负载下,每个测功机可以与数据库建立16个连接。
对于 rails ActiveRecord
我们可以使用以下配置限制每个 rails 工作进程的数据库连接数:
Rails.application.config.after_initialize do
ActiveRecord::Base.connection_pool.disconnect!
ActiveSupport.on_load(:active_record) do
config = ActiveRecord::Base.configurations[Rails.env]
config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
config['pool'] = ENV['DB_POOL'] || ENV['MAX_THREADS'] || 5
ActiveRecord::Base.establish_connection(config)
end
end
但是,对于数据库连接限制,如果测功机数量增加,则达到连接限制。
有没有办法像杀死线程一样,并在请求得到服务后立即关闭数据库连接?
我尝试使用pgbouncer
作为buildpack
但准备好的语句存在问题。
我目前正在使用puma 2.7.1
rails 4.0.0
.
当请求完成时,puma中是否有一些事件钩子可以像这样配置?
on_worker_boot do
ActiveSupport.on_load(:active_record) do
ActiveRecord::Base.establish_connection
end
end
MRI,请尝试使用美洲狮的集群模式。我建议设置 4 个工人。
puma -w 4
如果使用 Jruby,则需要指定近 20 个线程。但它不应超过允许的数据库连接数。
puma -t 20:20
更多信息:
https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#thread-safety
https://devcenter.heroku.com/articles/concurrency-and-database-connections#maximum-database-connections