fix(devops): дать trade-in связность с redis, потом уже задать REDIS_URL (#2709)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 7s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
Проблема была не в незаданной переменной, а в отсутствующей связности: gendesign-redis-1 жил только в gendesign_default, tradein-backend — в gendesign_shared + tradein-net. Общей сети нет → redis не резолвился ни под каким именем. Вводим redis в gendesign_shared под алиасом gendesign-redis (тот же приём, что уже применён к postgres) и только после этого задаём REDIS_URL на db1 (db0 занят celery-брокером gendesign, db2 — glitchtip). Порядок «сначала сеть, потом переменная» соблюдён буквально: связность проверена на проде throwaway-контейнером ДО того, как переменная где-либо появилась (из tradein-backend: PING 19 мс, SET 0.35 мс, GET 0.31 мс, db1). Цена ошибки измерена тем же клиентом, что в app/services/cache.py: localhost-отказ 16.6 мс (как было), NXDOMAIN 123.5 мс, а имя, которое резолвится и не отвечает — 2003.7 мс. Последнее и есть та молчаливая яма, про которую предупреждает issue: ×2 (GET+SET) на каждый запрос, без ошибки наверх, потому что get/set глотают исключение. Свой redis в стеке trade-in НЕ добавлен осознанно: deploy-tradein.yml поднимает стек как `up -d --no-deps $SERVICES` с ЗАХАРДКОЖЕННЫМ списком (browser backend frontend tgbot [scraper]). Новый сервис туда не попадает и `--no-deps` его не подтянет — контейнер никогда бы не стартовал, а REDIS_URL указывал бы в пустоту. Правка списка = правка deploy-tradein.yml, который сейчас заморожен (#2680). Ожидаемый выигрыш по скорости — НУЛЕВОЙ, и это измерено, а не оценено: POST /api/v1/search за 16.2 суток логов Caddy получил 0 запросов, и во фронтенде нет ни одного вызова этого роута. Реальная ценность правки — снять заряженную ловушку и дать #2665 (потолок темпа логинов) хранилище с ПРОВЕРЕННОЙ доступностью, чего issue прямо и требует. Refs #2709, #2674, #2665
This commit is contained in:
parent
896243cf3f
commit
49a3962e6b
2 changed files with 49 additions and 0 deletions
|
|
@ -111,6 +111,40 @@ services:
|
|||
interval: 10s
|
||||
timeout: 3s
|
||||
retries: 5
|
||||
# #2709: redis вводится в gendesign_shared, чтобы tradein-backend вообще МОГ
|
||||
# его достать. До этого redis жил только в gendesign_default, а tradein — в
|
||||
# gendesign_shared + tradein-net: общей сети НЕТ, поэтому REDIS_URL там не
|
||||
# резолвился НИ ПОД КАКИМ именем. Это была не «забытая переменная», а
|
||||
# отсутствующая связность (см. #2709).
|
||||
#
|
||||
# Почему общий инстанс, а не свой redis в стеке trade-in: deploy-tradein.yml
|
||||
# поднимает стек как `up -d --no-deps $SERVICES`, где SERVICES —
|
||||
# ЗАХАРДКОЖЕННЫЙ список (browser backend frontend tgbot [scraper]). Новый
|
||||
# сервис в tradein-compose в этот список не попадает и `--no-deps` его не
|
||||
# подтянет → контейнер просто никогда бы не стартовал, а REDIS_URL указывал
|
||||
# бы в пустоту. Правка того списка = правка deploy-tradein.yml, который
|
||||
# сейчас заморожен (#2680 ждёт человека). Общий инстанс обходит это целиком.
|
||||
#
|
||||
# aliases: тот же приём, что уже применён к postgres выше — стабильное имя
|
||||
# gendesign-redis вместо compose-зависимого gendesign-redis-1.
|
||||
# ⚠️ `default` ОБЯЗАН быть перечислен явно: как только у сервиса появляется
|
||||
# блок networks:, неявная привязка к default пропадает, и backend/worker/
|
||||
# beat/glitchtip потеряли бы брокер (та же грабля описана у postgres).
|
||||
#
|
||||
# Разделение ключей — по НОМЕРУ БД, инстанс общий:
|
||||
# db0 — gendesign (celery-брокер + кэши бэкенда), 2166 ключей
|
||||
# db1 — trade-in (SearchCache) ← вводится здесь
|
||||
# db2 — glitchtip (см. REDIS_URL ниже)
|
||||
# Ceiling: maxmemory=0 / noeviction на инстансе НЕ трогаем — allkeys-lru на
|
||||
# брокере celery вытеснял бы поставленные в очередь таски. Значит tradein
|
||||
# обязан ставить TTL на каждый ключ (он ставит: SET ... ex=ttl). Если
|
||||
# tradein когда-нибудь начнёт писать без TTL, упрётся весь инстанс, включая
|
||||
# celery. Тогда — отдельный инстанс, а не смена политики вытеснения.
|
||||
networks:
|
||||
default: {}
|
||||
shared:
|
||||
aliases:
|
||||
- gendesign-redis
|
||||
|
||||
# OSRM routing engine (#39 — site-finder /analyze road/walking distances to POI
|
||||
# вместо straight-line ST_Distance). INFRA-only здесь: интеграция в /analyze —
|
||||
|
|
|
|||
|
|
@ -206,6 +206,21 @@ services:
|
|||
# Значение ДОЛЖНО совпадать с TRADEIN_INTERNAL_AUTH_SECRET в .env главного
|
||||
# (Caddy) стека. Читается также из backend/.env.runtime (env_file выше).
|
||||
TRADEIN_INTERNAL_AUTH_SECRET: "${TRADEIN_INTERNAL_AUTH_SECRET:-}"
|
||||
# #2709. Дефолт в коде — redis://localhost:6379/0, и внутри контейнера это
|
||||
# мгновенный ConnectionRefused (замер: 16.6 мс) → кэш не работал ни дня.
|
||||
# ⚠️ ПОРЯДОК КРИТИЧЕН, и цена ошибки измерена тем же клиентом, что в
|
||||
# app/services/cache.py (socket_timeout=2.0, socket_connect_timeout=2.0):
|
||||
# localhost, отказ соединения 16.6 мс ← как было
|
||||
# имя не резолвится (NXDOMAIN) 123.5 мс
|
||||
# имя резолвится, но не отвечает 2003.7 мс ← вот эта яма
|
||||
# get/set глотают исключение в logger.warning и возвращают промах, поэтому
|
||||
# яма МОЛЧАЛИВАЯ: 2 с на GET + 2 с на SET на каждый запрос, без единой
|
||||
# ошибки наверх. Отсюда правило: сначала связность, потом переменная.
|
||||
# Здесь она задаётся только потому, что связность уже проверена на проде
|
||||
# ДО этой строки (throwaway-redis на gendesign_shared, из tradein-backend:
|
||||
# PING 19 мс, SET 0.35 мс, GET 0.31 мс) — см. описание PR.
|
||||
# db1 — не 0 и не 2: 0 занят celery-брокером gendesign, 2 — glitchtip'ом.
|
||||
REDIS_URL: "redis://gendesign-redis:6379/1"
|
||||
depends_on:
|
||||
browser:
|
||||
condition: service_started
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue