Арсений Жижелев «Наблюдение за игровым миром Аллодов...
-
Upload
dataart -
Category
Technology
-
view
94 -
download
3
Transcript of Арсений Жижелев «Наблюдение за игровым миром Аллодов...
Спикер:
Тема:
Жижелев Арсений Александрович
Наблюдение за игровым миром Аллодов
(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
15
Event sourcing
События 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/XML handling, non-blocking
I/O, WebSockets, asset compilation (CoffeeScript, less), ORM, NoSQL)
• компиляция, включая шаблоны• шаблонизатор twirl (с кросс-трансляцией в Scala)• короткий цикл разработки (refresh to recompile)
(компиляция инкрементная)23
Scala = Java++
java без ‘;’ вывод ‘;’вывод типов case class’ыудобные коллекции
Java++generic’и с ко- и контра-
вариантностьювычисления на типах implicit’ы (type classes) cake pattern (альтернатива
dependency injection)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
вопросы?