fix(redis): задать размер пула соединений явно
redis-py 8 поставил дефолт `max_connections=100`, а у нас на этом пуле висят не только команды, но и долгоживущие pub/sub-подписки комнаты — по одной на каждого участника, пока он в конференции. Сотый участник на воркер выгребал пул, и WS-хендшейк падал уже на `hgetall` очереди рук с `MaxConnectionsError`. Второй потолок того же рода, что и пул БД, только этажом ниже. Воспроизведён локально: при 99 одновременных WS вход переставал работать; с `redis_max_connections=500` те же 120 подключений проходят без единой ошибки. Соединения создаются по мере надобности, поэтому сам по себе поднятый лимит ничего не стоит.
This commit is contained in:
@@ -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` при каждой установке/обновлении — здесь только чтение готового
|
||||
|
||||
@@ -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,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user