Экран спортсбука выглядит статичным: список матчей, столбец коэффициентов. Под ним фид коэффициентов — это поток из тысяч мелких изменений, и задача оператора — применить каждое из них в правильном порядке. Этот гайд проходит по потоку от первого запроса до рассчитанной ставки.
1. Модель данных
Почти каждый фид использует одну и ту же иерархию:
- Вид спорта: футбол, теннис, киберспорт.
- Турнир или лига: Premier League, ATP Tokyo, League of Legends Worlds.
- Событие: один матч со временем начала и участниками.
- Рынок: один вопрос о событии, например 1X2, тотал больше/меньше 2,5 гола или фора по картам.
- Исход: один ответ с коэффициентом и статусом (активен, приостановлен, рассчитан).
У каждого элемента есть стабильный идентификатор. Большинство ошибок интеграции возникает, когда названия используют как идентификаторы: написание названий команд меняется, ID — нет.
2. Снапшот, затем дельты
При старте клиент запрашивает снапшот — полное текущее состояние. Дальше он получает дельты: короткие сообщения вида «эта цена сдвинулась», «этот рынок приостановлен», «это событие началось».
Хорошие фиды нумеруют дельты. Nocturn Sport, например, описывает свой фид как полный снапшот плюс версионированные дельты. Если у клиента версия N, а приходит N+2, он понимает, что сообщение потеряно, и перезагружается, а не показывает устаревший коэффициент. Фиды без версий вынуждают клиента гадать — а так букмекеры и оказываются с позавчерашними коэффициентами в линии.
3. Push и pull
В лайве футбольные коэффициенты могут меняться несколько раз в минуту, поэтому лайв-фиды обычно отправляют (push) сообщения по постоянному соединению. Прематч-цены движутся достаточно медленно, чтобы их можно было запрашивать (pull) по HTTP раз в несколько секунд. Многие операторы используют оба способа: pull для прематч-каталога, push для лайва.
4. Приостановки
Приостановка — это сигнал фида «прямо сейчас ставки на это не принимать». Поводы: гол, пенальти, брейк на подаче, окончание карты или потеря поставщиком собственного источника данных. Клиент должен применять приостановки быстрее всего остального: цена, принятая в первые секунды после гола, — классический способ потерять деньги.
Прематч-рынки тоже закрываются до начала. Nocturn Sport, например, закрывает их за минуту до старта.
5. Приём ставки
Если API не ограничивается публикацией цен, приём ставки идёт по схеме:
- Клиент отправляет выбор, показанный им коэффициент и сумму с уникальным ID запроса.
- Сервер проверяет, что цена всё ещё действительна, а рынок открыт.
- Ставка принимается, отклоняется или предлагается новый коэффициент.
- Если сеть дала сбой, клиент повторяет запрос с тем же ID, и сервер возвращает исходный ответ, не создавая вторую ставку.
Последний шаг — идемпотентность — защищает и баланс игрока, и учёт оператора.
6. Расчёт
Когда событие заканчивается, фид публикует результаты по исходам: выигрыш, проигрыш, возврат или половина выигрыша и половина проигрыша для четвертных линий вроде азиатских фор. Платформа рассчитывает по ним каждую ставку. Исправления случаются: результат могут изменить после проверки, поэтому процесс расчёта должен уметь корректно пересчитывать.
7. Что протестировать до запуска
- Оборвите соединение посреди матча и проверьте восстановление.
- Воспроизведите дельту не по порядку и проверьте, заметит ли это клиент.
- Отправьте одну и ту же ставку дважды с одним ID запроса.
- Рассчитайте экспресс, в котором одно событие ушло в возврат.
Фид, прошедший эти четыре теста, готов к субботнему вечеру.
Частые вопросы
Чем снапшот отличается от дельты?
Снапшот — полное текущее состояние всех событий, рынков и коэффициентов. Дельта содержит только то, что изменилось с определённой версии. Клиент один раз загружает снапшот, а затем по порядку применяет дельты.
Зачем дельтам номера версий?
Чтобы клиент мог заметить пропуск. Если у него версия 1204, а приходит 1206, он понимает, что 1205 потерялась, и перезагружается, вместо того чтобы показать неверный коэффициент.
Почему рынки приостанавливаются?
Потому что цена больше не безопасна: гол, красная карточка, брейк на подаче или потеря связи с источником данных. Приостановленный рынок не принимает ставки, пока не откроется с новой ценой.
Отвечает ли фид коэффициентов за приём ставок?
Одни отвечают, другие нет. Чистый фид только публикует цены. API спортсбука добавляет приём ставок, историю и расчёт, обычно с уникальным ID запроса для каждой ставки, чтобы повторы не удваивали сумму.
Push или pull: какая доставка лучше?
Push (поток сообщений или сокет) подходит для лайва, где коэффициенты меняются ежесекундно. Pull (опрос по HTTP) проще и для прематча часто достаточен.