Применение CQRS и EventSourcing в DDD-проекте

63
Игорь Лубенец [email protected] Степан Мозыра [email protected] Применение CQRS и EventSourcing в DDD-проекте 1

Transcript of Применение CQRS и EventSourcing в DDD-проекте

Игорь Лубенец[email protected]

Степан Мозыра[email protected]

ПрименениеCQRS и EventSourcingв DDD-проекте

1

О нас

Степан Мозыра[email protected]

Игорь Лубенец[email protected]

2

О чем пойдёт речь

3

• Немного о проекте

• DDD

• CQRS

• Event Sourcing

• Как это всё работает вместе

• Выводы

4

Немного о проекте

Немного о проекте

5

Немного о проекте

5

Немного о проекте

5

Немного о проекте

5

Немного о проекте

5

6

Немного о проекте

6

Немного о проекте

Условия:

• Быстрый старт

• Конкуренция

• Неясные требования

• Ограниченный ресурс

6

Немного о проекте

Условия:

• Быстрый старт

• Конкуренция

• Неясные требования

• Ограниченный ресурс

Требования:

• Экспансия

• Нагрузка

• Стабильность системы

• Мониторинг

• Тестируемость

7

Рефакторинг?..

Немного о проекте

8

Rebuild!

Немного о проекте

8

Rebuild!

Немного о проекте

9

DDD

В общем про DDD

10

Domain-driven Design

(Предметно-ориентированное проектирование)

2003, теория 2013, практика

Эрик Эванс Вон Вернон

В общем про DDD

11

Единый язык (Ubiquitous language)

В общем про DDD

12

Домен, поддомены, контексты

В общем про DDD

13

Гексагональная архитектура(Архитектура портов и адаптеров)

MQ Service

AggregateRoot

REST

Port

MQPort

ApplicationService

Command

Transport

Business Method

14

CQRS

CQRS

15

Command Query Responsibility Segregation

CQRS

15

Command Query Responsibility Segregation

Command

• Контейнер для данных, представляющих изменения

• Неизменяемая (Immutable)

• Не возвращает данных

• Может быть версионирована

CQRS

15

Command Query Responsibility Segregation

Command

• Контейнер для данных, представляющих изменения

• Неизменяемая (Immutable)

• Не возвращает данных

• Может быть версионирована

Query

• Возвращает подготовленные данные

• Без побочных эффектов

• Может быть версионирован

CQRS

15

Command Query Responsibility Segregation

Command

• Контейнер для данных, представляющих изменения

• Неизменяемая (Immutable)

• Не возвращает данных

• Может быть версионирована

Query

• Возвращает подготовленные данные

• Без побочных эффектов

• Может быть версионирован

Message

CQRS

Актуализация модели чтения (ReadModel)

16

CQRS

Актуализация модели чтения (ReadModel)

Синхронно

16

CQRS

Актуализация модели чтения (ReadModel)

Синхронно Асинхронно

Message Bus

16

CQRS

17

CQRS vs CRUD

CQRS CRUD

Бизнес логика сервер клиент

Команды ∞ 3

Запросыоптимизированный

результатподготовка каждого

результат

Делимость «из коробки» проблематично

18

Event Sourcing

Event Sourcing

19

Сущность

id Состояние Состояние Состояние Состояние Состояние

…Реляционная таблица

Event Sourcing

19

Сущность

id Состояние Состояние Состояние Состояние Состояние

…Реляционная таблица

id Состояние

…Документ

Event Sourcing

19

Сущность

id Состояние Состояние Состояние Состояние Состояние

…Реляционная таблица

id Состояние

…Документ

idv1 Изменениеv2 Изменениеv3 Изменение

Event store

Even

t st

ream}

Event Sourcing

20

Event Sourcing

20

Event Sourcing

20

21

Как это всё работает вместе

Как это всё работает вместе

22

Как это всё работает вместе

23

Как это всё работает вместе

24

Как это всё работает вместе

25

Как это всё работает вместе

26

Как это всё работает вместе

27

Как это всё работает вместе

28

Как это всё работает вместе

29

Как это всё работает вместе

30

Как это всё работает вместе

31

Как это всё работает вместе

32

Как это всё работает вместе

33

Пример:

Как это всё работает вместе

33

Пример:

Регистрация пользователя:

• Пользователь должен иметь возможность зарегистрироваться на сайте

• Пользователь должен иметь возможность сменить контактные данные (email)

• Оператор должен активировать пользователя после проверки его документов

Как это всё работает вместе

34

Как это всё работает вместе

35

Event stream

CustomerWasRegisteredV1

CustomerEmailWasChangedV1

CustomerWasActivatedV1

CustomerEmailWasChangedV1Время

Как это всё работает вместе

35

Event stream

CustomerWasRegisteredV1

CustomerEmailWasChangedV1

CustomerWasActivatedV1

CustomerEmailWasChangedV1

CustomerEmailWasChangedV2

Время

36

Выводы

37

Выводы

• Экспансия

• Нагрузка

• Стабильность системы

• Мониторинг

• Тестируемость

37

Выводы

• Экспансия

• Нагрузка

• Стабильность системы

• Мониторинг

• Тестируемость

37

Выводы

• Экспансия

• Нагрузка

• Стабильность системы

• Мониторинг

• Тестируемость

37

Выводы

• Экспансия

• Нагрузка

• Стабильность системы

• Мониторинг

• Тестируемость

37

Выводы

• Экспансия

• Нагрузка

• Стабильность системы

• Мониторинг

• Тестируемость

37

Выводы

• Экспансия

• Нагрузка

• Стабильность системы

• Мониторинг

• Тестируемость

37

Выводы

• Экспансия

• Нагрузка

• Стабильность системы

• Мониторинг

• Тестируемость

• Количество кода

37

Выводы

• Экспансия

• Нагрузка

• Стабильность системы

• Мониторинг

• Тестируемость

• Количество кода

• Хранение устаревших событий

38

Спасибо за внимание!