Архитектура

По историческим причинам «Сказка» — монолитный проект с сильной связанностью, это начало усложнять реализацию новых фич. Поэтому сейчас он переписывается на микросервисы. Пока идёт активная фаза рефакторинга, сервисы выделяются логически, но не выносятся из основного репозитория (ложаться в соседние каталоги). Когда крупные изменения закончатся, сервисы будут разнесены в разные репозитории.

На этой странице описана архитектура игры, какой она должна стать.

Базовая структура

../_images/architecture.png

Стрелками указано использование сервисами друг друга.

Все сервисы игры можно разделить на две группы:

  • frontend — сервисы, с которыми так или иначе взаимодействуют пользователи.

  • backend — сервисы, не доступные напрямую для пользователей.

Frontend сервисы проверяют права доступа и используют backend сервисы для получения данных и инициации изменений. Backend сервисы реализуют специализированные куски логики и не делают неспецифичных проверок (например, не проверяют права доступа).

Backend сервисы недоступны извне, доверяют всем клиентам и не реализуют GUI (предоставляют только API).

Коммуникация сервисов происходит через передачу сообщений в формате Protocol Buffers 3 по протоколу HTTP.

Существующие сервисы

Текущий список сервисов.

  • the_tale — сайт игры (сейчас содержит и основную логику);

  • tt_diary — хранилище сообщений в дневнике героя;

  • tt_market — рынок;

  • tt_personal_messages — личные сообщения;

  • tt_storage — хранилище предметов игрока (в рамках Сказки, карты судьбы).

  • tt_bank — хранилище игровой валюты с поддержкой транзакций.

  • tt_timers — управление таймерами (например, на получение карты), по истечении таймера делает заданные http запрос.

  • tt_impacts — учёт численных «воздействий» одних сущностей на другие. Например, влияние героев на Мастеров.

  • tt_events_log — хранилище истории игровых событий с привязкой к «тегам» и фильтром по ним.

  • tt_effects — хранилище эффектов, действующих на объекты игры.

  • tt_matchmaker — простой сервис поиска соперника для pvp и отслеживания активных боёв.

  • tt_properties — хранилище свойств объектов, нужных в частных случаях логики (например, флаг «разрешить приглашать игрока в клан»).

  • tt_uniquer — сервис выделения уникальных целочисленных идентификаторов для строк.

the_tale

Вся функциональность игры: как логика, так и инфраструктура (форум, регистрация, лингквистика, etc).

По мере рефакторинга в этом компоненте останется только сам сайт.

tt_diary

Сервис хранит последние сообщения в дневнике героя и управляет их количеством.

tt_market

Реализация рынка торговли предметами.

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • выставление предмета на продажу;

  • возвращение предмета с продажи;

  • покупка предмета;

  • получение информации о выставленных предметах;

  • получение списка выставленных предметов конкретного типа.

  • логирование всех операций.

tt_personal_messages

Личные сообщения игроков.

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • создание сообщений;

  • удаление сообщений;

  • получение списка сообщений (входящих/исходящих, по фильтру);

  • поиск сообщений;

tt_storage

Предметы игрока. Используется для хранения карт судьбы.

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • помещение предмета в хранилище;

  • удаление предмета из хранилища;

  • передача предмета другому игроку;

  • перемещение предмета между «карманами» хранилища;

  • логирование всех операций.

tt_bank

Хранилище игровой валюты с поддержкой транзакций.

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • болучение баланса аккаунта в каждой валюте;

  • транзакции: начал, окончание, откат;

tt_timers

Управление таймерами (например, на получение карты или постройки здания), по истечении таймера делает заданные http запрос.

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • создание таймера с заданными параметрами;

  • изменение скорости выполнения таймера;

  • http запрос по истечению таймера;

  • автопродление таймера.

tt_impacts

Учёт численных «воздействий» одних сущностей на другие. Например, влияние героев на Мастеров, учёт известности героев, учёт голосов за запись в Книге Судеб, etc.

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • добавление воздействия;

  • получение списка последних воздействий;

  • получение суммарных воздействий на перечисленные сущности;

  • получение суммарных воздействий от указанной сущнсти на сущности переданных типов;

  • получение рейтинга сущностей, больше всего повлиявших на указанные сущности;

  • скалирование итоговых сумм воздействий (например, чтобы уменьшать их со временем).

tt_events_log

Хранилище истории игровых событий с привязкой к «тегам» и фильтром по ним. Позволяет организовать отображение такую функиональность как «последние события в гильдии».

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • добавить событие;

  • получить события по фильтру;

  • получить последние события;

tt_effects

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

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • зарегистрировать эффект;

  • удалить эффект;

  • изменить эффект;

  • получить список эффектов;

tt_matchmaker

Простой сервис поиска соперника для pvp и отслеживания активных боёв.

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • создать запрос на битву;

  • отменить запрос на битву;

  • принять запрос на битву;

  • создать битву;

  • получить список запросов на битву;

  • получить текущую статисику (количество битв, количество запросов);

  • завершить битву;

  • получить список участников битвы;

tt_properties

Хранилище свойств объектов, нужных в частных случаях логики (например, флаг «разрешить приглашать игрока в клан»). Позволяет избежать раздувания основных объектов игры (аккаунт, герой, гильдия, etc).

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • установить свойства;

  • получить свойства;

tt_uniquer

Сервис выделения (и хранения) уникальных целочисленных идентификаторов для строк.

Не привязан к логике игры, может быть использован отдельно.

Функциональность:

  • получить уникальный идентификатор по строке;

Планируемые сервисы

  • HTTP API 2.0;

  • Галерея изображений;

  • Фольклор;

  • Сервис генерации информеров;

  • Сервис выдачи краткой информации по объектам игры;

  • Форум;

  • Регистрация (плюс поддержка авторизации через популярные OAuth провайдеры);

  • Кланы;

  • Достижения;

  • Друзья;

  • Приём платежей от XSolla;

  • Сервис рассылки сообщений на почту игроков;

  • Статистика;

  • Игровая логика (разобьётся на несколько сервисов);

  • Карта — ландшафт;

  • Карта — логика (города, дороги, etc).