Не удается получить соединение с базой данных в течение 5 секунд - работники Sidekiq, Unicorn, Redis ToGo на Heroku

У меня есть куча фоновых задач (работники Sidekiq), которые обновляют базу данных, и я продолжаю получать это исключение из-за сбоя потока.

Heroku Log: WARN: could not obtain a database connection within 5.000 seconds (waited 5.001 seconds)
  • Heroku
  • Heroku Postgres:: Olive - ограничение в 20 соединений.
  • Redis ToGo - 10 подключений.
  • Sidekiq - 2 соединения.

Каждый запрос клиента создает ~50 потоков - в итоге ~20 потоков пытается обновить базу данных. Теперь я знаю, что это слишком много потоков, пытающихся установить соединение (обновление Active:Record..). Я не против, чтобы они снова попробовали, пока не добьются успеха.

-config / unicorn.rb

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 30
preload_app true

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  if defined?(ActiveRecord::Base)
      ActiveRecord::Base.connection.disconnect!
  end
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  if defined?(ActiveRecord::Base)
      config = ActiveRecord::Base.configurations[Rails.env] ||
          Rails.application.config.database_configuration[Rails.env]
      config['pool']            =   ENV['DB_POOL'] || 2
      config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10 # seconds
      ActiveRecord::Base.establish_connection(config)
  end
end

-config / инициализаторы / sidekiq.rb

require 'sidekiq'
  Sidekiq.configure_server do |config|
    if(database_url = ENV['DATABASE_URL'])
        p pool_size = Sidekiq.options[:concurrency] + 2
        p ENV['DATABASE_URL'] = "#{database_url}?pool=#{pool_size}"
        ActiveRecord::Base.establish_connection
    end
end

--condig / sidekiq.yml

:concurrency: 2

Большое спасибо за помощь, Эльдар

0 ответов

Другие вопросы по тегам