feat(proxy-pool): pool service (acquire/release/health) + healthcheck scheduler task (#2162) #2169

Merged
lekss361 merged 1 commit from feat/proxy-pool-service into main 2026-07-02 16:41:41 +00:00
Owner

Закрывает #2162 (Epic #2160, P2). Аддитивно — сервис + health-checker, НЕ подключено к боевым scrapers (P3/P4).

Что

  • app/services/proxy_pool.pyacquire/release/mark_health/reap_stale_leases + run_proxy_healthcheck. psycopg v3 (CAST, make_interval). Пороги: MAX_CONSECUTIVE_FAILS=3 (карантин в acquire), DISABLE_THRESHOLD=5 (авто-disable), STALE_LEASE_MINUTES=30. Lease: leased_by IS NULL=свободен / run_id=занят / -1=non-run marker. acquire = FOR UPDATE SKIP LOCKED LIMIT 1.
  • scheduler.pytrigger_proxy_healthcheck_run + ветка proxy_healthcheck в dispatch. Sub-hourly каденс: после _claim_run переопределяет next_run_at = now() + interval_minutes (штатный scheduler суточно-гранулярный); has_running_run авто-throttle.
  • 158_seed_proxy_healthcheck_schedule.sql — сид (enabled, interval 30 мин, next_run_at=now()). Безопасно: пул пуст → checked=0.

Health-checker

Для каждого enabled прокси — httpx GET ipify через него → mark_health(ok, exit_ip, latency); предварительно reap_stale_leases.

Verify

  • pytest test_proxy_pool.py → 14 passed (stateful FakeSession); test_scheduler+test_scheduler_main → 40 passed (нет регрессии)
  • ruff clean

После мержа

Миграция 158 auto-apply; залить прокси через POST /api/v1/admin/proxies/bulk → health-checker начнёт пинговать. Интеграция в боевой fetch = P3 (curl) / P4 (browser).

Закрывает #2162 (Epic #2160, P2). **Аддитивно** — сервис + health-checker, НЕ подключено к боевым scrapers (P3/P4). ## Что - `app/services/proxy_pool.py` — `acquire`/`release`/`mark_health`/`reap_stale_leases` + `run_proxy_healthcheck`. psycopg v3 (`CAST`, `make_interval`). Пороги: `MAX_CONSECUTIVE_FAILS=3` (карантин в acquire), `DISABLE_THRESHOLD=5` (авто-disable), `STALE_LEASE_MINUTES=30`. Lease: `leased_by IS NULL`=свободен / `run_id`=занят / `-1`=non-run marker. `acquire` = `FOR UPDATE SKIP LOCKED LIMIT 1`. - `scheduler.py` — `trigger_proxy_healthcheck_run` + ветка `proxy_healthcheck` в dispatch. Sub-hourly каденс: после `_claim_run` переопределяет `next_run_at = now() + interval_minutes` (штатный scheduler суточно-гранулярный); `has_running_run` авто-throttle. - `158_seed_proxy_healthcheck_schedule.sql` — сид (enabled, interval 30 мин, `next_run_at=now()`). Безопасно: пул пуст → checked=0. ## Health-checker Для каждого enabled прокси — httpx GET ipify через него → `mark_health(ok, exit_ip, latency)`; предварительно `reap_stale_leases`. ## Verify - `pytest test_proxy_pool.py` → 14 passed (stateful FakeSession); `test_scheduler`+`test_scheduler_main` → 40 passed (нет регрессии) - ruff clean ## После мержа Миграция 158 auto-apply; залить прокси через `POST /api/v1/admin/proxies/bulk` → health-checker начнёт пинговать. Интеграция в боевой fetch = P3 (curl) / P4 (browser).
lekss361 added 1 commit 2026-07-02 16:41:30 +00:00
feat(proxy-pool): pool service (acquire/release/health) + healthcheck scheduler task (#2162)
All checks were successful
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / changes (pull_request) Successful in 13s
CI / frontend-tests (pull_request) Has been skipped
fff284a22b
lekss361 merged commit d7f4873a53 into main 2026-07-02 16:41:41 +00:00
lekss361 deleted branch feat/proxy-pool-service 2026-07-02 16:41:41 +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#2169
No description provided.