diff --git a/backend/core/config.py b/backend/core/config.py index 48f96b6..d6c535a 100644 --- a/backend/core/config.py +++ b/backend/core/config.py @@ -38,6 +38,20 @@ class Settings(BaseSettings): # и показывает проблему, а не висит полминуты, делая вид, что всё живо. db_pool_timeout: int = 10 + # --- Пул соединений с Redis --- + # Считается по УЧАСТНИКАМ, а не по запросам: каждое WS-подключение комнаты + # (`api/chat.py`) держит собственное pub/sub-соединение всё время, пока + # человек сидит в конференции, — и берёт его из этого же пула, что и + # обычные команды. redis-py 8 поставил дефолт `max_connections=100` + # (раньше предел был условно бесконечным), поэтому сотый участник на + # воркер выгребал пул досуха и WS падал уже на `hgetall` очереди рук — + # воспроизведено локально при 99 одновременных подключениях. + # 500 — с запасом на инстанс, рассчитанный на пару сотен участников + # на воркер; соединения создаются по мере надобности, само по себе + # значение ничего не стоит. Потолок сверху — `maxclients` у Redis + # (дефолт 10000) на ВСЕ процессы вместе, включая Celery-воркеры. + redis_max_connections: int = 500 + # --- Версия инстанса (релиз v0.0.1) --- # install.sh копирует значение из файла `VERSION` (корень репозитория) в # `.env` при каждой установке/обновлении — здесь только чтение готового diff --git a/backend/core/redis.py b/backend/core/redis.py index c709fdc..bcd7a19 100644 --- a/backend/core/redis.py +++ b/backend/core/redis.py @@ -6,4 +6,11 @@ from core.config import get_settings settings = get_settings() -redis_client: Redis = Redis.from_url(settings.redis_url, decode_responses=True) +redis_client: Redis = Redis.from_url( + settings.redis_url, + decode_responses=True, + # Размер пула задаём явно: дефолт redis-py (100) рассчитан на команды, а у + # нас на нём же висят долгоживущие pub/sub-подписки комнаты — по одной на + # участника (см. `core/config.py`, `redis_max_connections`). + max_connections=settings.redis_max_connections, +)