chore(tradein/scraper): cut wasteful scraping load - cian_full_load tempo + zero-yield jobs #2633

Merged
lekss361 merged 1 commit from chore/tradein-cut-wasteful-scraping into main 2026-08-02 14:12:38 +00:00
Owner

Summary

  • Срезать бесполезную нагрузку scraper-джоб на источники = на единственный живой общий прокси (scrape_proxies: enabled=true AND provider_affinity='any' -> ровно 1 узел asocks-mobile-2; asocks-residential-1 закреплён отдельно за domclick).
  • Только UPDATE scrape_schedules.default_params / .enabled (миграция 206_scrape_schedules_cut_wasteful_load.sql) — код скраперов не меняется.
  • Все цифры — прод scrape_runs.counters, 30 дней (2026-08-02), проверено read-only перед написанием миграции.

What changed (до -> после, обоснование, потеря)

source до после замер (30д, прод) ожидаемо что теряем
cian_full_load concurrency=5, delay=4.0s, daily (эфф. интервал 0.8с) concurrency=2, delay=6.0s, interval_days=3 (эфф. интервал 3.0с) 110ч/30д (56% всего времени скрейпинга), unique_fetched=44011, inserted=1682, updated=32862 запросы к Циану падают на порядок (~11-16к -> ~1-1.5к/сутки) ~1095 price-update/сутки детектируются с лагом до 2 суток (не теряются) — приемлемо при LISTINGS_FRESH_DAYS=14
avito_full_load delay=1.0s (самая агрессивная настройка), daily delay=7.0s, interval_days=7 20/30 runs banned мгновенно, 9/30 failed, 1/30 done; avito_full_load_exhaustive (уже delay=7.0/weekly) тоже 4/4 banned за 30д резкое падение бесполезных попыток на прокси (30->~4 попытки/мес) практически ничего — 29 из 30 дней и так 0 новых/обновлённых строк
yandex_address_backfill daily interval_days=7 checked=6000, saved=4 (0.07%), errors=406 нагрузка / 7 4 сохранения/мес размазываются на неделю дольше — пренебрежимо, не выключено (ненулевой поток, граница задачи)
address-enrich фаза внутри yandex_city_sweep (ЕКБ) enrich_address=true (implicit default) enrich_address=false (параметр scheduler.py:545, код не менялся) address_attempted=5829, address_enriched=0 (ЕКБ); 5 областных yandex_city_sweep_<city> = 0 attempted (там нечего чинить, не тронуты) -5829 запросов/30д на ~0 обогащений 0 — фаза давала практически 0
house_imv_backfill daily interval_days=3 checked=1500, saved=44 (2.9%), errors=1301 (87%) втрое меньше попыток/ошибок прогресс по валидным 13% замедляется втрое — не выключено (ненулевой поток)
domclick_detail_backfill enabled=true, daily enabled=false (выключено до починки) attempted=491, enriched=0, failed=431, blocked=60 — 100% впустую, включая на дедикейтед-прокси asocks-residential-1 0 бесполезных попыток 0 — поток и так был буквально нулевой
yandex_newbuilding_sweep daily interval_days=7 30/30 runs done, rows_inserted=0 во ВСЕХ (backlog pending растёт 351->367) нагрузка / 7 0 — джоба ничего не сохраняла
15 областных city-sweep (5 городов x avito/cian/yandex) daily interval_days=3 независимая проверка listings_snapshots (14д, ~1245 активных объявлений, 5 городов): 4 price-change на 2282 снапшота = ~0.023%/сутки (ниже заявленных в задаче 0.15%/сутки) втрое меньше прогонов лаг детекции цены/нового лота до 2 суток при <0.15%/сутки волатильности — пренебрежимо при LISTINGS_FRESH_DAYS=14

