Как совладать со множеством 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 - говорят плохо. Но как тогда решить проблему?
Я так понимаю, что необходимо кидать все запросы в очереди или делать что-то вроде проверки, свободна ли БД и ждать когда освободится. Однако, знаний такого рода нет и не очень понимаю что конкретно копать.
Может кто-то подскажет, как решить вопрос оптимальным путём? Или как делают правильные пацаны?) Спасибо
sim3x: Да смотрел я чего говорят на stackoverflow и прочих. В основном всё сводилось к увеличению пула или "ну херовая у вас архитектура - переделывайте". Ага. Спасибо. Я бы и рад, и возможно даже смогу, но как это делается по уму - не знаю. Но все такие умные, что держат эти знания в тайне. Наверное ещё тайное сообщество есть)))
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 %>