Спикер:
Тема:
Жижелев Арсений Александрович
Наблюдение за игровым миром Аллодов
(Play + Scala + SynapseGrid + Slick + PostgreSQL)
Наблюдение за игровым миром Аллодов
Play + Scala + Slick + PostgreSQL
Игровой мир
4
Сущности игрового
мира
• Аватары (аккаунты, души,
переродки)
• Ресурсы
– Типы предметов
– Руны
– Деньги и альт.валюты
– Мобы (mobile object)
– Нейтральные NPC (non player
character)
• Предметы
• Квесты
• Корабли
• Гильдии
• Профессии
• Служебные
– Почта
– Сессии (вход/выход в
игру)
– Планирование событий
– Контент-ключи
5
События игрового
мира
• Уровень
• Опыт
• Навыки
• Достижения
Изменение свойств
(Прокачка персонажа)
• запуск сервера
• вход/выход в игру
Системные
6
• Создание аватара
• Убийство мобов (PvE), других
персонажей (PvP)
• Слияние, самоуничтожение
• Крафтинг – создание из частей
Создание/уничтожение
объектов
• Получение «лута» (добычи)
• Покупка/продажа предметов
Передача ценностей
(бухгалтерия)
Ценность событий
для управления игрой
Оценка востребованности игровых элементов
• Использование предметов
• Взятие и завершение квестов
• Участие в сражениях
Восстановление ошибочно удалённых предметов
• События покупки/продажи/перемещения предметов
Обнаружение необычных явлений
(программные ошибки или мошенничество)
• Контроль темпов роста
• Контроль последовательности квестов
7
Задачи
инструментария
8
• текущее состояние мира
• расследование проблем в
(далёком или не очень) прошлом
Наблюдение
• ассортимент магазина
• управление сезонами
• включение/выключение элементов
игры
Администрирование игры
• индивидуальные воздействия
• акции
• массовые компенсации
Вмешательство в игру
• статистика и графики
• обнаружение читерства и
программных ошибок
Аналитика
Архитектура
9
Архитектура
инструментария
10
smart-store
item DB
legacy
DBDB
Игровой
сервер Очередь
ETL
онтология
UI
elastic
Применения
онтологии
События
Команды
БД
Интерфейс
• Модельпредметной
области
• События
• Команды(формирование и
исполнение)
• ПредставлениевБД(схема,
запросы)
• Представлениев
интерфейсе(списокполей,
типы)+(ширина,формат)
Модель
12
Пример онтологии
object Avatar extends EntityMeta[Avatar] {
val avatarId = property("avatarId", int,
"Идентификатор аватара")
val Name = property("Name", Text, "Имя аватара")
val GameClass = property("GameClass", Text,
"Игровой класс аватара")
val Level = property("Level", Domains.Level,
"Уровень аватара в игре")
…
} http://habrahabr.ru/post/229035/
Строго типизированное представление неполных данных
14
Event sourcing
15
События vs.
история
создание
…
изменениеуровня
получениеденег
…
получениеспособностей
переименование
…
переноснадругойшард
перенос с другого шарда
…
изменение уровня
Аватар: Илина
Счёт: 1234 gold
Уровень: 60
Аватар: Галеона
Счёт: 123 gold
Уровень: 35
Аватар: Галеона
Счёт: 12 gold
Уровень: 5
16
Event sourcing (1)
• Полныйпотоксобытий
– Созданиеаватара(висходномсостоянии)
– Изменениеименина«Вася»
– Повышениеуровня+1
– Получениеденег(+100)
– Покупкапредмета
• Проигрываяцепочкусобытий,получаем
– состояниеналюбоймоментвпрошлом
– текущеесостояние
– историюизменениялюбыхсвойств
17
Event sourcing (2)
• Атрибуты имеют разную частоту изменений
• События в значительнойстепени – независимы
18
name
level
Пропуски в потоке
событий
• Причины
– существующие данные
– отключения, которые не заметили
– ошибки
• Решение – события компенсации
– сравниваем восстановленные значения свойств с текущими
– формируем события, изменяющие свойства до текущих
значений
– (нет необходимости хранить снимки)
19
Агрегирование
• Исторические данные не требуют высокой
детальности
– создаём снимок сущности на требуемый момент,
– удаляем «лишние» события,
– формируем события компенсации
• Для статистики и графиков формируем
таблицы с агрегированными данными (OLAP)
20
Time machine
• Построение версии сущности на любой момент
времени
• Хранение snapshot’ов в версионных таблицах
[start, finish)
• Можно создавать несколько версионных таблиц
– разные наборы атрибутов
– разная разреженность по времени
• Можно использовать при прямой работе с БД
через SQL
21
Стек технологий
22
• Play
• Scala
• SynapseGrid
• Slick
• PostgreSQL
Play 2.x
• полныйсовременныйстеквеб-технологий наJVM
– (netty,akka,comet,REST,JSON/XMLhandling,non-blockingI/O,
WebSockets,assetcompilation(CoffeeScript,less),ORM,NoSQL)
• компиляция,включаяшаблоны
• шаблонизаторtwirl (с кросс-трансляциейв Scala)
• короткий цикл разработки (refreshto recompile)
(компиляцияинкрементная)
23
Scala = Java++
javaбез‘;’
вывод‘;’
выводтипов
caseclass’ы
удобныеколлекции
Java++
generic’иско-иконтра-
вариантностью
вычислениянатипах
implicit’ы(typeclasses)
cakepattern(альтернатива
dependencyinjection)
HList‘ы
24
assert((1::“a”::HNil
).head + 1 === 2)
SynapseGrid
• Запуск/остановка зависимых процессов
• Настраиваемая прокачка данных
25
Зависимости
между процессами
26
Slick
• соответствие семантики
• конструирование
запроса
непосредственно в коде
• расширяемость
• fallback to plain SQL
27
Slick+Postgres
• пользовательские типы
• иерархия наследования
• запросы с join’ами
• пример: удаление снимков согласно политике
(код)
28
Postgres:
наследование
29
object
row_id:int4
event
time:timestamp
avatar_ref
avatar_id:long
event_avatar
event_avatar_faction
event_faction
faction_id:int4
RetentionPolicy
30
val defaultRetentionPolicy = First within Ever union
(Last within Ever) union
(All within IntervalFromNow(Day)) union
Comprehension(First, IntervalFromNow(Month)) union
Comprehension(First, IntervalFromNow(Year, 1))
def snapshotsToRemove[T](ids,snapshots,retentionPolicy) = {
def retentionById(id: Column[Avatar.Id.RType]) =
convertRetentionToQuery(snapshots.
filter(_.id === id))(_.snapshotTime)(retentionPolicy).
map(_.snapshotId)
val retainIds = ids.flatMap(id => retentionById(id))
snapshots.filter( r => !r.id.in(retainIds))
}
Ключевые
элементы
Онтология
• единая версия предметной области
• универсальный механизм, связывающий все слои приложения
Event sourcing
• первичная информация – поток событий
• вторичная – текущее состояние, история изменений, Time machine
Современные технологии
• Scala
• Play
• SynapseGrid
• Slick
32
33
вопросы?
Арсений Жижелев
Ст.программист, Студия Аллоды
a.zhizhelev@corp.mail.ru
СПАСИБО ЗА ВНИМАНИЕ!

Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»

Editor's Notes

  • #6 Добавить картинки из игры (логотипы и т.п.)
  • #24 http://www.quora.com/What-are-the-pros-and-cons-of-the-Play-Framework-2-for-a-Java-developer компиляция JVM шаблонизатор (MVC?) основанный на Scala (проверка на этапе компиляции, expression-based) событийная модель вместо thread pool'а: асинхронность акка, масштабируемость, async IO (http://engineering.linkedin.com/play/play-framework-async-io-without-thread-pool-and-callback-hell) композиция future короткий цикл разработки - refresh in browser to recompile. современный стек (http://www.quora.com/What-are-the-pros-and-cons-of-the-Play-Framework-2-for-a-Java-developer) Сервлет-API уже безнадёжно устарел. MVC stack on top of Netty and Akka and has built-in support for most tasks you'd need in a modern web framework: REST, JSON/XML handling, non-blocking I/O, WebSockets, asset compilation (CoffeeScript, less), ORM, NoSQL support, and so on. нормальная обработка ошибок - просто ошибка в точке исходного кода.