Архитектура

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

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

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

../_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 запрос.

the_tale

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

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

tt_diary

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

tt_market

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

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

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

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

tt_personal_messages

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

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

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

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

tt_storage

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

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

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

  • помещение предмета в хранилище;
  • удаление предмета из хранилища;
  • передача предмета другому игроку;
  • перемещение предмета между «карманами» хранилища;
  • логирование всех операций.

tt_bank

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

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

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

  • болучение баланса аккаунта в каждой валюте;
  • транзакции: начал, окончание, откат;

tt_timers

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

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

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

  • создание таймера с заданными параметрами;
  • изменение скорости выполнения таймера;
  • http запрос по истечению таймера;
  • автопродление таймера.

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

  • HTTP API 2.0;
  • Галерея изображений;
  • Фольклор;
  • Сервис генерации информеров;
  • Сервис выдачи краткой информации по объектам игры;
  • Форум;
  • Регистрация (плюс поддержка авторизации через популярные OAuth провайдеры);
  • Кланы;
  • Достижения;
  • Друзья;
  • Банк (управленеи валютами игрока);
  • Приём платежей от XSolla;
  • Сервис рассылки сообщений на почту игроков;
  • Статистика;
  • Игровая логика (разобьётся на несколько сервисов);
  • Карта — ландшафт;
  • Карта — логика (города, дороги, etc).