![Page 1: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/1.jpg)
![Page 2: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/2.jpg)
Спикер:
Тема:
Жижелев Арсений Александрович
Наблюдение за игровым миром Аллодов
(Play + Scala + SynapseGrid + Slick + PostgreSQL)
![Page 3: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/3.jpg)
Наблюдение за игровым миром Аллодов
Play + Scala + Slick + PostgreSQL
![Page 4: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/4.jpg)
4
Игровой мир
![Page 5: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/5.jpg)
Сущности игрового мира
• Аватары (аккаунты, души, переродки)• Ресурсы
– Типы предметов– Руны– Деньги и альт.валюты– Мобы (mobile object)– Нейтральные NPC (non player character)
• Предметы• Квесты
• Корабли• Гильдии• Профессии
• Служебные– Почта– Сессии (вход/выход в игру)– Планирование событий– Контент-ключи
5
![Page 6: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/6.jpg)
События игрового мира
• Уровень• Опыт• Навыки• Достижения
Изменение свойств (Прокачка персонажа)
• запуск сервера• вход/выход в игру
Системные
6
• Создание аватара• Убийство мобов (PvE), других
персонажей (PvP)• Слияние, самоуничтожение• Крафтинг – создание из частей
Создание/уничтожение объектов
• Получение «лута» (добычи)• Покупка/продажа предметов
Передача ценностей (бухгалтерия)
![Page 7: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/7.jpg)
Ценность событий для управления игрой
Оценка востребованности игровых элементов
• Использование предметов• Взятие и завершение квестов• Участие в сражениях
Восстановление ошибочно удалённых предметов
• События покупки/продажи/перемещения предметов
Обнаружение необычных явлений
(программные ошибки или мошенничество)• Контроль темпов роста• Контроль последовательности квестов
7
![Page 8: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/8.jpg)
Задачи инструментария
8
• текущее состояние мира• расследование проблем в
(далёком или не очень) прошлом
Наблюдение
• ассортимент магазина• управление сезонами• включение/выключение
элементов игры
Администрирование игры
• индивидуальные воздействия• акции• массовые компенсации
Вмешательство в игру
• статистика и графики• обнаружение читерства и
программных ошибок
Аналитика
![Page 9: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/9.jpg)
9
Архитектура
![Page 10: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/10.jpg)
10
Архитектура инструментария
smart-store
item DB
legacy DBDB
Игровой сервер Очередь
ETL
онтология
UI
elastic
![Page 11: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/11.jpg)
Применения онтологии
События
Команды
БД
Интерфейс
• Модель предметной области
• События• Команды (формирование и
исполнение)• Представление в БД (схема,
запросы)• Представление в
интерфейсе (список полей, типы) + (ширина, формат)
Модель
12
![Page 12: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/12.jpg)
Пример онтологии
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)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/13.jpg)
15
Event sourcing
![Page 14: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/14.jpg)
События vs. история
создание…изменение уровняполучение денег…получение способностейпереименование…перенос на другой шард
перенос с другого шарда
…
изменение уровня
Аватар: Илина
Счёт: 1234 gold
Уровень: 60
Аватар: Галеона
Счёт: 123 gold
Уровень: 35
Аватар: Галеона
Счёт: 12 gold
Уровень: 5
16
![Page 15: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/15.jpg)
Event sourcing (1)
• Полный поток событий– Создание аватара (в исходном состоянии)– Изменение имени на «Вася»– Повышение уровня+1– Получение денег (+100)– Покупка предмета
• Проигрывая цепочку событий, получаем– состояние на любой момент в прошлом– текущее состояние– историю изменения любых свойств
17
![Page 16: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/16.jpg)
Event sourcing (2)
• Атрибуты имеют разную частоту изменений• События в значительной степени – независимы
18
name
level
![Page 17: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/17.jpg)
Пропуски в потоке событий
• Причины– существующие данные– отключения, которые не заметили– ошибки
• Решение – события компенсации– сравниваем восстановленные значения свойств с текущими– формируем события, изменяющие свойства до текущих
значений– (нет необходимости хранить снимки)
19
![Page 18: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/18.jpg)
Агрегирование
• Исторические данные не требуют высокой детальности– создаём снимок сущности на требуемый момент,– удаляем «лишние» события,– формируем события компенсации
• Для статистики и графиков формируем таблицы с агрегированными данными (OLAP)
20
![Page 19: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/19.jpg)
Time machine
• Построение версии сущности на любой момент времени• Хранение snapshot’ов в версионных таблицах [start,
finish)• Можно создавать несколько версионных таблиц
– разные наборы атрибутов – разная разреженность по времени
• Можно использовать при прямой работе с БД через SQL
21
![Page 20: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/20.jpg)
22
Стек технологий• Play• Scala• SynapseGrid• Slick• PostgreSQL
![Page 21: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/21.jpg)
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)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/22.jpg)
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)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/23.jpg)
SynapseGrid
• Запуск/остановка зависимых процессов• Настраиваемая прокачка данных
25
![Page 24: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/24.jpg)
Зависимости между процессами
26
![Page 25: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/25.jpg)
Slick
• соответствие семантики• конструирование
запроса непосредственно в коде
• расширяемость• fallback to plain SQL
27
![Page 26: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/26.jpg)
Slick+Postgres
• пользовательские типы• иерархия наследования• запросы с join’ами• пример: удаление снимков согласно политике
(код)
28
![Page 27: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/27.jpg)
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)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/28.jpg)
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)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/29.jpg)
Ключевые элементы
Онтология• единая версия предметной области• универсальный механизм, связывающий все слои приложения
Event sourcing• первичная информация – поток событий• вторичная – текущее состояние, история изменений, Time machine
Современные технологии• Scala• Play• SynapseGrid• Slick
32
![Page 30: Арсений Жижелев «Наблюдение за игровым миром Аллодов (Play+Scala+Slick+PostgreSQL)»](https://reader030.vdocuments.mx/reader030/viewer/2022020123/55b64652bb61ebc7718b45f5/html5/thumbnails/30.jpg)
33
вопросы?