54
www.luxoft.com CQRS and Event Sourcing Грищенко Андрей ([email protected] ) November 7, 2016

Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

Embed Size (px)

Citation preview

Page 1: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

CQRS and Event Sourcing

Грищенко Андрей

([email protected])

November 7, 2016

Page 2: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Содержание

1. Почему CQRS?

1. Возникновение современной архитектуры

2. Проблемы CRUD подхода

3. CQRS, как инструмент решения этих проблем

2. Архитектура CQRS приложений

3. CQRS и Java: Axon Framework.

Page 3: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

1. Почему CQRS?

Page 4: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Эволюция представления документов

Page 5: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Время бумажных документов

Эра бумажных архивов

Page 6: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Цифровые архивы

Эра цифровых архивов

Page 7: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Раннее управление цифровыми архивами

Поиск в цифровых архивах

Page 8: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Автоматизация в цифровых архивах

Пришло время CRUD

Page 9: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Эра бизнес процессов

Page 10: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Недостаток CRUD

CRUD подход

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

отображение

модели бизнес

логики, а на

манипуляцию

данными

Page 11: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

2. Проблемы CRUD

Page 12: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Архитектура типичного приложения

Client

(UI)

Domain

Model

(Logic)

write

read

Database

(Data)

write

read

Page 13: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Проблема 1: использование Java Bean…

Спецификация Sun Microsystems определяет JavaBeans как повторно

используемые программные компоненты, которыми можно

управлять,используя графические

конструкторы и средства IDE.

Page 14: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

… приводит к...

1. Нарушение инкапсуляции бизнес-объектов

2. Anemic model(Antipattern)

3. Ухудшение читаемости кода

4. Трудности поддержки

5. Бизнес логика переносится в методы

сервисов

Page 15: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Проблема 2: оптимизация производительности

и её последствия:

Использование ORM tool вместе с

денормализацией данных размывает

Page 16: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Проблема 3: Масштабируемость

В теореме САР(Consistency,

Availability, Partition), мы всегда

выбираем целостность

данных.

Page 17: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Проблема 4: В реальной жизни не бывает конфликтов

модификации данных

1. В бизнес процессах, происходящих в реальной жизни, не бывает

конфликтов модицикации данных

2. Даже если такой конфликт возникает, значит где-то проблема в

реализации бизнес-логики

3. CRUD не учитывает этот аспект

Page 18: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

CQRS, как возможное решение

3. CQRS как решение

Page 19: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

CQRS

CQRS – Command Query Responsibility Segregation

Разделение ответственности на команды и запросы

Page 20: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Архитектура

Page 21: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

CQRS используется в связке с шаблонами

1. CQS – Command-query separation, изобретён Бертраном Мейером в далёком 1988

году. Вкратце: метод должен быть либо командой, выполняющей какое-то действие,

либо запросом, возвращающим данные, но не одновременно.

1. CQRS – возводит CQS на уровень приложения, применяя его к компонентам.

2. Event Sourcing – все изменения состояния приложения хранятся, как

последовательность событий.

3. Eventual Consistency – позволяет увеличить доступность и масштабируемость.

Согласованность в конечном счёте (англ. eventual consistency) — модель работы с данными.

Гарантирует, что в отсутствии изменений данных, через какое-то время после последнего

обновления («в конечном счёте») все запросы будут возвращать последнее обновлённое

значение.

Page 22: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Роль Java Bean

Java Bean используется для

отображения данных на стороне

обработки запросов, но Java Bean !=

Domain Entity.

Page 23: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Проблема 2: Оптимизация

производительности и её последствия

Денормализация данных выполняется только на

стороне обработки запросов. Доменная область

не тронута.

Page 24: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Запрашиваемые данные

Каждая таблица – денормализованное представление

данных на экране пользователя

Высокопроизводительные альтернативы –

Apache Cassandra, HBase, Hypertable…

Не обязательно применять SQL базы данных

Page 25: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Проблема 3: Масштабируемость

• Целостность данных нужна только на стороне

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

• На стороне обработки запросов можно использовать

eventual consistency

Page 26: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Проблема 4: В реальной жизни не бывает

конфликтов модификации данных

Представление состояния объекта в виде

последовательности событий:

+3k$ -1k$ +5k$

sum: 7k$

Page 27: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Представление объектов, как череда событий

• Каждый агрегат - это пакет событий

• Нет необходимости использовать реляционные базы

данных

• База должна обладать ACID(Atomicity, Consistency, Isolation,

Durability) свойствами

Page 28: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Представление объектов, как череда событий

Преимущества:

• Удобно отслеживать изменения состояния системы

• Возможность отката состояния системы до любого момента

времени

• Удобный механизм воспроизведения данных и разрешения

конфликтов

• Тестирование поведения приложения(BDD)

• Расширенные возможности для дебага

Page 29: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Расширенные возможности для дебага

Захватить пакет событий, которые привели к ошибке

???

Воспроизвести пакет событий локально

Четко увидеть, какая последовательность действий

привела пользователя к ошибке

PROFIT

Page 30: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Архитектура CQRS приложений

4. Архитектура CQRS приложений

Page 31: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Только подход....

CQRS – это набор шаблонов, очень

гибкий в плане реализаций. Всё

зависит от вас, ну и нужд бизнеса.

Page 32: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Запросы к БД

Page 33: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Сравнение запросов

Запрос к БД

Конвертирование в DTO

Конвертирование в

доменную модель

Передача клиенту

Многослойная архитектура:

Запрос к БД

Конвертирование в DTO

Конвертирование в

доменную модель

Передача клиенту

CQRS:

Page 34: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Команды

Page 35: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Команды

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

1. Ориентация на бизнес задачи клиента

2. Удобный инструмент мониторинга и масштабирования

Команда это бизнес действие пользователя. Это то

действие, которое необходимо для реализации нужд

бизнеса.

Пример – user story: «Я, как пользователь, я хочу создавать новую

запись в адресной книге»

Page 36: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Event store

Page 37: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

...и publish

Page 38: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Плюшки

Обработка сложных событий (англ. complex event

processing, CEP) заключается в обработке

множества событий, происходящих на всех уровнях

организации, при этом идентифицируются

наиболее существенные события из множества

событий, анализируется их влияние и в режиме

реального времени предпринимаются

соответствующие действия.

Page 39: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Реализация CQRS

5. Реализация CQRS

Page 40: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Hail the Axon Framework

Axon framework –

достаточно

«взрослый», а так же

самый популярный и

наиболее

функциональный

из всех CQRS

фреймворков.

Page 41: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Пример CQRS приложения на Java

Address Book -

Управление

списком адресов.

Page 42: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Page 43: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Создание и отправка команды

Page 44: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Page 45: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Обработка команды

Page 46: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Бизнес действие

Page 47: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Обработка события

Page 48: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Page 49: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Запрос

Page 50: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Настройка через spring application context

Page 51: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Axon - repository и event store

Repository

Event Store

JPA

JPA

Page 52: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Event stores pros and cons

JPA event store MongoDB, Local Filesystem

Нет поддержки ACID,

большая скорость.

Page 53: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com

Итого...

CQRS - решение, которое позволяет разрабатывать большие

корпоративные системы. Его использование облегчит

разработку и поддержку, позволит внедрить удобную систему

аудита, а так же практически без ограничений масштабировать

приложение. Применять CQRS для всей системы, не

обязательно, обычно его используют для сложных компонентов.

В то же время, его применение практически не оправдано для

маленьких систем.

Page 54: Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"

www.luxoft.com