Ruby on rails 并发数据库连接Heroku Unicorn rails应用程序

Ruby on rails 并发数据库连接Heroku Unicorn rails应用程序,ruby-on-rails,postgresql,heroku,unicorn,heroku-postgres,Ruby On Rails,Postgresql,Heroku,Unicorn,Heroku Postgres,我在Heroku上运行rails应用程序 我有一个dyno。我使用的是Hobby Basic数据库,每月9美元,连接限制为20 我的应用程序正在独角兽上运行。但在进行多个数据库调用时,速度仍然非常慢 这是我的unicorn.rb文件中的内容: # config/unicorn.rb worker_processes 3 timeout 30 preload_app true before_fork do |server, worker| Signal.trap 'TERM' do

我在Heroku上运行rails应用程序

我有一个dyno。我使用的是Hobby Basic数据库,每月9美元,连接限制为20

我的应用程序正在独角兽上运行。但在进行多个数据库调用时,速度仍然非常慢

这是我的unicorn.rb文件中的内容:

# config/unicorn.rb
worker_processes 3
timeout 30
preload_app true

before_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end
本文讨论如何管理并发连接:


但是,我还是很困惑。在我当前的设置中,如何同时允许多个数据库连接?我的数据库允许的最大连接数(20)?如果这里有人在Heroku上处理过rails应用程序的扩展问题,能为我指出正确的方向,我将不胜感激。

Heroku提供托管Postgres数据库。 不同的分层数据库具有不同的连接限制。 起始层“Dev”和“Basic”数据库限制为20个连接

和一个工作人员所需的连接。 如果您的工作人员超过20人,您可以使用连接池(如pgbouncer)解决问题。
如果您使用pgbouncer,您应该在您的环境中使用事务池模式,以便服务器可以在工作人员之间重用。

在您使用有限的业余爱好计划时,假设数据库可能成为瓶颈是公平的。不管怎样,您都可以进行一些优化来帮助改进连接池(如下面的代码)。然而,当这真的成为瓶颈时,您可能会发现超时经常发生,而不仅仅是缓慢。为了更好地了解问题所在,我建议接下来添加NewRelic插件

NewRelic Stark计划(推荐)或Wayne计划(在我看来有点太有限)是免费的,可以帮助您可视化应用程序的性能和跟踪错误。您可能会发现,dyno排队时间和内存消耗导致了您的速度变慢,有几种方法可以在不影响数据库连接的情况下进行改进。提高代码响应时间和限制数据库命中率(通过缓存)是值得研究的领域

话虽如此,我还是建议您向您提到的文章中描述的unicorn文件添加以下代码

after_fork do |server, worker|

  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to sent QUIT'
  end

  # other settings
  if defined?(ActiveRecord::Base)
    config = ActiveRecord::Base.configurations[Rails.env] ||
            Rails.application.config.database_configuration[Rails.env]
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
    config['pool']            =   ENV['DB_POOL'] || 2
    ActiveRecord::Base.establish_connection(config)
  end
end

在我看来,每个数据库连接需要一个“独角兽”工人。每个worker都有一个连接。当然,我从来没有使用过unicorn,这就是使用fork时出现的情况。我应该把它放在文件的哪个部分?在结尾?是的,只需在你的
before\u fork
块后附加到文件结尾对不起,我不清楚,我是替换当前的after\u fork块还是将其放在当前after\u fork块下?啊,没有prb,我编辑代码块以便你可以完全使用它,并替换旧的块谢谢!)