我们正在开发一个simple Rails 4 webapp,由Heroku主持免费计划。
最近,我们遇到了一些ActiveRecord::ConnectionTimeoutError
- 每隔几天一次 - 而且我们并不真正理解背后的原因。
您可能需要查看完整堆栈here。
我们知道Heroku设置了与Postgres数据库的20个连接的池限制,这很可能是抛出异常的原因。这是我们的猜测:
我们正在使用Herku调度程序每小时启动一次rake任务,并且由于该任务查询数据库,问题可能在于这些连接在使用后未从池中释放。所以我们试图将所有内容放在一个块中:
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
答案 0 :(得分:5)
根据我的经验,这些问题将出现在基本的Heroku计划中。有许多方法可以在不增加成本的情况下减轻频率。但是你永远不会在基本/爱好堆栈中出现0%。
这就是为什么在我的经历中...直到你击中'premium-yanari'你不会得到高可用性。您可以获得99.95%的预期正常运行时间,而免费的99.5%。 Doens听起来很多,但Heroku因为某种原因收取150美元的额外费用(与标准的yanari'计划相比)。
在所有具有连接池,收割频率和分叉的优化之后,如果您的进程无法访问数据库服务器,您将会超时。如果这是唯一的原因,它很少发生,这可能是你的情况。直到我升级到高级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