【问题标题】:Kill puma thread once request has been handled rails一旦请求被处理就杀死 puma 线程 rails
【发布时间】:2014-05-17 19:52:00
【问题描述】:

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

为了处理更多请求,我们可以增加 dyno 的数量,其中每个 dyno 可以说默认为 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

但是,由于 db 连接限制,如果 dyno 的数量增加,连接限制就会受到影响。

有没有什么方法可以杀死一个线程并在请求完成后立即关闭数据库连接?

我尝试将pgbouncer 用作buildpack,但准备好的语句存在问题。

我目前在rails 4.0.0 使用puma 2.7.1。

puma 中是否有一些事件挂钩,我们可以在请求完成时进行这样的配置?

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

【问题讨论】:

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


    【解决方案1】:

    如果您使用 MRI,请尝试使用 puma 的集群模式。我建议设置 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 2021-05-21
      相关资源
      最近更新 更多