Commit graph

2 commits

Author SHA1 Message Date
lekss361
4875ef15c3 fix(scrape-objective): stream-parse lots_pf via ijson to avoid OOM
httpx.Response.json() загружает 607 МБ payload в Python list[dict] -> 2-3 ГБ RAM -> host OOM-killer SIGKILL ForkPoolWorker.

Изменения:
- ObjectiveClient._open_stream() / stream_report() — httpx stream=True
- parse_lots_pf_stream() — ijson.items() с batched UPSERT + commit/5 batch
- _save_raw() принимает payload=None для streamed reports
- objective_raw_reports.payload allowed NULL (миграция 79)
- ijson>=3.2.0 добавлен в pyproject.toml, uv.lock обновлён

Glitchtip BACKEND-1H/-1I (release fce48a8) — OOM на live trigger.
2026-05-17 19:33:43 +03:00
lekss361
aaa5d44e77 feat(objective): integrate api.objctv.ru — auth, schema, weekly sync
backend/app/services/scrapers/objective.py:
  ObjectiveClient — GetToken (Bearer cached в Redis 25 min TTL) +
  GetReport v2 с UseDdu/UseDkp. 4 высокоуровневых метода:
  report_corpuses_summary, report_lots_summary, report_corpuses_per_flat,
  report_lots_per_flat. Retry 401/429/5xx, rate-limit 500ms, brotli.
backend/app/workers/tasks/scrape_objective.py:
  Celery task sync_objective_group — еженедельно тянет 4 канон. отчёта по
  группе, raw payload в objective_raw_reports.
celery_app.py: +include + beat «0 5 * * mon».
data/sql/68_schema_objective.sql: 6 таблиц — runs, raw_reports (jsonb),
oks (готовые ТЭП + escrow/debt), lots, lots_history (per-flat per-day),
complex_mapping (Objective ↔ domrf_kn_objects, is_reviewed workflow).
data/sql/69_objective_smoke.py: stand-alone GetToken + 4 отчёта →
data/raw/objective_smoke/<ts>/. Используется один раз чтобы понять
реальную схему payload перед написанием parser-слоя.
config: OBJECTIVE_API_KEY, OBJECTIVE_DEFAULT_GROUP=Екатеринбург,
OBJECTIVE_SYNC_CRON='0 5 * * mon'.
2026-05-07 21:04:00 +03:00