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

blu*_*blu 0 connection-pooling ruby-on-rails heroku sidekiq

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

ActiveRecord::ConnectionTimeoutError: could not obtain a database  
connection within 5.000 seconds (waited 5.000 seconds)
Run Code Online (Sandbox Code Playgroud)

Heroku的东西:

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

Web dynos:2 Standard-2X

工作人员dynos:1标准-2X

heroku配置:

MAX_THREADS: 5
(DB_POOL not set)
(WEB_CONCURRENCY not set)
Run Code Online (Sandbox Code Playgroud)

Procfile:

web: bundle exec puma -C config/puma.rb
worker: bundle exec sidekiq
Run Code Online (Sandbox Code Playgroud)

database.yml的:

...

production:
  url:  <%= ENV["DATABASE_URL"] %>
  pool: <%= ENV["DB_POOL"] || ENV['MAX_THREADS'] || 5 %>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

sidekiq.yml:

---
:concurrency: 25
:queues:
  - [default]
Run Code Online (Sandbox Code Playgroud)

我们还有一些耙子任务,每10分钟发射一次,并在一两秒内完成.

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

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

虽然第4号正在发生,但我们看到了连接问题.

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

资料来源:

Mik*_*ham 5

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