ruby-on-rails - 处理完请求后杀死 puma 线程

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

使用 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

更多信息:

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

关于ruby-on-rails - 处理完请求后杀死 puma 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22880767/

相关文章:

sql - 自动生成一个 uuid 并使用它的一部分来更新单个 postgres 查询语句中的另一列

heroku - heroku 和 github 有什么区别

python - heroku 上的 Peewee 和 postgres,无法创建表

mysql - 在 SQL 中从联接表填充数据

ruby-on-rails - Heroku 安装 app sushi ,将数据库推送到 Heroku

ruby-on-rails - 使用 Rails 国际化静态页面

css - 使用 Spree 和 jQuery-Select2 为分组和平面列表项设置样式

ruby-on-rails - ruby rails : How can I get all sessions data from Redis on server side?

ruby-on-rails - 使用 activerecord-sqlserver-adapter 时出现 ArgumentError : wrong number of arguments (3 for 2) after upgrading to Rails 3. 1

java - 如何使用 QueryDSL 在 "like"值上加 1