【问题标题】:Why are we out of database connections on Heroku?为什么我们在 Heroku 上没有数据库连接?
【发布时间】:2016-01-12 13:11:30
【问题描述】:

我们在 Heroku 上有一个带有 Sidekiq 的 Rails 应用程序,但数据库连接不足。

ActiveRecord::ConnectionTimeoutError: could not obtain a database  
connection within 5.000 seconds (waited 5.000 seconds)

Heroku 的东西:

数据库计划:Standard0(120 个连接)

Web dynos:2 标准 2X

工人测功机:1 Standard-2X

heroku 配置:

MAX_THREADS: 5
(DB_POOL not set)
(WEB_CONCURRENCY not set)

过程文件:

web: bundle exec puma -C config/puma.rb
worker: bundle exec sidekiq

数据库.yml:

...

production:
  url:  <%= ENV["DATABASE_URL"] %>
  pool: <%= ENV["DB_POOL"] || ENV['MAX_THREADS'] || 5 %>

puma.rb:

# https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#adding-puma-to-your-application

workers Integer(ENV['WEB_CONCURRENCY'] || 2)
threads_count = Integer(ENV['MAX_THREADS'] || 2)
threads threads_count, threads_count

preload_app!

rackup      DefaultRackup
port        ENV['PORT']     || 3000
environment ENV['RACK_ENV'] || 'development'

on_worker_boot do
  # Worker specific setup for Rails 4.1+
  # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot
  ActiveRecord::Base.establish_connection
end

sidekiq.yml:

---
:concurrency: 25
:queues:
  - [default]

我们还有几个每 10 分钟触发一次的 rake 任务,它们会在一两秒内完成。

问题似乎发生在我们在 sidekiq 中进行大量消息处理时。我们这样做:

  1. 从第三方网络服务获取文章标题
  2. 将每个标题插入到单个事务中的数据库中
  3. 在 sidekiq 中为每个标题创建一条消息 (worker.perform_async)
  4. 处理每条消息,到达端点以获取正文并更新正文(可能需要 0.5 - 3 秒)

当第 4 次发生时,我们看到了连接问题。

我的理解是,我们在上面的配置中远远低于连接限制,但是我们做错了什么吗?有什么东西只是在消耗游泳池吗?任何帮助都会很棒,谢谢。

来源:

【问题讨论】:

    标签: ruby-on-rails heroku connection-pooling sidekiq


    【解决方案1】:

    您在 25 个 Sidekiq 线程之间共享 5 个数据库连接。将 DB_POOL 设置为 25 或 Sidekiq 的并发设置为 5。

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 2016-10-31
      • 1970-01-01
      • 2013-12-03
      • 2016-06-27
      • 1970-01-01
      • 2015-07-24
      • 2012-09-14
      • 2016-09-29
      相关资源
      最近更新 更多