feat(browser): per-provider concurrency — параллель между поставщиками, ≤1 коннект на поставщика (#1793) #1794

Merged
lekss361 merged 2 commits from feat/browser-per-provider-concurrency into main 2026-06-19 16:02:14 +00:00
Owner

Closes #1793.

Что

Рефактор tradein-browser (browser/server.py) с единого глобального браузера на per-provider модель: параллелизм между поставщиками (avito/cian/yandex одновременно), но ≤1 одновременный fetch на поставщика.

Как

  • _provider_for_url(url) — host → provider (avito/cian/yandex/generic).
  • _provider_proxy(provider)BROWSER_PROXY_* (primary, http) + legacy *_PROXY_URL fallback. BROWSER_PROXY_* перебивает socks5-legacy (playwright не умеет socks5+auth).
  • Глобальное состояние → per-provider словари: _browsers/_browser_cms/_page_counters/_locks/_retry_tasks, ленивое создание локов.
  • fetch_handler/login_handler резолвят provider (явный body["provider"] или host) → блокируют ТОЛЬКО лок этого поставщика.
  • Сохранены: recycle, crash-recovery, per-provider retry при недоступном прокси, санитизация кред в логах.
  • /health{"status":"ok","browsers":{"avito":bool,"cian":bool,"yandex":bool,"generic":bool}}. Контракты /fetch//login неизменны.
  • Убран старый FEATURE_BROWSER_POOL_ENABLED + proxy-url-keyed pool (per-provider теперь безусловный).

Тесты

34 passed (concurrency: same-provider peak==1, cross-provider peak==3). Ruff clean.

На ревью

  • Регрессии vs убранного pool (_fetch_sem/_inflight/_launch_lock).
  • browser_fetcher.py шлёт {"url","source"} — сервер резолвит по host, source игнорится (значения совпадают). Контракт не сломан.
  • Память: 3-4 camoufox-инстанса (lazy) vs лимит 5ГБ — проверить на проде после деплоя.
Closes #1793. ## Что Рефактор `tradein-browser` (`browser/server.py`) с единого глобального браузера на **per-provider** модель: параллелизм между поставщиками (avito/cian/yandex одновременно), но **≤1 одновременный fetch на поставщика**. ## Как - `_provider_for_url(url)` — host → provider (avito/cian/yandex/generic). - `_provider_proxy(provider)` — `BROWSER_PROXY_*` (primary, http) + legacy `*_PROXY_URL` fallback. BROWSER_PROXY_* перебивает socks5-legacy (playwright не умеет socks5+auth). - Глобальное состояние → per-provider словари: `_browsers/_browser_cms/_page_counters/_locks/_retry_tasks`, ленивое создание локов. - `fetch_handler`/`login_handler` резолвят provider (явный `body["provider"]` или host) → блокируют ТОЛЬКО лок этого поставщика. - Сохранены: recycle, crash-recovery, per-provider retry при недоступном прокси, санитизация кред в логах. - `/health` → `{"status":"ok","browsers":{"avito":bool,"cian":bool,"yandex":bool,"generic":bool}}`. Контракты `/fetch`/`/login` неизменны. - Убран старый `FEATURE_BROWSER_POOL_ENABLED` + proxy-url-keyed pool (per-provider теперь безусловный). ## Тесты 34 passed (concurrency: same-provider peak==1, cross-provider peak==3). Ruff clean. ## На ревью - Регрессии vs убранного pool (`_fetch_sem`/`_inflight`/`_launch_lock`). - `browser_fetcher.py` шлёт `{"url","source"}` — сервер резолвит по host, `source` игнорится (значения совпадают). Контракт не сломан. - Память: 3-4 camoufox-инстанса (lazy) vs лимит 5ГБ — проверить на проде после деплоя.
lekss361 added 1 commit 2026-06-19 15:54:03 +00:00
feat(browser): per-provider concurrency — параллель между поставщиками, ≤1 коннект на поставщика (#1793)
All checks were successful
CI / changes (pull_request) Successful in 5s
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
77ae4ca779
bot-backend added 1 commit 2026-06-19 16:00:19 +00:00
fixup(browser): source-fallback routing, lazy launch, test stability (#1793 review)
All checks were successful
CI / changes (pull_request) Successful in 5s
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
1578dd5a5d
lekss361 merged commit 4755f8bd13 into main 2026-06-19 16:02:14 +00:00
lekss361 deleted branch feat/browser-per-provider-concurrency 2026-06-19 16:02:14 +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#1794
No description provided.