[site-finder][perf] Оптимизировать zone-regulation резолв в /analyze (мемоизация zone_index_at, двойной резолв, timeout) #1850

Closed
opened 2026-06-20 18:40:59 +00:00 by bot-backend · 0 comments
Collaborator

Follow-up из ревью PR #1847 (оживление КСИТ в /analyze, Route 2). Не блокеры — оптимизация hot-path.

1. zone_index_at — live WFS вызов на КАЖДЫЙ analyze даже при тёплом кэше [main]

get_or_fetch_zone_regulation зовёт client.zone_index_at(lon,lat) БЕЗУСЛОВНО (live WFS GetFeature, без мемоизации) перед чтением zone_regulation_cache. Т.е. даже когда регламент закэширован, каждый analyze делает 1 сетевой round-trip (~0.3-0.5с healthy / 3s cap при деградации).
Фикс: мемоизировать lon/lat → zone_index — например LRU по округлённым координатам или по кадастр-кварталу (квартал у участка известен), или маленькая таблица-кэш. Тогда тёплый-кэш analyze = 0 сетевых вызовов.

2. Двойной резолв при обоих флагах

Когда enable_zoning_regulation_in_analyze И enable_ird_analyze оба on — get_or_fetch_zone_regulation зовётся ДВАЖДЫ за запрос (мой merge-блок в parcels.py + build_ird_analyze_block). 2× zone_index_at. Фикс: резолвить один раз и прокидывать результат в оба, либо гейтить.

3. Timeout-константа дрейфует

parcels.py:_ZONE_REGULATION_TIMEOUT_S=3 vs ird_analyze.py:_GEOPORTAL_TIMEOUT_S=4 для того же резолвера. Фикс: единый settings.geoportal_timeout_s.

4. (заметка) db.commit() в резолвере на cache-miss

zone_regulation.py:274 коммитит ВНЕШНЮЮ analyze-транзакцию (которая иначе на SAVEPOINT'ах) при cache-miss. Не баг в текущем диффе (резолвер не менялся), но владельцу резолвера на заметку.

Связано: #1847 (backend КСИТ), #1849 (frontend), #1843 (Route 1 backfill — альтернатива, hot-path-free, но 15k harvest).

Follow-up из ревью PR #1847 (оживление КСИТ в /analyze, Route 2). Не блокеры — оптимизация hot-path. ## 1. `zone_index_at` — live WFS вызов на КАЖДЫЙ analyze даже при тёплом кэше [main] `get_or_fetch_zone_regulation` зовёт `client.zone_index_at(lon,lat)` БЕЗУСЛОВНО (live WFS GetFeature, без мемоизации) перед чтением `zone_regulation_cache`. Т.е. даже когда регламент закэширован, каждый analyze делает 1 сетевой round-trip (~0.3-0.5с healthy / 3s cap при деградации). **Фикс:** мемоизировать `lon/lat → zone_index` — например LRU по округлённым координатам или по кадастр-кварталу (квартал у участка известен), или маленькая таблица-кэш. Тогда тёплый-кэш analyze = 0 сетевых вызовов. ## 2. Двойной резолв при обоих флагах Когда `enable_zoning_regulation_in_analyze` И `enable_ird_analyze` оба on — `get_or_fetch_zone_regulation` зовётся ДВАЖДЫ за запрос (мой merge-блок в parcels.py + `build_ird_analyze_block`). 2× `zone_index_at`. **Фикс:** резолвить один раз и прокидывать результат в оба, либо гейтить. ## 3. Timeout-константа дрейфует `parcels.py:_ZONE_REGULATION_TIMEOUT_S=3` vs `ird_analyze.py:_GEOPORTAL_TIMEOUT_S=4` для того же резолвера. **Фикс:** единый `settings.geoportal_timeout_s`. ## 4. (заметка) `db.commit()` в резолвере на cache-miss `zone_regulation.py:274` коммитит ВНЕШНЮЮ analyze-транзакцию (которая иначе на SAVEPOINT'ах) при cache-miss. Не баг в текущем диффе (резолвер не менялся), но владельцу резолвера на заметку. Связано: #1847 (backend КСИТ), #1849 (frontend), #1843 (Route 1 backfill — альтернатива, hot-path-free, но 15k harvest).
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#1850
No description provided.