Базы данных
Connection pooling: тест с выбором ответа
Шесть вопросов поперёк всего юнита. Каждый отражает решение, которое ты принимаешь в 02:14 под звон пейджера — не определение для заучивания, а компромисс, который надо взвесить, когда пул пуст, а cl_waiting растёт.
Убедись, что связываешь процессную модель Postgres, режимы PgBouncer, математику размера, hold-time как корневую причину exhaustion и выбор пулера — тот синтез, к которому вели семь уроков.
Команда держит 40 воркеров приложения, у каждого client pool max 20, против Postgres с max_connections = 100. Подключаются напрямую (без PgBouncer) и ловят 'FATAL: sorry, too many clients already'. Каков настоящий фикс?
Приложение на PgBouncer session mode переключается в transaction mode ради мультиплексирования. `SET search_path = 'app, public'`, выданный один раз при подключении, тихо перестаёт действовать. Почему и каков правильный фикс?
16-ядерный Postgres (NVMe, рабочий набор в RAM) за PgBouncer. Инженер ставит default_pool_size = 200, чтобы 'покрыть пиковую конкурентность', и p99 ухудшается. Каков оптимальный по throughput pool_size и почему?
В 02:14 PgBouncer показывает pool = 24, cl_waiting = 180, приложение отдаёт 503. pg_stat_activity показывает 19 backend в состоянии 'idle in transaction' с максимальным возрастом транзакции 8 минут. Утром пул был размечен верно. Что происходит?
Команда на PgBouncer 1.20 отключила prepared statements драйвера, чтобы избежать ошибок 'prepared statement does not exist' в transaction mode, потеряв ~20% throughput. В 2026 они хотят И мультиплексирование transaction mode, И prepared statements. Что это разблокирует?
Multi-tenant B2B SaaS: 10 000 баз-арендаторов, ~50 одновременных пользователей в каждой, serverless-функции с cold-start под нагрузкой. PgBouncer на одной ноде упирает одно ядро CPU, а cold-старты вызывают connection storm. Какая архитектура подходит?
Сквозная линия юнита — одна цепочка: Postgres форкает тяжёлый процесс на соединение, поэтому число backend должно держаться около (cores × 2) — что и обеспечивает пулер, мультиплексируя тысячи дешёвых клиентских соединений в transaction mode. Transaction mode стоит тебе session-state, заданного при подключении (SET, LISTEN, SQL PREPARE, session advisory locks), у каждого есть точная безопасная замена, а PgBouncer 1.21+ наконец делает prepared statements совместимыми. Когда пул пустеет, причина почти всегда hold-time — медленный запрос или внешний вызов внутри транзакции — а не размер; idle_in_transaction_session_timeout — бесплатная страховка. Тянись за пределы PgBouncer лишь когда измерил его однопоточный потолок или столкнулся с serverless/multi-tenant масштабом.