297 lines
9.0 KiB
Markdown
297 lines
9.0 KiB
Markdown
# Build 059.9 — WebSocket Runtime Protocol
|
||
|
||
**Migration Build**
|
||
|
||
---
|
||
|
||
# Цель Build
|
||
|
||
Build 059.9 открывает новый этап миграции подсистемы получения рыночных данных.
|
||
|
||
До настоящего момента была полностью построена независимая цепочка обработки входящих сообщений:
|
||
|
||
```text
|
||
Raw Message
|
||
│
|
||
Schema Validation
|
||
│
|
||
Parser
|
||
│
|
||
Value Validation
|
||
│
|
||
Mapper
|
||
│
|
||
Canonical Model
|
||
│
|
||
Adapter
|
||
```
|
||
|
||
Данная архитектура уже позволяет корректно обрабатывать сообщения независимо от конкретного транспорта доставки.
|
||
|
||
Следующим этапом становится построение собственного Runtime уровня, который будет отвечать исключительно за транспортировку сообщений.
|
||
|
||
---
|
||
|
||
# Причина появления Runtime
|
||
|
||
Исторически получение данных осуществлялось через класс ExchangeWebSocketClient.
|
||
|
||
Этот класс одновременно выполнял множество различных обязанностей:
|
||
|
||
- открытие соединения;
|
||
- закрытие соединения;
|
||
- reconnect;
|
||
- heartbeat;
|
||
- отправку запросов;
|
||
- получение сообщений;
|
||
- обработку ошибок;
|
||
- маршрутизацию сообщений;
|
||
- работу с конкретной биржей.
|
||
|
||
Подобная архитектура нарушает принцип единственной ответственности (Single Responsibility Principle) и значительно усложняет расширение системы.
|
||
|
||
В новой архитектуре эти обязанности разделяются между несколькими независимыми компонентами Runtime.
|
||
|
||
---
|
||
|
||
# Основная идея новой архитектуры
|
||
|
||
Runtime не должен знать ничего о бизнес-логике.
|
||
|
||
Он отвечает исключительно за транспортный уровень.
|
||
|
||
После завершения всей серии Build'ов структура будет выглядеть следующим образом:
|
||
|
||
```text
|
||
Exchange Runtime
|
||
│
|
||
Connection / Session
|
||
│
|
||
Heartbeat / Reconnect
|
||
│
|
||
Subscription Manager
|
||
│
|
||
WebSocket Transport
|
||
│
|
||
▼
|
||
Unified WebSocket Adapter
|
||
│
|
||
┌──────────────────┼──────────────────┐
|
||
▼ ▼ ▼
|
||
Quote Candle Trades
|
||
│
|
||
▼
|
||
Feed → Handler → Registry
|
||
```
|
||
|
||
Таким образом Runtime становится полностью независимым от конкретного вида сообщений.
|
||
|
||
---
|
||
|
||
# Почему Runtime создаётся отдельно
|
||
|
||
В подсистеме Acquisition уже существует файл
|
||
|
||
```
|
||
acquisition/protocol.py
|
||
```
|
||
|
||
Он содержит контракты уровня получения данных:
|
||
|
||
- InstrumentDocumentSource
|
||
- QuoteDocumentSource
|
||
- CandlesDocumentSource
|
||
- Feed Protocol
|
||
- Handler Protocol
|
||
|
||
Эти контракты ничего не знают о WebSocket.
|
||
|
||
Они работают уже после доставки сообщения.
|
||
|
||
Поэтому смешивать Acquisition Protocol и Runtime Protocol архитектурно неправильно.
|
||
|
||
В результате Runtime получает собственный уровень контрактов.
|
||
|
||
---
|
||
|
||
# Новые контракты Runtime
|
||
|
||
В Build 059.9 создаётся новый файл:
|
||
|
||
```text
|
||
src/market_data/acquisition/runtime/websocket_protocol.py
|
||
```
|
||
|
||
В нём определяются исключительно транспортные контракты:
|
||
|
||
- WebSocketTransportProtocol
|
||
- WebSocketSessionProtocol
|
||
- WebSocketSubscriptionManagerProtocol
|
||
|
||
Все контракты являются Protocol без реализации.
|
||
|
||
---
|
||
|
||
# Что входит в ответственность Runtime
|
||
|
||
Runtime отвечает только за транспортный уровень.
|
||
|
||
Например:
|
||
|
||
- открытие соединения;
|
||
- закрытие соединения;
|
||
- получение транспортных сообщений;
|
||
- отправку транспортных сообщений;
|
||
- жизненный цикл WebSocket Session;
|
||
- управление подписками.
|
||
|
||
Runtime **не выполняет**:
|
||
|
||
- schema validation;
|
||
- parsing;
|
||
- value validation;
|
||
- mapping;
|
||
- business routing;
|
||
- преобразование моделей;
|
||
- обработку рыночной логики.
|
||
|
||
Все эти обязанности уже реализованы в Acquisition.
|
||
|
||
---
|
||
|
||
# Что намеренно НЕ реализуется в Build 059.9
|
||
|
||
В рамках данного Build отсутствуют:
|
||
|
||
- WebSocket клиент;
|
||
- asyncio логика;
|
||
- reconnect;
|
||
- heartbeat;
|
||
- ping/pong;
|
||
- сериализация сообщений;
|
||
- JSON;
|
||
- модели транспортных сообщений;
|
||
- реальные подписки.
|
||
|
||
Build создаёт исключительно архитектурный фундамент.
|
||
|
||
---
|
||
|
||
# План дальнейшего развития Runtime
|
||
|
||
После Build 059.9 развитие Runtime планируется небольшими независимыми этапами.
|
||
|
||
## Build 059.10
|
||
|
||
Transport Message Models
|
||
|
||
Добавление immutable моделей транспортных сообщений.
|
||
|
||
Например:
|
||
|
||
- Connect
|
||
- Disconnect
|
||
- Subscribe
|
||
- Ping
|
||
- Pong
|
||
|
||
---
|
||
|
||
## Build 059.11
|
||
|
||
Subscription Manager
|
||
|
||
Появится полноценное управление активными подписками.
|
||
|
||
---
|
||
|
||
## Build 059.12
|
||
|
||
WebSocket Session
|
||
|
||
Жизненный цикл соединения.
|
||
|
||
---
|
||
|
||
## Build 059.13
|
||
|
||
Reconnect Manager
|
||
|
||
Автоматическое восстановление соединения.
|
||
|
||
---
|
||
|
||
## Build 059.14
|
||
|
||
Heartbeat
|
||
|
||
Поддержание активности соединения.
|
||
|
||
---
|
||
|
||
# Архитектурный принцип миграции
|
||
|
||
Все существующие Parser, Validator, Mapper и Adapter остаются неизменными.
|
||
|
||
Меняется исключительно транспорт доставки сообщений.
|
||
|
||
В результате один и тот же Adapter сможет работать:
|
||
|
||
- со старым ExchangeWebSocketClient;
|
||
- с новым Runtime;
|
||
- с тестовыми сообщениями;
|
||
- с любым будущим источником данных.
|
||
|
||
Это позволяет выполнять миграцию постепенно без остановки работы существующего торгового бота.
|
||
|
||
---
|
||
|
||
# Новое архитектурное соглашение проекта
|
||
|
||
Во время выполнения Build принято дополнительное архитектурное решение.
|
||
|
||
Для крупных подсистем проекта рекомендуется использовать описательные имена файлов вместо слишком общих.
|
||
|
||
Например:
|
||
|
||
Хорошо:
|
||
|
||
```text
|
||
websocket_protocol.py
|
||
market_cache.py
|
||
exchange_service.py
|
||
```
|
||
|
||
Предпочтительно избегать новых файлов с названиями:
|
||
|
||
```text
|
||
protocol.py
|
||
service.py
|
||
utils.py
|
||
helpers.py
|
||
```
|
||
|
||
если их назначение можно описать более конкретно.
|
||
|
||
Это правило принято с расчётом на дальнейший рост проекта и будет постепенно применяться при плановой архитектурной ревизии существующих модулей.
|
||
|
||
---
|
||
|
||
# Проверка Build
|
||
|
||
Выполнены проверки:
|
||
|
||
- compileall
|
||
- unit tests
|
||
- runtime regression
|
||
- git diff --check
|
||
|
||
Все проверки успешно пройдены.
|
||
|
||
---
|
||
|
||
# Итог
|
||
|
||
Build 059.9 не добавляет новую функциональность получения рыночных данных.
|
||
|
||
Его задача — создать фундамент Runtime уровня, который позволит в последующих Build'ах полностью заменить существующий транспорт WebSocket без изменения уже реализованной цепочки обработки сообщений. |