fix(tradein/proxy): узел, зарезервированный за Домкликом, до Домклика не доходит (#2800 A) #2802
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#2802
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/2800a-proxy1-affinity"
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?
Что не так
Узел
scrape_proxies.id=1закреплён за Домкликом миграцией 173 (provider_affinity='domclick'). Живая проба 09.08.2026 тем же трактом, что и работа (сайдкарtradein-browser→ camoufox с этим прокси → навигация наrobots.txtрабочего хоста площадки):NS_ERROR_PROXY_BAD_GATEWAYДо рабочего хоста Домклика (
bff-search-web.domclick.ru— туда ходитproviders/domclick/serp.py::_BFF_BASE) узел не доходит вообще. При этом Авито и Яндекс через него отвечают штатно.Резервация работала ровно наоборот задуманному: держала узел за единственным источником, которому он не годен, и прятала от двух, которым годен —
acquire()отбирает поprovider_affinity IN (source,'any'), а fallback этот узел не берёт (защита последнего узла выделенной affinity).Попутно опровергнута формулировка из issue: узел мёртв не для «Домклика», а для его BFF-хоста.
domclick.ru/robots.txtчерез него отдаёт 200 — то есть проба по apex-домену была бы зелёной и бесполезной. Это учтено в части B.Что сделано
253_scrape_proxy_domclick_affinity_release.sql:provider_affinity'domclick' → 'any'.acquire()(ссылался на «у domclick ровно один узел id=1» как на текущее положение дел).'any', а неenabled=false: узел жив для двух площадок из четырёх, выключать целиком — терять четверть и без того дефицитного пула (#2638). CHECK-констрейнт не трогаем — значение остаётся допустимым для узла, который до Домклика реально дойдёт.Границы (что этот PR НЕ делает)
Это не починка Домклика.
acquire('domclick')и раньше видел все четыре узла (affinity IN ('domclick','any')), шанс вытянуть узел 1 и потратить первый бакет впустую был и остаётся 1/4. Закрывает это проба по паре «узел × источник» — часть B того же issue, отдельным PR сегодня же.Побочный эффект до части B: Циан получает 1 шанс из 4 вытянуть узел, для Циана мёртвый (сейчас он его вообще не видел). Ближайший прогон Циана —
cian_city_sweep_*10.08 ~11:24Z, часть B успевает раньше.Проверка
scripts/check-migration-lock-timeout.py→✓ блокирующий DDL прикрыт lock_timeout (проверено новых миграций: 2); блокирующего DDL в 253 нет (одинUPDATE).pytest tests/services/test_proxy_pool.py tests/test_2723_browser_probe.py tests/test_2657_domclick_proxy_pool.py→ 79 passed.Прод-верификация (критерий записан ДО факта)
Ближайший
domclick_city_sweep— 2026-08-10 04:43:59Z (scrape_schedules.next_run_at). Критерий приёмки для этого PR:scrape_proxiesне остаётся строк сprovider_affinity='domclick'(сразу после деплоя);acquire('avito'|'yandex')начинает выдавать узел 1 — видно поproxy_pool: leased proxy id=1 provider=avito|yandexв логахtradein-scraper(до PR такой строки быть не могло).Прогон Домклика 10.08 — критерий части B, не этой: одна смена affinity его не чинит.
Refs #2800
Живая проба 09.08.2026 тем же трактом, что и работа (сайдкар tradein-browser → camoufox с этим прокси → навигация на robots.txt рабочего хоста площадки): узел | affinity | avito | ekb.cian.ru | realty.yandex.ru | bff-search-web.domclick.ru -----+----------+-------+---------------------+------------------+--------------------------- 1 | domclick | 200 | 200 «Ошибка — Циан» | 200 | 500 NS_ERROR_PROXY_BAD_GATEWAY 9 | any | 200 | 200 | 200 | 200 10 | any | 200 | 200 | 200 | 200 11 | any | 200 | 200 | 200 | 200 Узел 1 закреплён за Домкликом миграцией 173, но до рабочего хоста Домклика (bff-search-web.domclick.ru — туда ходит providers/domclick/serp.py) не доходит вообще, а Авито и Яндекс через него отвечают штатно. Резервация работала ровно наоборот задуманному: держала узел за единственным источником, которому он НЕ годен, и прятала от двух, которым годен (acquire отбирает по provider_affinity IN (source,'any'), а fallback этот узел не берёт — защита последнего узла выделенной affinity). Миграция 253: provider_affinity 'domclick' → 'any'. Не enabled=false — узел жив для двух площадок из четырёх, выключать его целиком значит терять четверть и без того дефицитного пула (#2638). CHECK-констрейнт не трогаем: значение остаётся допустимым для узла, который до Домклика реально дойдёт. Границы: это НЕ починка Домклика. acquire('domclick') и раньше видел все четыре узла, шанс вытянуть узел 1 и потратить первый бакет впустую был и остаётся 1/4 — закрывает это проба по паре «узел × источник» (часть B того же issue). Здесь снимается только резервация. Побочно: до части B Циан получает 1 шанс из 4 вытянуть узел, для Циана мёртвый; ближайший прогон Циана — 10.08 11:24Z, часть B идёт сегодня же. Refs #2800