fix(tradein/domclick): свип брал BFF навигацией браузера — теперь подзапросом (#3264) #3266
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#3266
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3264-sweep-subresource-fetch"
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?
Закрывает #3264 — на этот раз с подтверждённой причиной. Первая попытка (PR #3265, куки в свип) была основана на неверной посылке и свип не починила; куки при этом остались, они нужны.
Причина
BFF-ручка Домклика — не страница, а JSON-эндпоинт SPA. Сайдкар умел ровно одно:
page.goto(url). То есть навигацией браузера на API-хост мы делали то, чего настоящий клиент не делает никогда.Перехват сети на живой выдаче 30.08 это показал прямо: офферы приезжают в SSR-документе, а к BFF ходят XHR'ы за гео, районами, метро и избранным. Через мобильные узлы пула наша навигация упиралась в
ChallengeTimeout— прогоны 5330 и 5351: 9 из 9 и 6 из 6 запросов зависли, 0 лотов. Карточки через те же узлы в те же минуты шли.Замер
Три режима, один узел, один и тот же ресурс:
navigate(как было)ChallengeTimeout, 55 сBanPageDetectedsubresourcepage_fetchПодзапрос проверен вширь:
Расхождение 6359 против 6367 — дрейф фонда за пару часов между замерами, не потери.
Что сделано
Сайдкар получил
fetch_mode:navigate(дефолт, поведение байт-в-байт прежнее),subresource(context.request.getиз прогретого контекста) иpage_fetch(fetchизнутри страницы).page_fetchоставлен намеренно, хотя в замере отказал: теоретически он ближе всего к настоящему XHR (несётOrigin/Sec-Fetch-*), и выбор между ним иsubresourceсделан измерением, а не рассуждением — стоит сохранить возможность перемерить на другой площадке.Прогрев origin обязателен — рукопожатие QRATOR попадает в куки контекста именно при заходе на страницу. Свип теперь передаёт
originиreferer, которых раньше не передавал вовсе._decode_bodyраспаковывает gzip по магическим байтам: карта офферов приезжаетContent-Type: application/gzip(это gzip-файл, а неContent-Encoding), и без этого вызывающий получил бы бинарь в полеhtml.fetch_modeкладётся в payload только когда не дефолтный — сайдкар прежней версии не должен получать незнакомый ключ (тот же приём, что сrefererв #3247).Про карту сайта
sitemap-offers-1.xml.gzподзапросом всё равно не берётся (279 байт — загрузчик). Не страшно: BFF полнее. В карте 3 999 квартир на продажу против 6 367 по BFF — 62% фонда; как единственный источник она и не годилась.Тесты
test_server_fetch_mode.py(6 проверок: дефолт остаётся навигацией,subresourceне навигирует на целевой url, распаковка gzip, неизвестный режим — внятная ошибка);test_3264_sweep_subresource_mode.py(5: оба вызова свипа идут сsubresourceИ непустымorigin;fetch_modeпопадает в payload только когда осмыслен);_do_fetch/_post_fetchзнали старую сигнатуру — обновлены.Что НЕ проверено
Полный прогон свипа на этой правке. Замер подтверждает обе ручки BFF (
countиoffers) на всех узлах, но сквозной свип с сохранением лотов в БД запускается после деплоя.