Арсений Жижелев «Наблюдение за игровым миром Аллодов...

31

Transcript of Арсений Жижелев «Наблюдение за игровым миром Аллодов...

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

Спикер:

Тема:

Жижелев Арсений Александрович

Наблюдение за игровым миром Аллодов

(Play + Scala + SynapseGrid + Slick + PostgreSQL)

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

Наблюдение за игровым миром Аллодов

Play + Scala + Slick + PostgreSQL

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

4

Игровой мир

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

Сущности игрового мира

• Аватары (аккаунты, души, переродки)• Ресурсы

– Типы предметов– Руны– Деньги и альт.валюты– Мобы (mobile object)– Нейтральные NPC (non player character)

• Предметы• Квесты

• Корабли• Гильдии• Профессии

• Служебные– Почта– Сессии (вход/выход в игру)– Планирование событий– Контент-ключи

5

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

События игрового мира

• Уровень• Опыт• Навыки• Достижения

Изменение свойств (Прокачка персонажа)

• запуск сервера• вход/выход в игру

Системные

6

• Создание аватара• Убийство мобов (PvE), других

персонажей (PvP)• Слияние, самоуничтожение• Крафтинг – создание из частей

Создание/уничтожение объектов

• Получение «лута» (добычи)• Покупка/продажа предметов

Передача ценностей (бухгалтерия)

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

Ценность событий для управления игрой

Оценка востребованности игровых элементов

• Использование предметов• Взятие и завершение квестов• Участие в сражениях

Восстановление ошибочно удалённых предметов

• События покупки/продажи/перемещения предметов

Обнаружение необычных явлений

(программные ошибки или мошенничество)• Контроль темпов роста• Контроль последовательности квестов

7

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

Задачи инструментария

8

• текущее состояние мира• расследование проблем в

(далёком или не очень) прошлом

Наблюдение

• ассортимент магазина• управление сезонами• включение/выключение

элементов игры

Администрирование игры

• индивидуальные воздействия• акции• массовые компенсации

Вмешательство в игру

• статистика и графики• обнаружение читерства и

программных ошибок

Аналитика

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

9

Архитектура

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

10

Архитектура инструментария

smart-store

item DB

legacy DBDB

Игровой сервер Очередь

ETL

онтология

UI

elastic

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

Применения онтологии

События

Команды

БД

Интерфейс

• Модель предметной области

• События• Команды (формирование и

исполнение)• Представление в БД (схема,

запросы)• Представление в

интерфейсе (список полей, типы) + (ширина, формат)

Модель

12

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

Пример онтологии

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

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

15

Event sourcing

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

События vs. история

создание…изменение уровняполучение денег…получение способностейпереименование…перенос на другой шард

перенос с другого шарда

изменение уровня

Аватар: Илина

Счёт: 1234 gold

Уровень: 60

Аватар: Галеона

Счёт: 123 gold

Уровень: 35

Аватар: Галеона

Счёт: 12 gold

Уровень: 5

16

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

Event sourcing (1)

• Полный поток событий– Создание аватара (в исходном состоянии)– Изменение имени на «Вася»– Повышение уровня+1– Получение денег (+100)– Покупка предмета

• Проигрывая цепочку событий, получаем– состояние на любой момент в прошлом– текущее состояние– историю изменения любых свойств

17

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

Event sourcing (2)

• Атрибуты имеют разную частоту изменений• События в значительной степени – независимы

18

name

level

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

Пропуски в потоке событий

• Причины– существующие данные– отключения, которые не заметили– ошибки

• Решение – события компенсации– сравниваем восстановленные значения свойств с текущими– формируем события, изменяющие свойства до текущих

значений– (нет необходимости хранить снимки)

19

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

Агрегирование

• Исторические данные не требуют высокой детальности– создаём снимок сущности на требуемый момент,– удаляем «лишние» события,– формируем события компенсации

• Для статистики и графиков формируем таблицы с агрегированными данными (OLAP)

20

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

Time machine

• Построение версии сущности на любой момент времени• Хранение snapshot’ов в версионных таблицах [start,

finish)• Можно создавать несколько версионных таблиц

– разные наборы атрибутов – разная разреженность по времени

• Можно использовать при прямой работе с БД через SQL

21

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

22

Стек технологий• Play• Scala• SynapseGrid• Slick• PostgreSQL

Page 21: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+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

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

Scala = Java++

java без ‘;’ вывод ‘;’вывод типов case class’ыудобные коллекции

Java++generic’и с ко- и контра-

вариантностьювычисления на типах implicit’ы (type classes) cake pattern (альтернатива

dependency injection)HList‘ы

24

assert((1::“a”::HNil).head + 1 === 2)

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

SynapseGrid

• Запуск/остановка зависимых процессов• Настраиваемая прокачка данных

25

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

Зависимости между процессами

26

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

Slick

• соответствие семантики• конструирование

запроса непосредственно в коде

• расширяемость• fallback to plain SQL

27

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

Slick+Postgres

• пользовательские типы• иерархия наследования• запросы с join’ами• пример: удаление снимков согласно политике

(код)

28

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

Postgres: наследование

29

object

row_id:int4

event

time:timestamp

avatar_ref

avatar_id:long

event_avatar

event_avatar_faction

event_faction

faction_id:int4

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

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))}

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

Ключевые элементы

Онтология• единая версия предметной области• универсальный механизм, связывающий все слои приложения

Event sourcing• первичная информация – поток событий• вторичная – текущее состояние, история изменений, Time machine

Современные технологии• Scala• Play• SynapseGrid• Slick

32

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

33

вопросы?

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

Арсений ЖижелевСт.программист, Студия Аллоды

[email protected]

СПАСИБО ЗА ВНИМАНИЕ!