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
|
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) ---
|
# --- Версия инстанса (релиз v0.0.1) ---
|
||||||
# install.sh копирует значение из файла `VERSION` (корень репозитория) в
|
# install.sh копирует значение из файла `VERSION` (корень репозитория) в
|
||||||
# `.env` при каждой установке/обновлении — здесь только чтение готового
|
# `.env` при каждой установке/обновлении — здесь только чтение готового
|
||||||
|
|||||||
@@ -6,4 +6,11 @@ from core.config import get_settings
|
|||||||
|
|
||||||
settings = 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