TRACK 01 / LIVE-DATA PLATFORMS

Live-data platforms: freshness, ordering и восстановление

Опорный материал для команд, которым нужно доказуемо доставлять спортивное состояние от provider feed до клиента. Фокус — порядок событий, corrections, canonical model, replay, backfill и provenance.

PRIMARY SIGNALfreshness / sequence / replay
Технологическая инфраструктура и рабочие экраны
OPERATING QUESTION

Как доказать, что пользователь видит актуальное и непротиворечивое состояние матча?

feeds, canonical model, corrections, streaming, provider failover

Live-data начинается с версии состояния, а не с транспорта

WebSocket, queue или webhook не делают данные свежими сами по себе. На каждом переходе нужен ответ на три вопроса: какое событие считается новым, как распознаётся повтор и что происходит, если correction приходит после уже опубликованной версии. Пока этих правил нет, скорость доставки лишь быстрее распространяет неопределённость.

В рабочем контуре полезно отделять raw-сообщение провайдера от canonical state. Raw хранит то, что реально пришло, вместе с provider ID, timestamp и provenance. Canonical слой связывает это с внутренними сущностями и правилами corrections. Derived данные — статистика, модели, витрины — строятся уже поверх версии, которую можно восстановить и объяснить.

Freshness измеряется на границе пользователя

Ingest lag важен, но не гарантирует, что клиент получил актуальное состояние. Между входом и экраном остаются normalization, queueing, cache, API delivery и reconnect. Поэтому полезно иметь end-to-end marker: event/version time проходит по цепочке и позволяет измерить возраст именно опубликованного состояния.

Если источник присылает ненадёжное время, это ограничение нужно зафиксировать. Можно измерять от внутренней точки приёма, но метрика тогда отвечает на другой вопрос. Лучше честный SLI с понятной границей, чем точная цифра, основанная на времени, которому нельзя доверять.

Corrections — нормальный режим, а не исключение

Спортивные данные исправляются: меняется автор события, уточняется время, отменяется эпизод, приходит более полная версия. Pipeline должен уметь применить correction, обновить materialized state и обозначить, какие downstream-результаты требуют пересчёта. Ручная правка только финальной таблицы ломает lineage и оставляет старые производные значения.

Failover между провайдерами требует общей предметной модели

Переключить endpoint легко; сложнее понять, что event, team и market действительно соответствуют друг другу. Внутренние canonical IDs и versioned mappings уменьшают риск ложного совпадения. Во время failover важны не только availability и latency, но и расхождения: другой источник может иметь иную семантику статусов или corrections.

Recovery заканчивается reconciliation

После gap или backlog недостаточно увидеть нулевую очередь. Нужно доказать, что восстановленный canonical state согласован с контрольным snapshot, пропущенные corrections применены, а клиент после reconnect получил свежую версию. Именно reconciliation превращает технический replay в завершённое восстановление.

Смежные досье: интеграционная архитектура live-систем, карта regulated betting-инфраструктуры и reference card live_state.

МАТЕРИАЛЫ

Маршрут по live-data

Очередь построена от контракта и состояния к диагностике, восстановлению и проверке результата.

CONTROL MATRIX

Проверка состояния по четырём границам

Authority

Где хранится authoritative state и как определяется версия?

Freshness

Как измеряется возраст состояния, а не только latency запроса?

Recovery

Что происходит после gap/reconnect/retry и как доказывается reconciliation?

Evidence

Какие trace/audit идентификаторы позволяют восстановить решение?

ПРАВИЛО ПРОВЕРКИ

Любая цифра freshness должна указывать точку отсчёта и источник времени. Без этого «500 ms» не объясняет, где именно измерена задержка.

СЛЕДУЮЩИЙ МАРШРУТ

Дальше: цена или наблюдаемость

Открыть индекс материалов