288 lines
8.9 KiB
Markdown
288 lines
8.9 KiB
Markdown
# Build 042 — Удаление MarketPriceCache
|
||
|
||
## Статус
|
||
|
||
**Завершён**
|
||
|
||
---
|
||
|
||
## 1. Цель Build 042
|
||
|
||
Целью Build 042 было провести аудит зависимостей legacy-компонента `MarketPriceCache`, определить безопасный способ его удаления и устранить compatibility facade без нарушения работы существующего Quotes Feed, REST fallback, WebSocket runtime и потребителей котировок.
|
||
|
||
Основное ограничение миграции:
|
||
|
||
> Legacy-компонент может быть удалён только после подтверждения, что его поведение полностью покрывается целевым `QuoteStore` и что все runtime-потребители переведены без изменения существующих контрактов.
|
||
|
||
---
|
||
|
||
## 2. Исходное состояние
|
||
|
||
До Build 042 в проекте существовал legacy-компонент:
|
||
|
||
```text
|
||
src/integrations/exchange/market_cache.py
|
||
```
|
||
|
||
с классом:
|
||
|
||
```text
|
||
MarketPriceCache
|
||
```
|
||
|
||
`MarketPriceCache` использовался как compatibility facade над:
|
||
|
||
```text
|
||
src/storage/quote_store.py
|
||
```
|
||
|
||
и внутренне содержал общий экземпляр `InMemoryQuoteStore`.
|
||
|
||
Основными потребителями были:
|
||
|
||
```text
|
||
src/integrations/exchange/service.py
|
||
src/integrations/exchange/market_stream.py
|
||
src/integrations/exchange/market_data_runner.py
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Результаты аудита
|
||
|
||
Аудит подтвердил, что `MarketPriceCache` не содержал самостоятельной бизнес-логики хранения котировок. Его обязанности ограничивались делегированием операций `set`, `get` и `clear` в `QuoteStore`, нормализацией `runtime_key`, использованием фиксированного `source_name` и предоставлением глобального shared store через class-level `_store`.
|
||
|
||
Фактическое хранение данных уже выполнялось через:
|
||
|
||
```text
|
||
src/storage/quote_store.py
|
||
```
|
||
|
||
Основные контракты:
|
||
|
||
```text
|
||
QuoteStoreProtocol
|
||
InMemoryQuoteStore
|
||
```
|
||
|
||
Таким образом, `MarketPriceCache` являлся промежуточным compatibility facade и не был необходим как самостоятельный архитектурный слой.
|
||
|
||
---
|
||
|
||
## 4. Критические семантики, сохранённые при удалении
|
||
|
||
### 4.1. Общий shared Quote Store
|
||
|
||
Все основные производители и потребители котировок продолжают работать с одним общим экземпляром `QuoteStore`.
|
||
|
||
```text
|
||
WebSocket / REST
|
||
↓
|
||
Quote model
|
||
↓
|
||
shared QuoteStore
|
||
↓
|
||
ExchangeService / runtime consumers
|
||
```
|
||
|
||
### 4.2. Изоляция по runtime_key
|
||
|
||
Сохранена изоляция котировок между runtime-контекстами, включая:
|
||
|
||
```text
|
||
auto
|
||
debug_auto
|
||
default
|
||
```
|
||
|
||
Ключ хранения остаётся логически эквивалентным:
|
||
|
||
```text
|
||
(source_name, runtime_key, symbol)
|
||
```
|
||
|
||
### 4.3. Нормализация runtime_key
|
||
|
||
Сохранена нормализация:
|
||
|
||
```text
|
||
" AUTO " → "auto"
|
||
" Debug_Auto " → "debug_auto"
|
||
```
|
||
|
||
### 4.4. Нормализация symbol
|
||
|
||
Сохранена нормализация символов при операциях чтения, записи и очистки.
|
||
|
||
```text
|
||
" btc/usd_leverage " → "BTC/USD_LEVERAGE"
|
||
```
|
||
|
||
### 4.5. Семантика clear()
|
||
|
||
Сохранена возможность точечной и общей очистки `QuoteStore` по `source_name`, `runtime_key`, `symbol`, комбинации фильтров и полной очистке store.
|
||
|
||
### 4.6. REST fallback
|
||
|
||
Удаление `MarketPriceCache` не нарушило восстановленный в Build 040 REST fallback. Если свежая котировка отсутствует в shared `QuoteStore`, `ExchangeService` сохраняет возможность загрузить котировку через новый Quotes Feed acquisition pipeline и сохранить полученный `Quote` в общий store.
|
||
|
||
---
|
||
|
||
## 5. Выполненные изменения
|
||
|
||
В рамках Build 042:
|
||
|
||
- удалён compatibility facade `MarketPriceCache`;
|
||
- удалён файл `src/integrations/exchange/market_cache.py`;
|
||
- удалён legacy-набор тестов `tests/unit/integrations/exchange/test_market_cache.py`;
|
||
- `ExchangeService` переведён на прямую работу с shared `QuoteStore`;
|
||
- `MarketDataRunner` переведён на прямую работу с shared `QuoteStore`;
|
||
- `market_stream` переведён на прямую работу с shared `QuoteStore`;
|
||
- сохранена runtime isolation;
|
||
- сохранена нормализация символов и runtime keys;
|
||
- сохранена семантика очистки;
|
||
- сохранён REST fallback;
|
||
- сохранены существующие публичные контракты получения котировок.
|
||
|
||
---
|
||
|
||
## 6. Архитектурный результат
|
||
|
||
До Build 042:
|
||
|
||
```text
|
||
WebSocket / REST
|
||
↓
|
||
Quote
|
||
↓
|
||
MarketPriceCache
|
||
↓
|
||
InMemoryQuoteStore
|
||
```
|
||
|
||
После Build 042:
|
||
|
||
```text
|
||
WebSocket / REST
|
||
↓
|
||
Quote
|
||
↓
|
||
shared QuoteStore
|
||
↓
|
||
ExchangeService / runtime consumers
|
||
```
|
||
|
||
Удалён лишний промежуточный слой `MarketPriceCache`. `QuoteStore` теперь является непосредственным storage-контрактом для канонических моделей `Quote`.
|
||
|
||
---
|
||
|
||
## 7. Проверка тестами
|
||
|
||
### Quote Store
|
||
|
||
```text
|
||
python -m pytest -q tests/unit/storage/test_quote_store.py
|
||
```
|
||
|
||
Результат:
|
||
|
||
```text
|
||
64 passed in 0.04s
|
||
```
|
||
|
||
### ExchangeService quote contracts
|
||
|
||
```text
|
||
python -m pytest -q tests/unit/integrations/exchange/test_service_quote.py tests/unit/integrations/exchange/test_service_execution_quote.py
|
||
```
|
||
|
||
Результат:
|
||
|
||
```text
|
||
11 passed in 0.11s
|
||
```
|
||
|
||
### Market runtime
|
||
|
||
```text
|
||
python -m pytest -q tests/unit/integrations/exchange/test_market_data_runner.py tests/unit/integrations/exchange/test_market_stream.py
|
||
```
|
||
|
||
Результат:
|
||
|
||
```text
|
||
15 passed in 0.09s
|
||
```
|
||
|
||
### Полный regression suite
|
||
|
||
```text
|
||
python -m pytest -q
|
||
```
|
||
|
||
Результат:
|
||
|
||
```text
|
||
613 passed in 2.37s
|
||
```
|
||
|
||
Уменьшение общего количества тестов с `614` до `613` является ожидаемым результатом удаления legacy-файла:
|
||
|
||
```text
|
||
tests/unit/integrations/exchange/test_market_cache.py
|
||
```
|
||
|
||
---
|
||
|
||
## 8. Контроль отсутствия legacy-зависимостей
|
||
|
||
Выполнена финальная проверка:
|
||
|
||
```text
|
||
grep -RIn --exclude-dir="__pycache__" --exclude="*.pyc" -E "\bMarketPriceCache\b|integrations\.exchange\.market_cache|market_cache" src tests
|
||
```
|
||
|
||
Результат:
|
||
|
||
```text
|
||
пусто
|
||
```
|
||
|
||
Это подтверждает отсутствие оставшихся ссылок на `MarketPriceCache`, `src.integrations.exchange.market_cache` и `market_cache`.
|
||
|
||
---
|
||
|
||
## 9. Итог Build 042
|
||
|
||
Build 042 завершён успешно.
|
||
|
||
Подтверждено:
|
||
|
||
- legacy `MarketPriceCache` полностью удалён;
|
||
- прямые зависимости от `market_cache.py` отсутствуют;
|
||
- shared `QuoteStore` стал непосредственным storage-механизмом котировок;
|
||
- WebSocket и REST пути используют каноническую модель `Quote`;
|
||
- runtime isolation сохранена;
|
||
- REST fallback сохранён;
|
||
- полный regression suite проходит без ошибок;
|
||
- архитектура готова к финальной проверке Quotes Feed.
|
||
|
||
---
|
||
|
||
## 10. Следующий этап
|
||
|
||
```text
|
||
Build 043 — Финальная архитектурная проверка Quotes Feed
|
||
```
|
||
|
||
Цель Build 043:
|
||
|
||
- проверить целостность всей архитектурной цепочки Quotes Feed;
|
||
- подтвердить отсутствие legacy quote parsing;
|
||
- подтвердить отсутствие legacy quote cache facade;
|
||
- проверить REST и WebSocket пути получения котировок;
|
||
- проверить единый canonical `Quote`;
|
||
- проверить Feed → Handler → Adapter → Validation → Mapper → Storage → Consumer flow;
|
||
- проверить границы ответственности модулей;
|
||
- подтвердить готовность Quotes Feed к завершению миграции.
|