Задать вопрос
@pup_pupets

Как совладать со множеством worker'ов и «could not obtain a database connection within 5.000 seconds»?

У меня около пары десятков worker'ов, которые чего-то там делают и их запускает Sidekiq. Планируется, что добавится ещё около 50 штук. Но вот беда, они все записывают в некую таблицу определенную информацию. Не просто так, а по делу. И иногда, а точнее часто случается "could not obtain a database connection within 5.000 seconds". Выставил уже pool = 10, всё равно мало. Делать по 1 пулу на каждый worker - говорят плохо. Но как тогда решить проблему?

Я так понимаю, что необходимо кидать все запросы в очереди или делать что-то вроде проверки, свободна ли БД и ждать когда освободится. Однако, знаний такого рода нет и не очень понимаю что конкретно копать.

Может кто-то подскажет, как решить вопрос оптимальным путём? Или как делают правильные пацаны?) Спасибо
  • Вопрос задан
  • 350 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
@pup_pupets Автор вопроса
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
sim3x
@sim3x
Правильные лузгают семки

Девопсы советуют настроить СУБД под свою нагрузку
Ответ написан
A_Modestov
@A_Modestov
1. Определяешь глобальную переменную, к примеру SIDEKIQ_CONCURRENCY в .env
2. Запускаешь sidekiq через rake задачу с указанием concurrency, примерно так:
namespace :sidekiq do
  desc "TODO"
  task start: :environment do
    exec "sidekiq -c #{ENV['SIDEKIQ_CONCURRENCY']}"
  end
end


3. В database.yml добавляешь:
pool: <%= ENV['SIDEKIQ_CONCURRENCY'].to_i + 5 %>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы