为什么我们在Heroku上没有数据库连接?

时间:2015-10-14 12:34:47

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

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

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

Heroku东西:

  

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

     

Web dynos:2 Standard-2X

     

工作人员dynos:1 Standard-2X

heroku config:

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

Procfile:

...

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

database.yml中:

# 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

puma.rb:

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

sidekiq.yml:

onProxyResponseFailure

我们还有一些佣金任务,每10分钟启动一次,并在一两秒内完成。

当我们在sidekiq中进行大量的消息处理时,问题似乎发生了。我们做的事情如下:

  1. 从第三方网络服务获取文章标题
  2. 在单个交易中将每个标题插入数据库
  3. 在sidekiq中为每个标题创建一条消息(worker.perform_async)
  4. 处理每条消息,点击端点获取正文并更新正文(可能需要.5 - 3秒)
  5. 虽然第4号正在发生,但我们看到了连接问题。

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

    来源:

1 个答案:

答案 0 :(得分:5)

您在25个Sidekiq线程中共享5个DB连接。将DB_POOL设置为25或将Sidekiq的并发设置为5。