杀死puma线程一旦请求已经处理rails

时间:2014-04-05 12:15:31

标签: ruby-on-rails postgresql heroku ruby-on-rails-4 puma

使用puma可以更改线程数以同时处理多个请求。但是对于Heroku,与postgres的数据库连接是有限的。

为了处理更多请求,我们可以增加dynos的数量,其中每个dyno默认情况下都会说0:16个线程。在加载的情况下,每个dyno可以与数据库建立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

但是,对于db连接限制,如果dynos数量增加,则连接限制将被命中。

有没有办法在请求被提供后立即杀死一个线程并关闭数据库连接?

我尝试使用pgbouncer作为buildpack,但准备好的陈述存在问题。

我目前正在rails 4.0.0使用puma 2.7.1

我们可以在请求完成时配置这样的事件挂钩吗?

on_worker_boot do
  ActiveSupport.on_load(:active_record) do
    ActiveRecord::Base.establish_connection
  end
end

1 个答案:

答案 0 :(得分:0)

如果您使用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