Как закрыть SQL-соединения старых ревизий Cloud Run? - PullRequest
2 голосов
/ 10 октября 2019

Контекст

Я запускаю приложение SpringBoot в Cloud Run, которое подключается к базе данных postgres11 CloudSQL с помощью пула соединений Hikari. Я использую самый маленький экземпляр PSQL (1vcpu / 614mb / 25connection limit). Для настройки я использовал следующие ресурсы:

Подключение к облачному SQL из Cloud Run

Управление подключениями к базе данных

Проблема

После развертывания третьей ревизии я получаю следующую ошибку:

FATAL: remaining connection slots are reserved for non-replication superuser connections

Что я обнаружил

  • Размер пула подключений по умолчанию - 10, поэтому при третьем развертывании происходит сбой (30> 25).

  • При удалении старой ревизииколичество активных подключений, отображаемых в панели администрирования Cloud SQL, уменьшается на 10, и следующее развертывание завершается успешно.

Вопрос

Кажется, что старыйВерсии Cloud Run находятся в «холодном» состоянии, поддерживая свои пулы соединений. Есть ли способ закрыть эти соединения, не удаляя ревизии?

В разделе рекомендации говорится:

... мы рекомендуем использовать клиентскую библиотеку, которая поддерживает пулы соединений, которые автоматически восстанавливают разорванные клиентские соединения. "

Каков рекомендуемый способ управления пулами соединений в Cloud Run, учитывая, что старые версии каким-то образом могут поддерживать свои соединения?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 октября 2019

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

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

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

maximumPoolSize - это свойство контролирует максимальный размер, которыйдоступ к пулу разрешен, включая как незанятые, так и используемые соединения.

idleTimeout - это свойство контролирует максимальное время, в течение которого соединению разрешено сидеть в пуле бездействующим. Этот параметр применяется только в том случае, если для параметра minimalIdle задано значение меньше, чем MaximumPoolSize. Свободные соединения не будут удалены, когда пул достигнет минимального количества подключений.

Если вы установите для minimumIdle значение 0, ваше приложение все равно сможет одновременно использовать до maximumPoolSize соединений. Однако, если соединение в пуле не используется в течение idleTimeout секунд, оно будет закрыто. Если вы установите для idleTimeout что-то маленькое, например, 1 минуту, количество подключений, используемых вашим пулом, будет уменьшено до 0, когда он не используется.

Надеюсь, это поможет!

0 голосов
/ 10 октября 2019

Проблема здесь в том, что HikariCP не закрывает соединения при их открытии. Я не знаю много о Hikari, но нашел this , который объясняет, как соединения должны обрабатываться через Hikari. Я надеюсь, что это помогает!

...