feat(scraper-kit): copy scheduler with registry-dispatch (25+ trigger_* → dict), strangler (#2136) #2182

Merged
lekss361 merged 2 commits from feat/scraper-kit-scheduler-copy into main 2026-07-02 17:44:03 +00:00
Owner

Закрывает #2136 (Epic #2126, шаг G — последний инертный шаг переноса). Strangler — боевые app/services/scheduler.py + app/scheduler_main.py НЕ тронуты, деплой инертен.

Скопировано в scraper_kit/orchestration/scheduler.py (694 стр)

Развязка от app.* (0 импортов, AST-guard зелёный).

Registry-dispatch (убил copy-paste)

  • Handler (frozen dataclass): job + log_name + опц. pre_claim (гейт, напр. cian cookie-check→defer) + post_claim (напр. proxy_healthcheck sub-hourly reschedule)
  • SchedulerContext: инжект config/matcher/enrichment/session_factory/shutdown_requested/runs + _inflight_tasks (#1182 SIGTERM-drain)
  • _dispatch() — единый путь: pre_claim → _claim_run → post_claim → spawn. Заменяет весь per-handler boilerplate
  • build_registry(product_handlers) — 8 kit-native sweep + инжектируемые продуктовые callbacks; resolve_handler exact + wildcard-префикс (deactivate_stale_*)
  • Метрики: def trigger_*_run=0, elif source===0, _dispatch=1
  • Дословно сохранено: _claim_run (advisory-lock + double-check + rollback), reap_zombies (6h), compute_next_run_at, heartbeat/drain

Golden-parity (45 тестов)

  • Routing: 28 source — боевой scheduler_loop (trigger'ы замоканы) vs kit resolve_handler → эквивалентная таблица маршрутизации (вкл. dead deactivate_stale routing)
  • Claim: happy/already-running/lock-busy/appeared-under-lock. Zombie: порог 6h. Sub-hourly reschedule. Dispatch e2e.

Verify

  • боевые scheduler не тронуты (git diff); grep from app в kit пусто
  • ruff clean; 101 passed (parity 45 + scheduler/main/imv/adapters регресс)

Остаток (rewire, отдельно)

Продуктовые handler'ы (rosreestr/sber/deactivate/*_backfill/cadastral/cian-cookie/proxy_healthcheck — тело в app) строятся при runtime-wiring (build_registry(product_handlers=...)) — поздний rewire-шаг. Боевой контейнер по-прежнему на старом scheduler.

Закрывает #2136 (Epic #2126, шаг G — последний инертный шаг переноса). **Strangler** — боевые `app/services/scheduler.py` + `app/scheduler_main.py` НЕ тронуты, деплой инертен. ## Скопировано в `scraper_kit/orchestration/scheduler.py` (694 стр) Развязка от app.* (0 импортов, AST-guard зелёный). ## Registry-dispatch (убил copy-paste) - `Handler` (frozen dataclass): `job` + `log_name` + опц. `pre_claim` (гейт, напр. cian cookie-check→defer) + `post_claim` (напр. proxy_healthcheck sub-hourly reschedule) - `SchedulerContext`: инжект `config`/`matcher`/`enrichment`/`session_factory`/`shutdown_requested`/`runs` + `_inflight_tasks` (#1182 SIGTERM-drain) - `_dispatch()` — единый путь: `pre_claim → _claim_run → post_claim → spawn`. Заменяет весь per-handler boilerplate - `build_registry(product_handlers)` — 8 kit-native sweep + инжектируемые продуктовые callbacks; `resolve_handler` exact + wildcard-префикс (`deactivate_stale_*`) - **Метрики:** `def trigger_*_run`=0, `elif source==`=0, `_dispatch`=1 - **Дословно сохранено:** `_claim_run` (advisory-lock + double-check + rollback), `reap_zombies` (6h), `compute_next_run_at`, heartbeat/drain ## Golden-parity ✅ (45 тестов) - Routing: 28 source — боевой `scheduler_loop` (trigger'ы замоканы) vs kit `resolve_handler` → эквивалентная таблица маршрутизации (вкл. dead deactivate_stale routing) - Claim: happy/already-running/lock-busy/appeared-under-lock. Zombie: порог 6h. Sub-hourly reschedule. Dispatch e2e. ## Verify - боевые scheduler не тронуты (git diff); grep `from app` в kit пусто - ruff clean; 101 passed (parity 45 + scheduler/main/imv/adapters регресс) ## Остаток (rewire, отдельно) Продуктовые handler'ы (rosreestr/sber/deactivate/*_backfill/cadastral/cian-cookie/proxy_healthcheck — тело в app) строятся при runtime-wiring (`build_registry(product_handlers=...)`) — поздний rewire-шаг. Боевой контейнер по-прежнему на старом scheduler.
lekss361 added 2 commits 2026-07-02 17:43:57 +00:00
style(scraper-kit): ruff-format scheduler parity test (#2136)
All checks were successful
CI / changes (pull_request) Successful in 7s
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
16237d218c
lekss361 merged commit 509cecfa6a into main 2026-07-02 17:44:03 +00:00
lekss361 deleted branch feat/scraper-kit-scheduler-copy 2026-07-02 17:44:04 +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#2182
No description provided.