Не тронуто (данные не подтвердили действие):

  • avito_detail_backfill — 78% брака, но 494 обогащения/мес (реальный поток, не близкий к нулю) — вне "Предлагаемого набора" задачи.
  • cian_city_sweep (ЕКБ, без city-суффикса) и newbuilding_only — явный запрет задачи, недавно правились.
  • avito_full_load_exhaustive — соседняя джоба, не задета (regression-guard в тесте).
  • 5 областных yandex_city_sweep_<city> — address_attempted=0, нечего чинить.

Проверка на проде (read-only)

ssh gendesign "docker exec -i tradein-postgres psql -U tradein -d tradein" — все цифры в таблице выше сверены с scrape_runs.counters за 30 дней и scrape_proxies (2 enabled прокси, 1 из них dedicated к domclick). Ничего не писалось на прод — только SELECT.

Migration number

206_scrape_schedules_cut_wasteful_load.sql — проверено: main HEAD на момент ветки = 205_sales_vs_listings_city_filter.sql (_schema_migrations на проде подтверждает 205 применена); оба открытых PR (#2546, #2547) — на устаревшей базе (max 191/193), не претендуют на 206. 206 свободен.

Test plan

  • Новый tests/test_migration_206_scrape_schedules_cut_wasteful_load.py — 19 тестов: транзакционность, отсутствие DDL, jsonb-merge (не перезапись), regression-guard'ы (cian_city_sweep ЕКБ/newbuilding_only не тронуты, avito_full_load_exhaustive не тронут, 5 областных yandex-sweep не тронуты по enrich_address).
  • Dry-run миграции на локальном dev-postgres (tradein-postgres docker, syntax + jsonb-merge behaviour подтверждены).
  • Полный uv run pytest в tradein-mvp/backend: 3197 passed, 9 skipped, 1 known pre-existing fail (test_search_api.py::test_search_cache_hit, 401 RBAC — не в скоупе).
## Summary - Срезать бесполезную нагрузку scraper-джоб на источники = на единственный живой общий прокси (`scrape_proxies`: enabled=true AND provider_affinity='any' -> ровно 1 узел `asocks-mobile-2`; `asocks-residential-1` закреплён отдельно за domclick). - Только `UPDATE scrape_schedules.default_params` / `.enabled` (миграция `206_scrape_schedules_cut_wasteful_load.sql`) — код скраперов не меняется. - Все цифры — прод `scrape_runs.counters`, 30 дней (2026-08-02), проверено read-only перед написанием миграции. ## What changed (до -> после, обоснование, потеря) | source | до | после | замер (30д, прод) | ожидаемо | что теряем | |---|---|---|---|---|---| | `cian_full_load` | concurrency=5, delay=4.0s, daily (эфф. интервал 0.8с) | concurrency=2, delay=6.0s, interval_days=3 (эфф. интервал 3.0с) | 110ч/30д (56% всего времени скрейпинга), unique_fetched=44011, inserted=1682, updated=32862 | запросы к Циану падают на порядок (~11-16к -> ~1-1.5к/сутки) | ~1095 price-update/сутки детектируются с лагом до 2 суток (не теряются) — приемлемо при LISTINGS_FRESH_DAYS=14 | | `avito_full_load` | delay=1.0s (самая агрессивная настройка), daily | delay=7.0s, interval_days=7 | 20/30 runs banned мгновенно, 9/30 failed, 1/30 done; `avito_full_load_exhaustive` (уже delay=7.0/weekly) тоже 4/4 banned за 30д | резкое падение бесполезных попыток на прокси (30->~4 попытки/мес) | практически ничего — 29 из 30 дней и так 0 новых/обновлённых строк | | `yandex_address_backfill` | daily | interval_days=7 | checked=6000, saved=4 (0.07%), errors=406 | нагрузка / 7 | 4 сохранения/мес размазываются на неделю дольше — пренебрежимо, не выключено (ненулевой поток, граница задачи) | | address-enrich фаза внутри `yandex_city_sweep` (ЕКБ) | enrich_address=true (implicit default) | enrich_address=false (параметр scheduler.py:545, код не менялся) | address_attempted=5829, address_enriched=0 (ЕКБ); 5 областных `yandex_city_sweep_<city>` = 0 attempted (там нечего чинить, не тронуты) | -5829 запросов/30д на ~0 обогащений | 0 — фаза давала практически 0 | | `house_imv_backfill` | daily | interval_days=3 | checked=1500, saved=44 (2.9%), errors=1301 (87%) | втрое меньше попыток/ошибок | прогресс по валидным 13% замедляется втрое — не выключено (ненулевой поток) | | `domclick_detail_backfill` | enabled=true, daily | enabled=false (выключено до починки) | attempted=491, enriched=0, failed=431, blocked=60 — 100% впустую, включая на дедикейтед-прокси `asocks-residential-1` | 0 бесполезных попыток | 0 — поток и так был буквально нулевой | | `yandex_newbuilding_sweep` | daily | interval_days=7 | 30/30 runs done, rows_inserted=0 во ВСЕХ (backlog pending растёт 351->367) | нагрузка / 7 | 0 — джоба ничего не сохраняла | | 15 областных city-sweep (5 городов x avito/cian/yandex) | daily | interval_days=3 | независимая проверка `listings_snapshots` (14д, ~1245 активных объявлений, 5 городов): 4 price-change на 2282 снапшота = ~0.023%/сутки (ниже заявленных в задаче 0.15%/сутки) | втрое меньше прогонов | лаг детекции цены/нового лота до 2 суток при <0.15%/сутки волатильности — пренебрежимо при LISTINGS_FRESH_DAYS=14 | **Не тронуто (данные не подтвердили действие):** - `avito_detail_backfill` — 78% брака, но 494 обогащения/мес (реальный поток, не близкий к нулю) — вне "Предлагаемого набора" задачи. - `cian_city_sweep` (ЕКБ, без city-суффикса) и `newbuilding_only` — явный запрет задачи, недавно правились. - `avito_full_load_exhaustive` — соседняя джоба, не задета (regression-guard в тесте). - 5 областных `yandex_city_sweep_<city>` — address_attempted=0, нечего чинить. ## Проверка на проде (read-only) `ssh gendesign "docker exec -i tradein-postgres psql -U tradein -d tradein"` — все цифры в таблице выше сверены с `scrape_runs.counters` за 30 дней и `scrape_proxies` (2 enabled прокси, 1 из них dedicated к domclick). Ничего не писалось на прод — только SELECT. ## Migration number `206_scrape_schedules_cut_wasteful_load.sql` — проверено: main HEAD на момент ветки = `205_sales_vs_listings_city_filter.sql` (`_schema_migrations` на проде подтверждает 205 применена); оба открытых PR (#2546, #2547) — на устаревшей базе (max `191`/`193`), не претендуют на 206. `206` свободен. ## Test plan - [x] Новый `tests/test_migration_206_scrape_schedules_cut_wasteful_load.py` — 19 тестов: транзакционность, отсутствие DDL, jsonb-merge (не перезапись), regression-guard'ы (`cian_city_sweep` ЕКБ/newbuilding_only не тронуты, `avito_full_load_exhaustive` не тронут, 5 областных yandex-sweep не тронуты по enrich_address). - [x] Dry-run миграции на локальном dev-postgres (`tradein-postgres` docker, syntax + jsonb-merge behaviour подтверждены). - [x] Полный `uv run pytest` в `tradein-mvp/backend`: 3197 passed, 9 skipped, 1 known pre-existing fail (`test_search_api.py::test_search_cache_hit`, 401 RBAC — не в скоупе).
lekss361 added 1 commit 2026-08-02 13:52:44 +00:00
chore(tradein/scraper): срезать бесполезную нагрузку — темп cian_full_load и джобы с нулевым выходом
All checks were successful
CI / changes (pull_request) Successful in 7s
CI Trade-In / changes (pull_request) Successful in 8s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 2m41s
aa8125f661
lekss361 merged commit 7142d6c7d1 into main 2026-08-02 14:12:38 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
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#2633
No description provided.