fix(caddy): ретрай подключения к фронту МЕРЫ — остаток окна подмены (#3274, часть 2a/3) #3446
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3446
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3274-part2a-caddy-retry"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Часть 2a из 3 по #3274 (часть 1 — PR #3442, уже в main). Только
caddy/sites/apps.caddy— по фильтруdeploy.yml:152-154этоcaddy_only=true→ джобаdeploy-caddyсcaddy reload(~1 с), без полного деплоя ПТИЦЫ. Гейт и шагci.ymlпоедут частью 2b, которая не триггерит ни один деплой.Зачем. Часть 1 свела окно подмены фронта с 30–90 с до ~0,5 с (вынос
frontendиз общей командыup -d). Остаток — эти самые полсекунды: снипет(tradein_frontend_retry)сlb_try_duration 2s+lb_try_interval 100msво все 9 блоковreverse_proxy tradein-frontend:3000.Разворот решения, записанного в теле #3274. Там сказано «чего делать НЕ надо:
lb_try_duration» — и для окна 30–90 с это верно, ретрай превратил бы отказ в минутное ожидание. Возражение снято порядком: сначала окно сжато правкой деплоя, и только потом ретрай применим. Отдельный комментарий об этом написан в саму issue.Проверено исполнением (deep-ревью,
caddy validate+ разбор JSON конфига на живомcaddy:2):tradein-frontend:3000сtry_duration=2s try_interval=100ms;tradein-backend:8000(2 блока),backend:8000(3) и фронт ПТИЦЫ — без ретрая;handle_errors 502 503 504+deploy-window.caddy.snippetне конфликтуют: заглушка отдаётся, просто на 2 с позже;Неидемпотентный POST не дублируется — проверено отдельно, потому что среди путей есть платежи: при установленном соединении и умершем апстриме апстрим получил POST ровно один раз (клиенту 503 за 0.007 с); дефолтный
lb_retry_matchповторяет только GET, а при неудавшемся дозвоне запрос апстриму не доставлен вовсе. Плюс платёжные пути идут вtradein-backend, где ретрая нет.Известный побочный эффект (назван, не спрятан): при
lb_try_interval 100msодин GET посетителя может превратиться в до 20 попыток за 2 с — если фронт умрёт уже ПОСЛЕ приёма соединения (начав SSR), это до 20 рендеров и столько же пачек вызовов бэкенда. Дефолт Caddy — 250 мс (8 попыток). Оставляю 100 мс на первый цикл, чтобы покрыть измеренные 0,5 с с запасом; если в логах появится усиление — поднять до 200 мс (10 попыток, то же покрытие, вдвое меньше нагрузки).Приёмка на проде:
docker exec gendesign-caddy-1 grep -c tradein_frontend_retry /etc/caddy/caddy/sites/apps.caddy> 0 (в старой версии символа нет), и в окне следующего деплоя МЕРЫ непрерывная пробаscripts/probe-deploy-window.shпоhttps://meraocenka.ru/не даёт ни одного не-200 (после части 1 остаётся ~0,5 с, их и должен съесть ретрай).Откат: caddy-only revert → тот же дешёвый
caddy reload.