perf(tradein/browser): якорная вкладка выдачи вместо переоткрытия origin на каждую карточку #3244

Merged
lekss361 merged 2 commits from perf/domclick-anchor-serp-tab into main 2026-08-29 18:29:42 +00:00
Owner

Что не так

При reuse_context=true сайдкар на каждый /fetch делал goto(origin), затем goto(url) — перед каждой карточкой заново грузил страницу выдачи в той же единственной вкладке. Смысл origin-прогрева (получить пропуск QRATOR в контексте) достигается ровно один раз, на первой карточке; дальше контекст уже прогрет, и повторная навигация — чистая трата рукопожатия.

Побочно: докстринг про «органическую навигацию с реальным Referer» преувеличивал — playwright'овский goto Referer не шлёт вовсе. Docstring поправлен по факту.

Что сделано

origin поднимается в отдельной долгоживущей вкладке (_anchor_pages), карточки идут своими вкладками, выдача не перезагружается. Так ходит человек: вкладка со списком открыта всю сессию, объявления открываются из неё.

Чем подтверждено

Ручной прогон 29.08 (headful камуфокс, прод-прокси, вкладка выдачи + вкладки карточек): 91 карточка подряд, 0 отказов.

Замер правки на тестовом сайдкаре tradein-browser-test (узел 11, 12 карточек):

=== ИТОГ === карточек=12 успех=12 отказ=0 прочее=0 сбросов=0
кривая: OOOOOOOOOOOO
якорь поднимался раз: 1
было стало
медиана на карточку ~24 с ~15 с
к концу прогона росла до 34-52 с роста нет, 12-16 с

Оговорка: четырёхкратного выигрыша, который дал локальный headful-прогон, здесь нет — у сайдкара остаётся ожидание PoW на каждой карточке. Убрана одна навигация из двух и исчез рост времени по ходу прогона.

Безопасность отката

  • Якорная вкладка не поднялась → молча возвращаемся к прежнему поведению (goto(origin) перед карточкой), прогон не падает.
  • Без reuse_context поведение не меняется вовсе.
  • Сброс контекста роняет и якорь (_close_reusable_context).

Тесты

5 новых в browser/test_server_reuse_context.py: якорь поднимается один раз на много fetch'ей; карточки не переоткрывают origin; без reuse_context origin переоткрывается как прежде; сброс контекста роняет якорь; отказ якоря даёт откат к старому поведению.

Полный набор сайдкара: 182 passed. ruff check browser/server.py чисто.

## Что не так При `reuse_context=true` сайдкар на каждый `/fetch` делал `goto(origin)`, затем `goto(url)` — перед каждой карточкой заново грузил страницу выдачи в той же единственной вкладке. Смысл origin-прогрева (получить пропуск QRATOR в контексте) достигается ровно один раз, на первой карточке; дальше контекст уже прогрет, и повторная навигация — чистая трата рукопожатия. Побочно: докстринг про «органическую навигацию с реальным Referer» преувеличивал — playwright'овский `goto` Referer не шлёт вовсе. Docstring поправлен по факту. ## Что сделано `origin` поднимается в отдельной долгоживущей вкладке (`_anchor_pages`), карточки идут своими вкладками, выдача не перезагружается. Так ходит человек: вкладка со списком открыта всю сессию, объявления открываются из неё. ## Чем подтверждено Ручной прогон 29.08 (headful камуфокс, прод-прокси, вкладка выдачи + вкладки карточек): **91 карточка подряд, 0 отказов**. Замер правки на тестовом сайдкаре `tradein-browser-test` (узел 11, 12 карточек): ``` === ИТОГ === карточек=12 успех=12 отказ=0 прочее=0 сбросов=0 кривая: OOOOOOOOOOOO якорь поднимался раз: 1 ``` | | было | стало | |---|---|---| | медиана на карточку | ~24 с | ~15 с | | к концу прогона | росла до 34-52 с | роста нет, 12-16 с | Оговорка: четырёхкратного выигрыша, который дал локальный headful-прогон, здесь **нет** — у сайдкара остаётся ожидание PoW на каждой карточке. Убрана одна навигация из двух и исчез рост времени по ходу прогона. ## Безопасность отката - Якорная вкладка не поднялась → молча возвращаемся к прежнему поведению (`goto(origin)` перед карточкой), прогон не падает. - Без `reuse_context` поведение не меняется вовсе. - Сброс контекста роняет и якорь (`_close_reusable_context`). ## Тесты 5 новых в `browser/test_server_reuse_context.py`: якорь поднимается один раз на много fetch'ей; карточки не переоткрывают origin; без `reuse_context` origin переоткрывается как прежде; сброс контекста роняет якорь; отказ якоря даёт откат к старому поведению. Полный набор сайдкара: **182 passed**. `ruff check browser/server.py` чисто.
lekss361 added 1 commit 2026-08-29 18:24:40 +00:00
perf(tradein/browser): якорная вкладка выдачи вместо переоткрытия origin на каждую карточку
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 10s
CI Trade-In / backend-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
CI Trade-In / browser-tests (pull_request) Successful in 1m26s
5f1a2ec585
При reuse_context=true сайдкар на каждый fetch делал goto(origin), а потом
goto(url) — то есть перед каждой карточкой заново грузил страницу выдачи в той
же единственной вкладке. Смысл origin-прогрева (получить пропуск QRATOR в
контексте) при этом достигался ровно один раз, на первой карточке: дальше
контекст уже прогрет, а повторная навигация — чистая трата рукопожатия.

Ручная проверка 29.08 показала, как ходит человек: вкладка с выдачей открыта
всю сессию, объявления открываются из неё в новых вкладках. 91 карточка подряд,
0 отказов. Здесь то же самое: origin поднимается в отдельной долгоживущей
вкладке (_anchor_pages), карточки идут своими вкладками, выдача не
перезагружается.

Замер на тестовом сайдкаре (узел 11, 12 карточек): якорь поднялся ровно один
раз, 12/12 успех, медиана ~15 с против ~24 с и без роста времени к концу
прогона (раньше последние карточки уходили в 34-52 с).

Откат безопасный: не поднялась якорная вкладка — молча возвращаемся к прежнему
поведению (goto(origin) перед карточкой). Без reuse_context поведение не
меняется вовсе. Сброс контекста роняет и якорь.
bot-backend added 1 commit 2026-08-29 18:27:20 +00:00
docs(tradein/browser): origin работает через куки контекста, а не через Referer
All checks were successful
CI Trade-In / changes (pull_request) Successful in 14s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 15s
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
CI Trade-In / browser-tests (pull_request) Successful in 1m37s
2c29151e85
Оба комментария про origin обещали «органическую навигацию с реальными
cookies/Referer». Referer тут не при чём: playwright'овский goto() этот
заголовок не шлёт вовсе, так что органической навигацией заход на origin не был
никогда. Работает он через куки контекста — пропуск QRATOR, выданный на выдаче,
остаётся в контексте и годится для карточки.

Различие не косметическое: из «нужен Referer» следует, что origin надо
переоткрывать перед каждой карточкой, а из «нужны куки» — что достаточно одного
раза. Второе и делает якорная вкладка предыдущего коммита; заодно дописано,
почему при reuse_context повторный заход на выдачу не нужен.
lekss361 merged commit c6fc21fff4 into main 2026-08-29 18:29:42 +00:00
lekss361 deleted branch perf/domclick-anchor-serp-tab 2026-08-29 18:29:42 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3244
No description provided.