Короткий ответ
У управляемого инстанса БД есть предел числа одновременных подключений, зависящий от размера инстанса; при росте числа соединений приложения сверх этого предела новые подключения отклоняются независимо от загрузки CPU/памяти. Решение — снизить число открытых соединений через пул/прокси-пулер или увеличить лимит через больший класс инстанса.
Как это работает подробнее
каждое TCP-соединение к СУБД резервирует память и ресурсы на стороне сервера независимо от того, выполняется ли сейчас запрос; при горизонтальном масштабировании приложения суммарное число соединений может быстро превысить лимит, даже если каждый инстанс использует небольшой пул.
Пример кода
example.txt
DB max_connections: 200 (определяется классом инстанса)
App replicas: 20 × connection pool size 15 = 300 потенциальных подключений > 200Что использовать на практике
- Рекомендация. сначала смотрят метрику текущих подключений БД и сравнивают с максимальным лимитом; затем проверяют конфигурацию пула соединений в приложении (размер пула × число реплик) и либо уменьшают его, либо вводят внешний connection pooler, мультиплексирующий много клиентских соединений в меньшее число серверных.
- Проверка. после введения внешнего connection pooler число реальных серверных соединений к БД должно стабилизироваться существенно ниже лимита даже при дальнейшем горизонтальном масштабировании приложения.
Подводные камни
- Риск. реагировать на проблему только увеличением класса инстанса БД вместо настройки пулинга на уровне приложения
- Риск. задавать одинаковый размер пула на каждом инстансе приложения без учёта роста числа реплик при автоскейлинге
- Риск. не мониторить метрику числа соединений заранее, обнаруживая лимит только по ошибкам в проде.