gendesign/tradein-mvp/browser
bot-backend 2ad2169cf5 fix(browser): пул тёплых инстансов camoufox по аренде + потолок живых (#3412)
Смена аренды прокси больше не убивает живой браузер: инстанс паркуется под
своей арендой и достаётся тёплым, когда эта аренда возвращается. Прокси у
camoufox задаётся на launch (geoip=True вяжет фингерпринт к IP аренды), сменить
его у живого браузера нельзя — поэтому пул, а не per-context proxy.

Замер прода за 25 ч (06-07.09, docker logs tradein-browser) НЕ подтвердил
гипотезу «relaunch перед каждым fetch»: 154 launch'а на ~2000 cian-фетчей,
из них 104 — recycle-порог (то есть порог срабатывает), 49 — смена аренды.
В час пиковой чехарды аренд (07.09 00:xx, 24 relaunch'а на 25 фетчей) доля
отказов была 1/26 = 3.8% — НИЖЕ суточной 4.8%. Первым фетчем на свежем
инстансе падают 19 ошибок из 99 (12.3% против 4.2% на прогретом), остальные
80 размазаны по 86 разным URL и всем часам — это тяжёлый хвост латентности
Циана, отдельная задача.

Что замер подтвердил: инстансов никто не считал. Инстанс поднимался лениво на
поставщика и не закрывался никогда, поэтому пять поставщиков давали пять вечных
camoufox (~425 МиБ каждый) в контейнере с mem_limit 2560m. Cgroup за те же 25 ч:
memory.events max=40781, oom_kill=111, sock_throttled=22177. Поэтому пул идёт
вместе с потолком BROWSER_MAX_INSTANCES (default 4) и LRU-закрытием: пиковое
число браузеров теперь МЕНЬШЕ прежнего, а не больше.

Гонок не добавляет: снятие/установка инстанса синхронны (нет await между
dict-операциями), жертву берём только среди припаркованных и активных
инстансов со свободным _locks[provider] — занятый лок значит «страница
in-flight». Новых локов нет.

Попутно: BROWSER_CONCURRENCY внесена в _RETIRED_ENV — её задаёт compose, её
цитируют оба обоснования потолка памяти, а код её не читает; параллелизм
задаёт _locks[provider] (≤1 страница на поставщика, но поставщиков пять).
2026-09-07 17:22:09 +05:00
..
Dockerfile fix(tradein/browser): проверка шрифтов в сборке ловила угаданный порог, а не суть 2026-08-30 01:47:42 +03:00
server.py fix(browser): пул тёплых инстансов camoufox по аренде + потолок живых (#3412) 2026-09-07 17:22:09 +05:00
test_server.py feat(tradein/browser): имитация чтения страницы человеком, целиком opt-in (#3283) (#3308) 2026-09-01 07:34:49 +00:00
test_server_anchor_origin_switch.py fix(tradein/avito): браузерный путь ходил на каждую карточку холодным (#3251) 2026-08-30 11:47:15 +03:00
test_server_anchor_search.py fix(tradein/browser): переход с Яндекса на площадку должен быть настоящим, а не заявленным 2026-08-29 23:41:56 +03:00
test_server_behaviour.py feat(tradein/browser): имитация чтения страницы человеком, целиком opt-in (#3283) (#3308) 2026-09-01 07:34:49 +00:00
test_server_challenge_reload.py feat(tradein/browser): ходить по Домклику как человек — с Referer и с перезагрузкой зависшего рукопожатия 2026-08-29 22:53:11 +03:00
test_server_cian_captcha.py fix(#3402): капча = «Captcha…» и «Вы не робот?» (бан+ротация); «Ошибка - Циан» — только лог на цикл наблюдения 2026-09-06 14:55:45 +05:00
test_server_cookie_domain.py test(tradein/browser): домен инжектируемых кук — регистрируемый, не хост из url 2026-08-30 01:51:02 +03:00
test_server_domclick_challenge.py fix(tradein/domclick): недосчитанная QRATOR-страница уходила наверх как контент 2026-08-29 18:31:35 +03:00
test_server_fetch_json.py fix(tradein/domclick): площадка отдаёт одну карточку на процесс браузера, а мы держали один на весь прогон (#3205) 2026-08-29 13:14:20 +03:00
test_server_fetch_mode.py fix(tradein/domclick): свип брал BFF навигацией браузера — теперь подзапросом (#3264) 2026-08-30 11:24:28 +03:00
test_server_http_status.py fix(tradein): сайдкар отдаёт подтверждённый бан площадки кодом 403, не 500 2026-09-06 01:58:02 +05:00
test_server_instance_pool.py fix(browser): пул тёплых инстансов camoufox по аренде + потолок живых (#3412) 2026-09-07 17:22:09 +05:00
test_server_no_proxy_refusal.py chore(tradein): удалить мёртвые mobileproxy env-переменные и rotate-ip (#2616 шаги 2-3) (#2650) 2026-08-05 09:35:54 +00:00
test_server_pacing.py fix(tradein/domclick): площадка отдаёт одну карточку на процесс браузера, а мы держали один на весь прогон (#3205) 2026-08-29 13:14:20 +03:00
test_server_pow_challenge.py feat(tradein/browser): ходить по Домклику как человек — с Referer и с перезагрузкой зависшего рукопожатия 2026-08-29 22:53:11 +03:00
test_server_proxy_override.py chore(tradein): удалить мёртвые mobileproxy env-переменные и rotate-ip (#2616 шаги 2-3) (#2650) 2026-08-05 09:35:54 +00:00
test_server_recycle.py fix(tradein/domclick): перезапуск браузера на карточку уничтожал пропуск QRATOR (#3212) 2026-08-29 14:09:23 +03:00
test_server_referer.py feat(tradein/browser): ходить по Домклику как человек — с Referer и с перезагрузкой зависшего рукопожатия 2026-08-29 22:53:11 +03:00
test_server_resource_block.py feat(browser): block font/media + per-provider page pacing — снизить proxy fan-out (#1812) 2026-06-19 21:28:09 +03:00
test_server_reuse_context.py test(tradein/browser): домен инжектируемых кук — регистрируемый, не хост из url 2026-08-30 01:51:02 +03:00
test_server_smoke.py test(tradein/browser): домен инжектируемых кук — регистрируемый, не хост из url 2026-08-30 01:51:02 +03:00