Архитектура игры «Аптайм»: C4 и критические пути
Схемы C4 до уровня компонентов и четыре критических пути через sequence: запуск уровня, шаг симуляции потока, правка на паузе и итог с разбором.
«Аптайм» — игра про работу инженера: собираешь сервис из блоков, пускаешь поток пользователей и смотришь, что сломается первым. 43 уровня в пяти группах, от одного сервера до распила монолита. Браузер, без сервера и сборки. Здесь описано, как она устроена: схемы C4 до уровня компонентов и четыре пути, на которых всё держится.
C4: контекст и контейнеры
Уровень 1. Система и её окружение
Уровень 2. Контейнеры
C4 уровня 3: компоненты контекстов
Все части — обычные скрипты с реестром L, как в остальных играх репозитория: L.def объявляет часть, L.use берёт её и выполняет при первом обращении. Цикл зависимостей падает сразу с понятной ошибкой. Общий экспорт части складывают в пространство имён U из core.js.
Симуляция
- Модель хранит каталог из 25 блоков, допустимые связи, цены в месяц, очередь Erlang C и кривую трафика уровня.
- Sim.step раз в полсекунды игрового времени: аварии, масштабирование, состояние узлов по нагрузке прошлого тика, затем поток сегментов по трубам со стеком вызовов и тайм-аутами.
- Аварии — 27 видов: всплеск, падение зоны, региона или облака, истёкший сертификат, плохой выпуск, утечка памяти, боты и другие.
- Итог сводит доступность, ожидание (p95), деньги, проверки уровня и звёзды; Прогон делает то же без экрана и разгоняет трафик в нагрузочном тесте.
Поле
- Бак — блок с заливкой: уровень показывает загрузку, цвет — справляется ли блок.
- Труба: толщина — объём потока, пунктир — асинхронно, свой цвет у команд, событий, сокетов и общей базы.
- Туман: на уровнях про наблюдаемость данные блоков скрыты, пока не поставлены мониторинг, логи или трейсинг.
Интерфейс
- i18n выбирает язык, переводит по ключу и описывает настройки каждого блока: переключатели, ступени, числа.
- Инспектор показывает только те настройки, которые уровень уже открыл: сложность прибавляется постепенно.
- Разбор после забега: решение в виде ADR с плюсами и минусами, путь запроса по частям ожидания и графики.
Четыре критических пути
1. Запуск и уровень
2. Шаг симуляции
3. Правка на паузе
4. Итог и разбор
Правила, на которых всё держится
- Симуляция не знает об экране. Ни DOM, ни SVG: поле читает её состояние после шага.
- Уровень — данные. Трафик, аварии, цели и стартовая схема; слова — в двух словарях с одинаковыми ключами.
- Каждый уровень доказан. Тест прогоняет наивную схему (должна провалиться) и эталонную (должна пройти на две звезды и выше) для всех 43 уровней и дневных заданий.
- Один шаг — полсекунды. Фиксированный шаг даёт одинаковый забег на любой машине.
- Сложность по капле. Новые блоки и настройки открываются уровнем, на котором они нужны.
Слабые места
| Где | Что не так |
|---|---|
| Большой интерфейс | ui/app.js на 870 строк держит все экраны, инспектор, обучение и режимы в одном замыкании. |
| Длинный шаг | Sim.step около 350 строк: поток, повторы, тайм-ауты и аварии в одном методе. |
| Общее пространство имён | Части пишут экспорт в U, поэтому зависимость видна по L.use, а конкретное имя — только по поиску. |
| Баланс константами | Числа в K подобраны вручную; держит их только тест наивных и эталонных схем. |
| Тест в браузере по времени | Проверка интерфейса ждёт по секундам и на холодном старте браузера иногда опаздывает. |