fix(scrapers): rate-limit/backoff/circuit-breaker для ОКН EGRKN-скрапера (#2445-D3) #2461

Merged
bot-backend merged 1 commit from fix/okn-scraper-backoff into main 2026-07-05 20:09:19 +00:00
Collaborator

Summary

Аудит-находка D3 (epic #2445, WAF-гигиена #2443). okn-mk.mkrf.ru (Минкультуры) имеет тот же unthrottled-request risk shape, что забанил VPS в WAF ДОМ.РФ: okn_egrkn_client без пейсинга/backoff, okn_objects_sync шлёт до 1500 последовательных GET без пауз.

Fix

  • _wait_rate_limit() — shared 400ms gate (module-level timestamp) между searchMap + detail на одном WAF-хосте (33 POST + до 1500 GET пейсятся друг относительно друга, не изолированно). Спит дефицит, не flat 400ms.
  • 429/5xx экспоненциальный backoff (base 2с, cap 60с, Retry-After honored+capped) в _do_request/_do_detail_request; recursion bounded _MAX_RETRIES=3 (провабельно, SSL-fallback сохраняет attempt — не течёт retry-бюджет).
  • circuit-breaker _DETAIL_FAIL_BREAKER=20 (consecutive fails, reset on success, break только detail-цикла → уже обработанные данные не теряются).
  • Идиомы из nspd_client/objective/gisogd66. Что фетчится/пишется — не изменено.

Test plan

  • 55 тестов зелёные (9 новых: shared-gate, 429-retry, persistent-429-gives-up, Retry-After capped, breaker stops+resets)
  • ruff чисто, секретов нет, tradein не тронут
  • code-reviewer: APPROVE (shared gate + bounded recursion — главные риски — verified)

Refs #2445, #2443

## Summary Аудит-находка D3 (epic #2445, WAF-гигиена #2443). `okn-mk.mkrf.ru` (Минкультуры) имеет тот же unthrottled-request risk shape, что забанил VPS в WAF ДОМ.РФ: `okn_egrkn_client` без пейсинга/backoff, `okn_objects_sync` шлёт до 1500 последовательных GET без пауз. ## Fix - `_wait_rate_limit()` — shared 400ms gate (module-level timestamp) между searchMap + detail на одном WAF-хосте (33 POST + до 1500 GET пейсятся друг относительно друга, не изолированно). Спит дефицит, не flat 400ms. - 429/5xx экспоненциальный backoff (base 2с, cap 60с, `Retry-After` honored+capped) в `_do_request`/`_do_detail_request`; recursion bounded `_MAX_RETRIES=3` (провабельно, SSL-fallback сохраняет attempt — не течёт retry-бюджет). - circuit-breaker `_DETAIL_FAIL_BREAKER=20` (consecutive fails, reset on success, break только detail-цикла → уже обработанные данные не теряются). - Идиомы из `nspd_client`/`objective`/`gisogd66`. Что фетчится/пишется — не изменено. ## Test plan - [x] 55 тестов зелёные (9 новых: shared-gate, 429-retry, persistent-429-gives-up, Retry-After capped, breaker stops+resets) - [x] ruff чисто, секретов нет, tradein не тронут - [x] code-reviewer: ✅ APPROVE (shared gate + bounded recursion — главные риски — verified) Refs #2445, #2443
bot-backend added 1 commit 2026-07-05 19:51:16 +00:00
fix(scrapers): rate-limit/backoff/circuit-breaker для ОКН EGRKN-скрапера (#2445-D3)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m1s
CI / backend-tests (pull_request) Successful in 14m54s
3c00af227e
WAF-гигиена (#2443): okn-mk.mkrf.ru имеет тот же unthrottled-request risk shape,
что забанил VPS в WAF ДОМ.РФ. okn_egrkn_client не имел пейсинга/backoff,
okn_objects_sync шлёт до 1500 последовательных GET без пауз.

Добавлено: _wait_rate_limit() (shared 400ms gate между searchMap+detail на одном
WAF-хосте), 429/5xx экспоненциальный backoff (base 2с, cap 60с, Retry-After
honored) в _do_request/_do_detail_request (recursion bounded _MAX_RETRIES=3),
circuit-breaker _DETAIL_FAIL_BREAKER=20 (consecutive fails, reset on success,
break только detail-цикла). Идиомы из nspd_client/objective/gisogd66.

Refs #2445
bot-backend merged commit 53b160ff0a into main 2026-07-05 20:09:19 +00:00
bot-backend deleted branch fix/okn-scraper-backoff 2026-07-05 20:09:19 +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#2461
No description provided.