Odds ingestion and distribution¶
Тип материала — референсная архитектура. HYPOTHETICAL — проектные схемы и контракты. INFERENCE — рекомендации и trade-offs.
Бизнес-задача¶
Поставлять текущие коэффициенты при пропусках, дубликатах и смене провайдера.
Функциональные требования¶
Нормализовать event и selection IDs, currency-independent odds, status и revisions. Поддержать snapshots, deltas и suspension.
NFR и критический путь¶
Serving freshness измеряется по source event time и ingest time. Критический check использует authoritative quote revision, а не latency UI feed.
Компоненты и поток¶
flowchart LR
A["Provider"] --> B["Normalizer and gap detector"] --> C["Market state"] --> D["Versioned distribution"] --> E["Client quote"]
Контракты и владельцы состояния¶
Feed envelope содержит provider, epoch, sequence, event time, market and selection. Внутренний quote имеет revision и expiry. Raw payload нужен для replay.
Транзакционные границы¶
Принимать delta только с ожидаемым predecessor. Обновление market state и publish intent атомарно в пределах shard.
Ordering, deduplication и idempotency¶
Уникальный provider epoch + sequence. Snapshot открывает новую generation. Старый writer fenced. Timestamp не заменяет sequence.
Отказ и восстановление¶
Gap делает рынок suspended. Запросить snapshot с позицией, догнать retained tail и сверить checksum или keyset. При старте с чужого epoch нужен явный handoff.
Сверка¶
Сравнить число и IDs active selections, версии и status на одном cut. Проверить расхождение quote served/authoritative.
Мониторинг и алерты¶
Source lag, gap/reorder count, stale quote rejects и reconnects. Для каждого сигнала определить scope, cut и действие оператора. Порог подбирается по согласованному бюджету и наблюдаемой нагрузке.
Технологии и trade-offs¶
RPC к владельцу даёт свежую проверку ценой сетевого hop. Cache distribution расширяет fan-out, а validation остаётся у writer.
Вопросы на собеседовании¶
Можно ли проиграть delta после свежего snapshot? Только при совместимом epoch и позиции выше snapshot frontier.