Разработка
Лайв-счёт в масштабе: что происходит между касанием судьи и экраном болельщика
Очко набрано на корте номер восемь в школьном спортзале без сигнала. Через две секунды оно уже на телефоне в другой стране. Вот какой путь оно проходит.
Розыгрыш заканчивается на корте восемь. Судья один раз касается экрана. Через одну-три секунды это очко появляется на телефоне бабушки, которая смотрит из другой страны, на публичном табло турнира, в сетке, которая продвинется после матча, и в наборе данных, который читает движок аналитики.
В таком описании всё выглядит просто. Всё дело в том, что корт восемь находится в школьном спортзале с двумя делениями сигнала, судья — волонтёр, который открывал приложение дважды, а ещё двадцать три корта делают то же самое одновременно.
Правило первое: планшету не должна быть нужна сеть
Самое значимое архитектурное решение в лайв-счёте — что происходит при потере связи, ведь на индийских турнирных площадках связь пропадает постоянно. Спортзалы — это коробки со стальным каркасом. Залы заполняются сотнями людей, подключённых к одной базовой станции. Wi-Fi, который работал при настройке в пятницу, к десяти утра в субботу непригоден.
Поэтому приложение подсчёта локально самостоятельно. Касание записывает очко, обновляет состояние на экране, применяет правила вида спорта — это гейм-пойнт, меняется ли подача, закончилась ли партия — и записывает событие в локальную очередь. Всё это происходит независимо от наличия сети за несколько миллисекунд, потому что по сети ничего не запрашивается.
Затем очередь передаётся на сервер, когда это возможно, в строгом порядке, и каждое событие несёт собственный порядковый номер и метку времени. Пятиминутный обрыв связи даёт зрителям пятиминутную задержку и ровно нулевое влияние на матч. Судья никогда не видит индикатор загрузки, а счёт никогда не бывает неверным.
Правило второе: никогда не доверяйте арифметике клиента
Планшет считает счёт, чтобы судья получил мгновенный отклик. Сервер пересчитывает его из исходного потока событий тем же движком правил. Если они расходятся, побеждает сервер, а планшет исправляется.
Это важно, потому что клиенты расходятся с истиной. Приложение, которое шесть часов было открыто, дважды уходило в фон и один раз получило событие не по порядку, может оказаться в состоянии, которое выглядит правдоподобно и при этом неверно. Повторное проигрывание событий на сервере означает, что итоговый счёт всегда — чистая функция того, что реально произошло, и именно это позволяет судье исправить очко трёхрозыгрышной давности, ничего не запутав ниже по цепочке. Исправление — просто ещё одно событие; всё, что после него, пересчитывается.
Один поток событий, много читателей
Всё, что видит зритель, сетка, оверлей трансляции или аналитическая модель, получено из одного и того же упорядоченного потока событий. Поэтому сетка на странице жеребьёвок и счёт на лайв-странице никогда не могут противоречить друг другу: это не две синхронизируемые системы, а две проекции одного журнала.
Правило третье: основной трафик идёт на чтение
Двадцать четыре корта, дающие событие раз в тридцать секунд, — это ничтожная нагрузка на запись: примерно одна запись в секунду на весь турнир. Чтение — совсем другая задача. У популярного финала тысячи людей могут одновременно опрашивать один и тот же матч, и каждый ожидает актуального числа.
Чтение обслуживается из кэша, который поток событий сбрасывает при записи, поэтому запрос зрителя почти никогда не доходит до базы данных. Поэтому профиль нагрузки турнира такой перекошенный и такой управляемый: дорого стоит не сам спорт, а аудитория, и вся аудитория запрашивает одни и те же несколько чисел.
Правило четвёртое: интерфейс судьи — это весь продукт
Ничто из перечисленного не имеет значения, если волонтёр у корта не может пользоваться приложением под давлением.
Экран подсчёта для каждого вида спорта показывает минимальный набор элементов управления, который нужен этому виду спорта, и ничего лишнего. В бадминтоне — две крупные кнопки очков и индикатор подачи. В борьбе нужны баллы, предупреждения и туше. В баскетболе — часы. Делать интерфейсы под конкретные виды спорта вместо одного настраиваемого экрана — больше работы, и это не обсуждается: универсальный интерфейс означает, что волонтёр ищет нужную кнопку, пока матч ждёт.
- Элементы управления рассчитаны на большой палец и планшет, который держат под углом, в зале с плохим освещением.
- Отмена в одно касание и всегда под рукой, потому что исправление ошибочного касания должно быть быстрее самого ошибочного касания.
- Состояние сохраняется, даже если приложение закрыли, планшет сел или судью сменили посреди матча.
- Никаких модальных окон во время розыгрыша. Никогда.
Что в сумме получается
Через этот конвейер уже прошло примерно 150 000 матчей. Нас интересует не пропускная способность и не задержка — с ними всё в порядке. Важно, что за всё это время количество матчей, в которых опубликованный результат пришлось исправлять из-за того, что система потеряла или исказила счёт, равно числу, которое должен иметь право заявить официальный протокол: ноль.