Пул создавался с дефолтом SQLAlchemy (5 + 10) и под нагрузкой выгребался за секунды. Теперь параметры заданы явно и вынесены в настройки: DB_POOL_SIZE=10, DB_MAX_OVERFLOW=10, DB_POOL_TIMEOUT=10. Таймаут снижен с дефолтных 30 секунд намеренно — пусть запрос падает быстро и показывает проблему, а не висит полминуты. Backend запускался одним процессом uvicorn: любой блокирующий вызов останавливал и параллельные запросы, и WS-чат всех участников. Добавлен UVICORN_WORKERS с дефолтом 2 — не по числу ядер, потому что на четырёхъядерном сервере ядра делятся с LiveKit, а медиа важнее API. Бюджет соединений считается на весь инстанс: каждый воркер держит свой пул, поэтому UVICORN_WORKERS × (DB_POOL_SIZE + DB_MAX_OVERFLOW) должно оставаться заметно ниже max_connections у Postgres. Многопроцессность безопасна: бутстрап настроек в lifespan идемпотентен (INSERT ... ON CONFLICT DO NOTHING), а WS-чат разносит сообщения через Redis pub/sub и состояния в памяти процесса не держит.
11 KiB
11 KiB