CQRS: Архитектура, которая...

Preview:

Citation preview

Восьмая независимая научно-практическая конференция «Разработка ПО 2012»1 - 2 ноября, Москва

Ксения Мухортова

CQRS: Архитектура, которая делает бизнес-приложения лучше

Intel

Проблемы разработчика бизнес-приложений

Предметная область - чужой мир Частое изменение требований Не- или слабоструктурированные данные

Технические проблемы

Изменения требований затрагивают всё приложение

Эволюция технологий Поддержка нескольких типов UI Несоответствие моделей хранения – логики –

отображения AJAX: Необходимость передавать и view и

данные

Опять проблемы?

Меняешь доменную модель – переделай маппинги

Масштабируемость и синхронизация Бизнес-намерения утеряны при сохранении

данных

ЖУТКО СЛОЖНО!!!

CQS -> CQRS

Command: команда выполняет действие, не возвращает результат

Query: запрос возвращает результат, не выполняет действий

Подсистема запросов

Клиент viewПрезентационная логика

БД для чтения

SQL

«Тупой» слой трансформации

DTOs

Подсистема команд

Репозиторий

Клиент view

Команды

Обработчик команд

Домен Результаты запроса

«Тупой» слой трансформации«Тупой» слой

трансформации

Храни-лище

События События

Презентационная логика

Event sourcing

Команда Событие

Подсистема синхронизации

Домен

Обработчик событий/

Денормализатор

«Тупой» слой трансформации

Клиент viewПрезентационная логика

БД для чтения

SQL

«Тупой» слой трансформации

DTOs

Репозиторий

Команды

Обработчик команд

Домен Результаты запроса

Храни-лище

События События

Обработчик событий/

Денормализатор

Всё вместе

Преимущества event sourcing

Хранятся только события – объективные факты Независимость структуры доменных объектов от

модели хранения Возможность ретроспективной функциональности Тестирование поведения, а не состояния

Тестируем поведение (BDD)

Каждый сценарий описывается тремя категориями: •Given:

инстанциируем объект, устанавливаем состояние проигрывая цепочку событий

•When: вызываем команду•Then:проверяем сгенерированные события

BDD заставляет мыслить в терминах функциональности13

Универсальное решение?

Важно запомнить про CQRS

15

““Правильный” DDD – залог успехаAggregates (eventual vs transactional consistency)Bounded contextsМоделирование поведения, а не реального мира

Отличия между командами и событиямиORM в write части – ЗЛОUnit-тестируйте поведение, а не состояние

Источники информации

Greg Young, Udi Dahan, Eric Evans, Rinat AbdullinMicrosoft CQRS journey: http://msdn.microsoft.com/en-us/library/jj554200.aspx

16

Пример

Предметная область

18

Task

Stage 1 Stage 2 Stage N

Предметная область

19

Stage

End condition

Stage 1

Stage 2

Отправка команды добавления задачи на WCF сервис

20

Интерфейс WCF сервиса

21

Команда добавления задачи

22

Обработчик команды добавления задачи

23

Доменный объект “задача”

24

Обработчик события добавления задачи

25

26

Id Task name Task Status Stage name Stage status

1 First task NotStarted First stage NotStarted

1 First task NotStarted Second stage NotStarted

Id Name Status

1 First task NotStarted

2 Second task InProgressId Name

1 First task

3 Third task

Получение списка задач

27

Тестирование

28

29

30