ruby-on-rails - 并发数据库连接 Heroku Unicorn rails app

标签 ruby-on-rails postgresql heroku unicorn heroku-postgres

我在 Heroku 上运行一个 Rails 应用程序。

我有一台测功机。我正在使用 Hobby Basic 数据库,每月 9 美元,连接限制为 20。

我的应用在 Unicorn 上运行。但是当进行多个数据库调用时,它仍然非常慢。

这是我的 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

本文讨论管理并发连接:https://devcenter.heroku.com/articles/concurrency-and-database-connections

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

最佳答案

当您使用有限的爱好计划时,假设数据库可能成为瓶颈是公平的。无论如何,您都可以进行一些优化来帮助改进连接池(如下面的代码)。然而,当这确实是瓶颈时,您会发现经常发生超时,而不仅仅是速度缓慢。为了更好地了解您的问题出在哪里,我建议接下来添加 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

关于ruby-on-rails - 并发数据库连接 Heroku Unicorn rails app,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22927207/

相关文章:

ruby-on-rails - rails 4 : Re-Migrating all Migrations to Schema

postgresql - 查询用于创建分组、聚合和筛选行集的非重复计数

database - 警告(org.hibernate.jdbc.JDBCContext :333) - afterTransactionCompletion() was never called

windows-7 - Windows Heroku 运行 rake db :migrate error "/usr/bin/env: ruby.exe: No such file or directory"

ruby-on-rails - 使用 Action Cable 将 Ruby on Rails 应用程序部署到 Heroku(Puma 端口监听)

java - 我可以在基于 Java 的 heroku 应用程序中使用 native 应用程序吗?

ruby-on-rails - 使用 Heroku Web 界面,如何将 PG 数据库从 Heroku 导出为 CSV 文件?

ruby-on-rails - Rails/Rspec : Testing delayed_job mails

jquery - 为什么 jQuery 的serializeArray 在它的文档没有显示任何参数的情况下却在 Rails 中获取参数?

sql - 过滤对 crosstab() 查询结果的意外影响