ruby-on-rails - rails 4 : ConnectionTimeoutError on heroku basic plan

标签 ruby-on-rails postgresql heroku

我们正在研究 simple Rails 4 webapp ,由 Heroku 以免费计划托管。

最近,我们遇到了一些 ActiveRecord::ConnectionTimeoutError - 每隔几天一次 - 我们并不真正了解其背后的原因。

您可能想查看完整堆栈 here .

我们知道 Heroku 设置了 20 个连接到 Postgres 数据库的池限制,这很可能是抛出异常的原因。这是我们的猜测:

我们正在使用 Herku 调度程序每小时启动一个 rake 任务,由于该任务查询数据库,问题可能在于这些连接在使用后没有从池中释放。所以我们试图把所有东西都放在一个 block 中:

ActiveRecord::Base.connection_pool.with_connection do

  #code with queries

end

但这似乎并不能解决问题。您有更好的建议/解释吗?

非常感谢任何帮助和/或见解,以及我们应该如何调试此问题。


PS:我们也尝试过在专用的初始化器中加入如下代码,但并没有解决问题

Rails.application.config.after_initialize do
  ActiveRecord::Base.connection_pool.disconnect!

  ActiveSupport.on_load(:active_record) do
    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']      || 20
    ActiveRecord::Base.establish_connection(config)
  end
end

最佳答案

根据我的经验,这些问题会出现在基本的 Heroku 计划中。有多种方法可以在不增加成本的情况下降低频率。但是你永远不会用基本/爱好堆栈达到 0% 的发生率。

根据我的经验,这就是为什么……在您点击“premium-yanari”之前,您不会获得高可用性。与免费的 99.5% 相比,您可以获得 99.95% 的预期正常运行时间。听起来不多,但 Heroku 出于某种原因额外收取 150 美元(与“标准-yanari”计划相比)。

在对连接池、收割频率和 fork 进行所有优化之后,如果您的进程无法到达数据库服务器,您将超时。如果这是唯一的原因,则这种情况很少发生,这可能就是您的情况。直到我升级到“premium-yanari”后,这种看似随机的超时才停止发生。

我并不是建议您开始支付 200 美元/月作为解决方案。您可以通过以下一些建议接近零。调整并发性、数据库连接和尝试各种选项(如超时)需要一些线索和错误——因为似乎没有即插即用的公式可以为您提供所有这些参数的完美组合。

1) 迁移到 Unicorn 以更好地控制您的流程和数据库连接。这是一个示例 unicorn.rb 文件 https://gist.github.com/blotto/8005531b9c94f3732240

2) 增加超时时间(目前为 5 秒)。参见 unicorn .rb:

 timeout ENV['REQUEST_TIMEOUT'].to_i > 0 ?  ENV['REQUEST_TIMEOUT'].to_i : 15

3) 确保您使用的是最新的稳定版 Rails 4.1.1。因为 4.0.x 确实有一些 Postgres 适配器问题。参见 https://github.com/rails/rails/issues/12867

关于ruby-on-rails - rails 4 : ConnectionTimeoutError on heroku basic plan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24067676/

相关文章:

ruby-on-rails - 使 Redis 服务器在 Digital Ocean 上安全

ruby-on-rails - 在Rails中记录默认路由的使用

mysql - Heroku - 错误的 MySQL 查询(ActiveRecord)?

postgresql - 错误 : The relation doesn't exist (create table)

ruby-on-rails - Heroku 上 SSL 的子域

ruby-on-rails - 通过异步设置键值对改进 Rails.cache.write

ruby-on-rails - 如何在 Rails 中加载 UrlHelper 和路由?

ruby-on-rails - 可以安全地覆盖 ActiveRecord 中的保存方法吗?

sql - 如何将 SQL 数据从一个 View 转换为 Postgres 中的另一个 View

java - Heroku 应用程序在本地运行但远程崩溃