Техническая заметка о разработке игры

Продолжаю писать про разработку своей игры Find the same. Предыдущую часть про мотивацию и цели можете прочитать здесь: Как я начал делать игру

По моей задумке игроки соревнуются вдвоём, в реальном времени на поле из 16 карточек. Каждому даётся время на открытие двух карт и если игрок находит одинаковые изображения, ход остаётся у него, давая ещё одну попытку. В противном случае ход передаётся оппоненту. Во время хода, игроки видят открываемые оппонентом карты.

С подобной механикой связаны типичные проблемы реалтаймовых игр, нужно отслеживать ping игроков и делать предсказания поведения механики так, чтобы интерфейс казался максимально отзывчивым. В Meteor из коробки есть Optimistic UI и он мне не подходил, потому что мне хотелось сделать тоталитарный сервер который управляет всем происходящим на клиенте. Это также даёт более защищенную систему потому как на клиент при инициализации не отправляются данные которые должны быть скрыты.

Вам не нужно заботиться о том, каким образом и в какой момент передать данные на клиент, нужно всего лишь один раз правильно написать запросы, которые автоматически отслеживают изменения данных. С таким подходом, я сделал базовую механику за несколько дней, это было невообразимо воодушевляюще.

Без нового для меня также не обошлось. Передо мной встала проблема, с которой я не сталкивался раньше, а именно отложенное выполнение функций на сервере. Для того, чтобы передавать ход автоматически, на сервере мне нужен был механизм, который следил бы за временем и в нужный момент выполнял действия. Просмотрев разные варианты, я остановился на использовании Redis как хранилище задач и Bull в роли менеджера очередей этих задач. Получилась более громоздкая, но более надёжная система, нежели использование setTimeout.

С помощью Bull я откладываю выполнение задач, могу настраивать повторяемые события и отслеживать статусы всех очередей. В данный момент я использую три очереди: для таймера во время поиска, для таймеров которые управляют всеми таймингами во время игры и таймеров для ботов.

Отслеживание статусов задач, одна из самых важных функций, которая помогла мне сделать более отказоустойчивое приложение. Если по каким либо причинам одна из задач не сможет выполнить функцию, в Bull срабатывает событие, что даёт возможность зафиксировать ошибку, попытаться понять почему она произошла и перезапустить задачу или процесс. Таким образом у меня всегда есть шанс исправить ситуацию.

Сейчас я продолжаю работу над игрой, но теперь это не только программирование. Я начинаю работать над дизайном, улучшением систем отвечающих за реалтайм функциональность и делать стресс тесты, чтобы понять слабые места приложения.