rewire: scheduler_main на kit-scheduler за флагом USE_KIT_SCHEDULER (ship-dark) #2192

Closed
opened 2026-07-02 18:29:20 +00:00 by lekss361 · 0 comments
Owner

Часть боевой активации scraper-kit (Epic #2126, финал). Ship-dark — за feature-флагом, дефолт off, прод не меняется на деплое. Активация (флип) — отдельно с прод-QA.

Goal

  1. Feature-флаги в config.py (по образцу scheduler_enable, дефолт False): use_kit_scheduler (USE_KIT_SCHEDULER), use_proxy_pool_curl (USE_PROXY_POOL_CURL), use_proxy_pool_browser (USE_PROXY_POOL_BROWSER).
  2. scheduler_main._run() развилка: use_kit_scheduler=False → старый app.services.scheduler.scheduler_loop() (без изменений); TrueSchedulerContext(config=RealScraperConfig(), matcher=RealMatcherAdapter(), enrichment=RealEnrichmentJobs(), session_factory=<SessionLocal-обёртка>) + build_registry(product_handlers=...) + kit scheduler_loop(ctx, registry).
  3. app/services/product_handlers.py — обёртки всех НЕ-sweep source'ов в Handler (тело остаётся в app).

Полный список product_handlers (verified по app/services/scheduler.py if/elif)

cian_history_backfill, rosreestr_dkp_import, listing_source_snapshot, asking_to_sold_ratio_refresh, refresh_search_matview, yandex_address_backfill, sber_index_pull, rosreestr_quarter_poll, newbuilding_enrich, yandex_newbuilding_sweep, geocode_missing_listings, avito_detail_backfill, yandex_detail_backfill, cadastral_geo_match, house_imv_backfill, house_dedup_merge, proxy_healthcheck + wildcard deactivate_stale_*.

Kit-native (НЕ в product_handlers — идут из build_registry дефолтов): avito_city_sweep, avito_newbuilding_sweep, avito_full_load, avito_full_load_exhaustive, yandex_city_sweep, cian_city_sweep, cian_full_load, domclick_city_sweep.

Acceptance

  • unit-тест полноты реестра: для каждого distinct source из старого if/elif dispatch (и/или scrape_schedules) resolve_handler(source, registry) is not None. Ловит пропущенный source ДО прода. Wildcard deactivate_stale_* покрыт.
  • флаги дефолт False; docker exec ... python -c "from app.core.config import settings; print(settings.use_kit_scheduler)" → False
  • НЕ трогать боевой app/services/scheduler.py/scrape_pipeline.py/scrapers/* (старый путь остаётся рабочим для отката)
  • ruff/mypy чисто; старые scheduler-тесты зелёные

Risk

Пропущенный source → schedule тихо не диспатчится (no runs). Тест полноты обязателен. yandex_newbuilding_sweep/cian_history_backfill — product, НЕ kit (не спутать со sweep). RealSessionFactory — если нет adapter, создать тонкую обёртку над SessionLocal.

Agent: backend-engineer. Ship-dark, инертно.

Часть боевой активации scraper-kit (Epic #2126, финал). **Ship-dark** — за feature-флагом, дефолт off, прод не меняется на деплое. Активация (флип) — отдельно с прод-QA. ## Goal 1. Feature-флаги в `config.py` (по образцу `scheduler_enable`, дефолт **False**): `use_kit_scheduler` (`USE_KIT_SCHEDULER`), `use_proxy_pool_curl` (`USE_PROXY_POOL_CURL`), `use_proxy_pool_browser` (`USE_PROXY_POOL_BROWSER`). 2. `scheduler_main._run()` развилка: `use_kit_scheduler=False` → старый `app.services.scheduler.scheduler_loop()` (без изменений); `True` → `SchedulerContext(config=RealScraperConfig(), matcher=RealMatcherAdapter(), enrichment=RealEnrichmentJobs(), session_factory=<SessionLocal-обёртка>)` + `build_registry(product_handlers=...)` + kit `scheduler_loop(ctx, registry)`. 3. `app/services/product_handlers.py` — обёртки всех НЕ-sweep source'ов в `Handler` (тело остаётся в app). ## Полный список product_handlers (verified по app/services/scheduler.py if/elif) `cian_history_backfill`, `rosreestr_dkp_import`, `listing_source_snapshot`, `asking_to_sold_ratio_refresh`, `refresh_search_matview`, `yandex_address_backfill`, `sber_index_pull`, `rosreestr_quarter_poll`, `newbuilding_enrich`, `yandex_newbuilding_sweep`, `geocode_missing_listings`, `avito_detail_backfill`, `yandex_detail_backfill`, `cadastral_geo_match`, `house_imv_backfill`, `house_dedup_merge`, `proxy_healthcheck` + **wildcard `deactivate_stale_*`**. **Kit-native (НЕ в product_handlers — идут из `build_registry` дефолтов):** avito_city_sweep, avito_newbuilding_sweep, avito_full_load, avito_full_load_exhaustive, yandex_city_sweep, cian_city_sweep, cian_full_load, domclick_city_sweep. ## Acceptance - unit-тест **полноты реестра**: для каждого distinct `source` из старого if/elif dispatch (и/или `scrape_schedules`) `resolve_handler(source, registry) is not None`. Ловит пропущенный source ДО прода. Wildcard `deactivate_stale_*` покрыт. - флаги дефолт False; `docker exec ... python -c "from app.core.config import settings; print(settings.use_kit_scheduler)"` → False - НЕ трогать боевой `app/services/scheduler.py`/`scrape_pipeline.py`/`scrapers/*` (старый путь остаётся рабочим для отката) - ruff/mypy чисто; старые scheduler-тесты зелёные ## Risk Пропущенный source → schedule тихо не диспатчится (no runs). Тест полноты обязателен. `yandex_newbuilding_sweep`/`cian_history_backfill` — product, НЕ kit (не спутать со sweep). RealSessionFactory — если нет adapter, создать тонкую обёртку над SessionLocal. **Agent:** backend-engineer. Ship-dark, инертно.
lekss361 added the
priority/p1
scope/backend
scrapers
status/wip
tradein
labels 2026-07-02 18:29:27 +00:00
Sign in to join this conversation.
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#2192
No description provided.