Как соединения с базой данных распределяются между потоками и потоками времени ожидания в Rails? - PullRequest
0 голосов
/ 24 февраля 2020

Я использую Rails 5 на Heroku. Иногда я получаю ActiveRecord :: ConnectionTimeoutError и имею в виду сценарий, но не знаю, как соединения распределяются между потоками Rails.

Мои max_connections на моем Postgresis 800, и когда эти ошибки происходят, я не даже близко к максимальному увеличению.

Вот то, что я думаю, что происходит, но не совсем уверен, так что, может быть, «обсуждение этого» может помочь.

У меня есть RAILS_MAX_THREADS = 5, и я использую Puma , Мой пул базы данных также равен 5. На psql я заметил, что есть 4 долго выполняющихся запроса, выполнение которых занимает более 7 минут (не учитывая проблему длины запроса для этого сценария.) 4 запроса, которые первоначально выдавали Heroku тайм-аут запросов (максимум 30 секунд), и кажется, что Rails удерживает эти 4 длительных соединения, и теперь у меня осталось только 1 соединение.

Поскольку в это время начинает поступать куча запросов, я начинаю получать ActiveRecord :: ConnectionTimeoutError b / c. Доступно 5 потоков, но подключения связаны с 4 из них. занят и жду ответа.

Возможен ли подобный сценарий, я на правильном пути? Как соединения базы данных распределяются между потоками и потоками / запросами с истекшим временем ожидания?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...