Files
dzentra_bot/docs/migrations/build_042.md

8.9 KiB
Raw Blame History

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-компонент:

src/integrations/exchange/market_cache.py

с классом:

MarketPriceCache

MarketPriceCache использовался как compatibility facade над:

src/storage/quote_store.py

и внутренне содержал общий экземпляр InMemoryQuoteStore.

Основными потребителями были:

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.

Фактическое хранение данных уже выполнялось через:

src/storage/quote_store.py

Основные контракты:

QuoteStoreProtocol
InMemoryQuoteStore

Таким образом, MarketPriceCache являлся промежуточным compatibility facade и не был необходим как самостоятельный архитектурный слой.


4. Критические семантики, сохранённые при удалении

4.1. Общий shared Quote Store

Все основные производители и потребители котировок продолжают работать с одним общим экземпляром QuoteStore.

WebSocket / REST
        ↓
    Quote model
        ↓
 shared QuoteStore
        ↓
 ExchangeService / runtime consumers

4.2. Изоляция по runtime_key

Сохранена изоляция котировок между runtime-контекстами, включая:

auto
debug_auto
default

Ключ хранения остаётся логически эквивалентным:

(source_name, runtime_key, symbol)

4.3. Нормализация runtime_key

Сохранена нормализация:

"  AUTO  " → "auto"
" Debug_Auto " → "debug_auto"

4.4. Нормализация symbol

Сохранена нормализация символов при операциях чтения, записи и очистки.

" 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:

WebSocket / REST
        ↓
      Quote
        ↓
 MarketPriceCache
        ↓
 InMemoryQuoteStore

После Build 042:

WebSocket / REST
        ↓
      Quote
        ↓
 shared QuoteStore
        ↓
 ExchangeService / runtime consumers

Удалён лишний промежуточный слой MarketPriceCache. QuoteStore теперь является непосредственным storage-контрактом для канонических моделей Quote.


7. Проверка тестами

Quote Store

python -m pytest -q tests/unit/storage/test_quote_store.py

Результат:

64 passed in 0.04s

ExchangeService quote contracts

python -m pytest -q   tests/unit/integrations/exchange/test_service_quote.py   tests/unit/integrations/exchange/test_service_execution_quote.py

Результат:

11 passed in 0.11s

Market runtime

python -m pytest -q   tests/unit/integrations/exchange/test_market_data_runner.py   tests/unit/integrations/exchange/test_market_stream.py

Результат:

15 passed in 0.09s

Полный regression suite

python -m pytest -q

Результат:

613 passed in 2.37s

Уменьшение общего количества тестов с 614 до 613 является ожидаемым результатом удаления legacy-файла:

tests/unit/integrations/exchange/test_market_cache.py

8. Контроль отсутствия legacy-зависимостей

Выполнена финальная проверка:

grep -RIn   --exclude-dir="__pycache__"   --exclude="*.pyc"   -E "\bMarketPriceCache\b|integrations\.exchange\.market_cache|market_cache"   src tests

Результат:

пусто

Это подтверждает отсутствие оставшихся ссылок на 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. Следующий этап

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 к завершению миграции.