Центральный оркестратор для распределенной системы арбитражной торговли.
- Кодовая база активна, собирается и покрыта тестами.
- Завершена Phase 2 (Sprint 1-6):
- WS runtime lifecycle:
connect -> trader.register -> trader.heartbeat -> disconnect - Runtime session lifecycle + persistence в
TRADER_SESSION - Базовый scheduler cycle на активных WS-сессиях
- WS hardening: protocol version check, rate limiting, dedup, payload bounds, unknown-action flood guard
- Phase 2 smoke tooling: runbook + lifecycle smoke script + deterministic WS smoke client
- WS runtime lifecycle:
- Завершена Phase 1.5 finalization:
/metricsendpoint- Prometheus wiring c runtime series (
cts_core_*) + Go/process collectors - integration coverage: health + metrics + ws lifecycle path
- WS observability delta:
- Добавлены метрики отключений:
cts_core_ws_disconnect_total,cts_core_ws_disconnect_close_4009_total,cts_core_ws_disconnect_reason_total{reason="..."}для отслеживания reconnect/close-4009. - Сервер при shutdown шлет WS Close (1000) с reason
server_shutdown, write-deadline унифицирована и настраивается черезsession.write_timeout(дефолт 5s) для всех send/control кадров.
- Добавлены метрики отключений:
Настройка WS write timeout:
- YAML:
session.write_timeout(пример вconf/config.example.yaml=5s). - Рекомендуемый диапазон:
> 0и<= 24h.
trader_idопределяется только из CN клиентского сертификата (mTLS).payload.trader_idне участвует в идентификации.- Для trader WS принимаются только клиентские сертификаты с
OU=Trading. - CN должен быть уникальным в
TRADER.CERTIFICATE_CN. - При ротации сертификата CN должен оставаться неизменным; иначе требуется отдельная миграция identity.
- Для статусов
pending/active/suspendedruntime-логика привязана к CN-derived identity.
Быстрый check /metrics:
curl -k -sS https://localhost:8080/metrics || curl -sS http://localhost:8081/metrics# 1) deps
go mod download
# 2) config
cp conf/config.example.yaml conf/config.yaml
# 3) build
make build
# 4) run
./bin/cts-core -config conf/config.yamlДля локальной проверки БД:
mysql -h 127.0.0.1 -u root -proot -e "USE ct_system; SHOW TABLES;"Стартовые документы:
DOCS_INDEX.md- навигация по актуальным документамDEVELOPMENT_PLAN.md- детальный план (частично устарел, сверяйте с кодом)ARCHITECTURE.md- архитектурные решенияAPI_SPECIFICATION.md- целевой API контрактHSM_KEY_ROTATION.md- текущее состояние ротации ключейCROSS_PROJECT_WWW_GO.md- интеграцияcts-core <-> web-ui-goguides/PHASE2_SMOKE_RUNBOOK.md- smoke-проверка Phase 2 в docker compose
Быстрый smoke запуск (Phase 2):
./tests/smoke_phase2_ws_lifecycle.shИз корня workspace можно запускать через единый entrypoint:
make smoke-core-ws
# Полный прогон с restart/shutdown checks
make smoke-core-ws-fullЭтот smoke-сценарий проверяет hard-cutover модель:
- только
wss://transport для WS; - mTLS handshake с клиентским сертификатом трейдера;
- auto-create трейдера по CN сертификата;
- duplicate CN конфликт: второе одновременное подключение с тем же сертификатом получает
DUPLICATE_CONNECTION; - новый трейдер получает
status=pending; - pending-трейдер не получает assignment в
MONITORING/TRADE.
По умолчанию smoke-скрипт невмешивающийся:
SMOKE_SKIP_UP=1(не делаетdocker compose up -d)SMOKE_NO_RESTART=1(не делает restart/stop/start)
Полный инвазивный режим:
SMOKE_SKIP_UP=0 SMOKE_NO_RESTART=0 ./tests/smoke_phase2_ws_lifecycle.shРекомендуемый стабильный запуск из корня workspace (wss + mTLS + protocol v1):
CTS_WS_PROTOCOL_VERSION=1 \
CTS_WS_CLIENT_CA_PATH=$PWD/volumes/pki/ca/ca.crt \
CTS_WS_CLIENT_CERT_PATH=$PWD/volumes/pki/cts-core/clients/trader-3/trader-3-cts.crt \
CTS_WS_CLIENT_KEY_PATH=$PWD/volumes/pki/cts-core/clients/trader-3/trader-3-cts.key \
CTS_SMOKE_CERTIFICATE_CN=trader-3-cts-client \
make smoke-core-wsРасширенный прогон устойчивости (проверка restart/stop-start):
CTS_WS_PROTOCOL_VERSION=1 \
CTS_WS_CLIENT_CA_PATH=$PWD/volumes/pki/ca/ca.crt \
CTS_WS_CLIENT_CERT_PATH=$PWD/volumes/pki/cts-core/clients/trader-3/trader-3-cts.crt \
CTS_WS_CLIENT_KEY_PATH=$PWD/volumes/pki/cts-core/clients/trader-3/trader-3-cts.key \
CTS_SMOKE_CERTIFICATE_CN=trader-3-cts-client \
SMOKE_SKIP_UP=1 SMOKE_NO_RESTART=0 \
make smoke-core-ws-fullЕсли trader-1 уже держит постоянную WS-сессию, используйте сертификат другого CN (например, trader-3-cts-client) для deterministic smoke.
- Расширять Phase 3 business logic (assignment/resource-aware scheduling) по фиксированному правилу:
- CTS-Core выбирает trader для массива
exchange_ids, но не принимает решениеbuy/sell. buy/sellи локальная стратегия исполнения определяются внутри trader.- Для
task_type=tradeиспользуется latency-aware ранг:- Eligibility: к выбору допускаются только trader в режимах
tradeиboth. - Trader в режиме
monitorисключается из кандидатов дляtrade. score_trade = latency_profile_ms + 1000 * (load_index^2)(меньше = лучше).latency_profile_ms= робастный профиль задержек по всемexchange_ids(worst/p95 + разброс).load_index(0..1) формируется на стороне trader (CPU + RAM + network + очередь задач).
- Eligibility: к выбору допускаются только trader в режимах
- Для
task_type=monitorиспользуется отдельный ранг без latency:score_monitor = 1000 * (trade_load_index^2) + monitor_capacity_penalty + monitor_role_penalty(меньше = лучше).trade_load_index(0..1) отражает загрузку trader именно торговыми задачами.- Приоритет по режиму:
monitor>both>trader. - Пример
monitor_role_penalty:monitor=0,both=100,trader=300. - latency подключения к биржам для monitor-выбора не учитывается.
primaryвыбирается по минимальномуscore_monitor,backup- второй в ранге.
- Trader после подключения регулярно отправляет телеметрию (
trader.heartbeat+metrics.report), CTS-Core агрегирует ее для scheduler. - После
trader.register_ackCTS-Core отдает trader каталог доступных бирж (exchange_id,code,name, endpoints, market types, limits); trader выполняет connectivity test и присылает стартовые метрики. - Для
task_type=tradeлатентность проверяется по всем биржам изcapabilities; выбор по одной бирже недостаточен. - Для
task_type=monitorlatency в ранжировании не участвует.
- Развивать runtime metrics/reporting для scheduler quality signals.
- Поддерживать docs parity с кодом в каждом PR.
services/hsm-serviceservices/traderservices/web-ui-go
В старых документах могут встречаться ссылки на other-sub-system/* и статусы "Phase 0". Актуальная структура в этом workspace: services/*.