Build 060.28: implement Persistent Checkpoint and Startup Recovery
This commit is contained in:
@@ -38,12 +38,16 @@ from src.market_data.acquisition.runtime.websocket_subscription_manager import (
|
||||
from src.market_data.acquisition.trade_stream_runtime_composition import (
|
||||
build_trade_stream_runtime_composition,
|
||||
)
|
||||
from src.market_data.storage.contracts import (
|
||||
TradeCheckpointStorageProtocol,
|
||||
)
|
||||
|
||||
|
||||
def build_trade_stream_production_runtime(
|
||||
settings: Settings,
|
||||
*,
|
||||
trade_observation_sink: TradeObservationSinkProtocol | None = None,
|
||||
checkpoint_storage: TradeCheckpointStorageProtocol | None = None,
|
||||
) -> TradeStreamProductionRuntime | None:
|
||||
"""
|
||||
Собрать Production Trade Stream Runtime без запуска lifecycle.
|
||||
@@ -53,10 +57,31 @@ def build_trade_stream_production_runtime(
|
||||
Runtime создаются один раз и затем передаются по identity.
|
||||
"""
|
||||
trade_stream = settings.trade_stream
|
||||
storage_enabled = settings.market_data_storage.enabled
|
||||
|
||||
if not trade_stream.enabled:
|
||||
if storage_enabled:
|
||||
raise RuntimeError(
|
||||
"Trade Stream must be enabled when Market Data "
|
||||
"Storage is enabled."
|
||||
)
|
||||
|
||||
return None
|
||||
|
||||
if storage_enabled and (
|
||||
trade_observation_sink is None
|
||||
or checkpoint_storage is None
|
||||
):
|
||||
raise RuntimeError(
|
||||
"Enabled Market Data Storage requires both Trade "
|
||||
"observation sink and checkpoint storage."
|
||||
)
|
||||
|
||||
if not storage_enabled and checkpoint_storage is not None:
|
||||
raise RuntimeError(
|
||||
"Checkpoint storage requires enabled Market Data Storage."
|
||||
)
|
||||
|
||||
headers = {
|
||||
"Origin": settings.exchange_base_url.rstrip("/"),
|
||||
"Content-Type": "application/json",
|
||||
@@ -105,6 +130,12 @@ def build_trade_stream_production_runtime(
|
||||
),
|
||||
trade_observation_sink=trade_observation_sink,
|
||||
max_recovery_window_ms=trade_stream.recovery_window_ms,
|
||||
checkpoint_storage=checkpoint_storage,
|
||||
checkpoint_venue=(
|
||||
settings.exchange_name
|
||||
if checkpoint_storage is not None
|
||||
else None
|
||||
),
|
||||
)
|
||||
|
||||
return TradeStreamProductionRuntime(
|
||||
@@ -128,4 +159,13 @@ def build_trade_stream_production_runtime(
|
||||
runtime_supervisor=composition.runtime_supervisor,
|
||||
runtime_scheduler=composition.runtime_scheduler,
|
||||
symbols=trade_stream.symbols,
|
||||
startup_recovery_coordinator=(
|
||||
composition.runtime_startup_recovery_coordinator
|
||||
),
|
||||
subscription_ack_timeout_seconds=(
|
||||
trade_stream.subscription_ack_timeout_seconds
|
||||
),
|
||||
startup_market_buffer_capacity=(
|
||||
trade_stream.startup_market_buffer_capacity
|
||||
),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user