Могу ли я отключить Ruby On Rails Database Connection Pooling при использовании PgBouncer? - PullRequest
0 голосов
/ 11 июля 2020

Могу ли я полностью отключить пул соединений Ruby on Rails?

И будет ли это нормально, учитывая, что PgBouncer уже обрабатывает пул соединений с базой данных?

1 Ответ

2 голосов
/ 14 июля 2020

Нет.

PgBouncer объявляет себя клиентам как сервер Postgres, а затем управляет подключениями к фактическому серверу Postgres. Нам не нужно вдаваться в подробности, кроме PgBouncer - с точки зрения Rails, экземпляр PgBouncer является сервером Postgres, поэтому давайте объясним, почему начинать именно с этого.

В Rails есть два основных фактора, которые следует учитывать для параллелизма: количество входящих клиентских запросов, которые могут быть отправлены его веб-серверу, и размер пула соединений для базы данных.

Если ваше соединение размер пула равен 1, тогда ваше приложение фактически является однопоточным: каждый раз, когда делается входящий клиентский запрос, который должен выполнить запрос к базе данных, этот запрос должен проверять соединение с базой данных из пула. Когда размер пула равен 1, а количество одновременных входящих запросов больше 1, каждый запрос после первого запроса должен быть приостановлен, пока первый запрос завершает свой запрос и возвращает соединение с пулом. Если выполнение первого запроса занимает много времени, то последующие запросы могут истекать по таймауту при ожидании доступного соединения из пула.

Итак, со стороны Rails вы хотите иметь пул соединений размером больше 1 чтобы разрешить параллелизм. Если вы установите его размер 1, то не имеет значения, как у вас настроен PgBouncer; Rails всегда будет устанавливать не более одного подключения к базе данных, и все потоки должны использовать это единственное соединение.

Подробнее о пулах подключений в Rails можно узнать по адресу ActiveRecord::ConnectionAdapters::ConnectionPool < Object.

...