Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Сергей Андрюшкевич «Реализация CQRS+ES на динам...

DotNetRu
November 08, 2018

Сергей Андрюшкевич «Реализация CQRS+ES на динамических моделях в реальном проекте»

Архитектурный подход CQRS+ES известен относительно широко, однако его применение в коммерческих проектах сопряжено с отсутствием готовых инструментов, отсутствием опыта команд и, как следствие, высоким риском выхода проекта из графика с непредсказуемым результатом.

В докладе представлен опыт реализации CQRS+ES с метамоделью на примере задачи формирования энергетического паспорта предприятия, которая перемолола три различные системы за 8 лет. Рассмотрена микросервисная архитектура системы, способы повышения производительности, решение проблем согласования изменений ES и проекций, а так же выводы применения CQRS на практике.

DotNetRu

November 08, 2018
Tweet

More Decks by DotNetRu

Other Decks in Programming

Transcript

  1. Обо мне • ФИТ НГУ, 2005 • к.т.н. “Информационные системы

    и процессы” • 14 лет в ИТ ◦ < 2014 - Java ◦ > 2014 - .Net 2
  2. ООО “ИТСГ-Регион” 3 • http://itsgr.ru • 2 команды разработки •

    Стартап “Мой Дом” • Заказная разработка
  3. Структура доклада 4 Часть 1 Решаемая бизнес задача Часть 4

    Выводы Вопросы Часть 2 Эволюция решение 1 и 2 Часть 3 CQRS+ES+Metamodel+примеры (решение 3)
  4. Часть 1. Решаемая задача 5 Часть 1 Решаемая бизнес задача

    Часть 4 Выводы Вопросы Часть 2 Эволюция решение 1 и 2 Часть 3 Решение 3 CQRS+ES+Metamodel+примеры
  5. Типовой крупный заказчик • 1000 подстанций по стране 12 Задача

    Выводы Эволюция CQRS • 5000 зданий • 7000 трансформаторов • 14000 приборов учета • 9000 автомобилей • ~2000 пользователей
  6. Часть 2. Эволюция 13 Часть 1 Решаемая задача Часть 4

    Выводы Вопросы Часть 3 CQRS+ES+Metamodel+примеры (решение 3) Часть 2 Эволюция решение 1 и 2
  7. Эволюция решений • 2010 – Java • 2016 – C#

    • 2018 – C# 14 Задача Выводы Эволюция CQRS
  8. EAV - entity attribute values 15 Attribute id name type

    Entity id name Values id entity_fk attribute_fk value entity_fk attribute_fk
  9. Версия 1.0 (2010) 16 Задача Выводы Эволюция CQRS Java выгрузка

    ??? UI BL Storage Organisation objects tree Controllers (BL, CRUD) like excel forms (cols/rows) Controllers (cols/rows) files Oracle Plain tables EAV (cols/rows)
  10. Regular tables Версия 2.0 (2016) 17 Задача Выводы Эволюция CQRS

    .Net C# ASP MVC5 UI From meta model editor BL Storage MS SQL Form meta model tables EAV (data) Dynamic forms controller Dynamic forms UI From meta model Lua processor ok BI заказчика
  11. Тупик • Бизнес ◦ То, да не то... ◦ Новые

    бизнес задачи ▪ Интеграция ▪ Внешняя обработка данных ▪ Процессы • Технологические ◦ Производительность EAV ◦ Тотальный контроль изменений ◦ Безопасность • Новый велосипед. Опять... 18 Задача Выводы Эволюция CQRS
  12. Версия 3.0 (2018) 19 Задача Выводы Эволюция CQRS .Net C#

    ASP.Net Core UI Backstage Мeta model editor BL Storage Write store (EAV) Read store (tables) Lua processor ok Core Мeta model controller CQRS ABAC DSL Lua UI Clint (UI Kit based) Generic UI Specific UI BL Generic UI controller Specific UI controller BI заказчика
  13. Микросервисная архитектура 20 Задача Выводы Эволюция CQRS ASP .Net Core

    Entity Framework UI kit WEB API Postgres Сервисы Приложение Ядро
  14. Сводная таблица 21 Задача Выводы Эволюция CQRS Версия 2010 Версия

    2016 Версия 2018 Метамодель нет да да Динамический UI нет да да Низкая вовлеченность разработчиков в предметную область нет да да Наличие сервисного слоя работы (BL, CLI, WebAPI, DSL) нет да да Отсутствие деградации производительности при росте данных нет нет да Микросервисы (переиспользование) нет нет да Применимость в других предметных областях нет нет да Высокая начальная скорость разработки да да нет Высокая скорость повторного использования нет нет да
  15. Часть 3. CQRS+ES+Metamodel+примеры 22 Часть 1 Решаемая бизнес задача Часть

    4 Выводы Вопросы Часть 2 Эволюция решение 1 и 2 Часть 3 CQRS+ES+Metamodel+примеры
  16. Пример сопоставления домена метамодели 24 Задача Выводы Эволюция CQRS Модель

    домена (Ref, “Здание”) Модель платформы (RefType) “Проходная № 2” Модель экземпляра объекта домена (“Проходная №2”)
  17. Идея CQRS+ES в целом 26 Задача Выводы Эволюция CQRS Client

    Command model Event Query model Write store write Read store update read
  18. Авантюра CQRS+ES на практике • Отсутствие опыта • Поиск вдохновения

    на GitHub • Нет примеров CQRS поверх динамических моделей • Своя реализация CQRS ? ◦ Динамические модели! 27 Задача Выводы Эволюция CQRS
  19. 29 Задача Выводы Эволюция CQRS Client DSL code (READ) Read

    store General query Query processor Specific query data (99% entity) RefService.Query (...) entity Meta model (cache) terms
  20. 31 Задача Выводы Эволюция CQRS var building = await RefService

    .ByType("Здание") .ByName("Насосная станция") .FirstOrDefault(); building['deprecation'] = 5.0; // active object await RefService.Update(building); // fire commad await RefService.Execute(building,"getReady", {state=1, follow=0}); // fire some dsl await UnitOfWork.Save(); Write flow
  21. transaction 32 Задача Выводы Эволюция CQRS Client DSL code (WRITE)

    RefService.Update (...) Meta model (cache) terms Lua script processor DSL RefService.Execute(...) Command changed DTO command bus command handler Create Update Delete Unit of work uncommited events Read store Event bus save Read processor Write processor Write store snapshot
  22. 35 Events Задача Выводы Эволюция CQRS Наше событие на изменение

    Изменение характеристики Сохраняем изменения 5.23
  23. Часть 4. Выводы 39 Часть 1 Решаемая бизнес задача Часть

    4 Выводы Вопросы Часть 2 Эволюция решение 1 и 2 Часть 3 CQRS+ES+Metamodel+примеры (решение 3) Задача Выводы Эволюция CQRS
  24. Выводы • Заказчик решает свои задачи, а вы свои •

    Метамодель • DSL • Разделение ответственности: разработчик - аналитик • CQRS+ES - это не цель, а инструмент • Высокие начальные затраты на разработку архитектуры • Высокие требования к разработчикам платформы 40 Задача Выводы Эволюция CQRS