使用 puma
可以更改线程数以同时处理多个请求。但是对于 Heroku,与 postgres 的数据库连接是有限的。
为了处理更多请求,我们可以增加 dyno 的数量,其中每个 dyno 默认有 0:16 个线程。在这种情况下,在负载下每个测功机可以与数据库建立 16 个连接。
使用 rails ActiveRecord
,我们可以使用此配置限制每个 rails worker 进程的数据库连接数:
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
,但准备好的语句存在问题。
我目前在 rails 4.0.0
上使用 puma 2.7.1
。
puma 中是否有一些事件 Hook ,我们可以在请求完成时像这样配置?
on_worker_boot do
ActiveSupport.on_load(:active_record) do
ActiveRecord::Base.establish_connection
end
end
最佳答案
如果你用MRI,尽量用puma的cluster mode。我建议设置 4 个 worker 。
puma -w 4
如果使用Jruby,需要指定近20个线程。但它不应超过允许的数据库连接数。
puma -t 20:20
更多信息:
关于ruby-on-rails - 处理完请求后杀死 puma 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22880767/