SlideShare a Scribd company logo
www.luxoft.com
CQRS and Event Sourcing
Грищенко Андрей
(GryshchenkoAndrey@gmail.com)
November 7, 2016
www.luxoft.com
Содержание
1. Почему CQRS?
1. Возникновение современной архитектуры
2. Проблемы CRUD подхода
3. CQRS, как инструмент решения этих проблем
2. Архитектура CQRS приложений
3. CQRS и Java: Axon Framework.
www.luxoft.com
1. Почему CQRS?
www.luxoft.com
Эволюция представления документов
www.luxoft.com
Время бумажных документов
Эра бумажных архивов
www.luxoft.com
Цифровые архивы
Эра цифровых архивов
www.luxoft.com
Раннее управление цифровыми архивами
Поиск в цифровых архивах
www.luxoft.com
Автоматизация в цифровых архивах
Пришло время CRUD
www.luxoft.com
Эра бизнес процессов
www.luxoft.com
Недостаток CRUD
CRUD подход
ориентирован не на
отображение
модели бизнес
логики, а на
манипуляцию
данными
www.luxoft.com
2. Проблемы CRUD
www.luxoft.com
Архитектура типичного приложения
Client
(UI)
Domain
Model
(Logic)
write
read
Database
(Data)
write
read
www.luxoft.com
Проблема 1: использование Java Bean…
Спецификация Sun Microsystems определяет JavaBeans как повторно
используемые программные компоненты, которыми можно
управлять,используя графические
конструкторы и средства IDE.
www.luxoft.com
… приводит к...
1. Нарушение инкапсуляции бизнес-объектов
2. Anemic model(Antipattern)
3. Ухудшение читаемости кода
4. Трудности поддержки
5. Бизнес логика переносится в методы
сервисов
www.luxoft.com
Проблема 2: оптимизация производительности
и её последствия:
Использование ORM tool вместе с
денормализацией данных размывает
www.luxoft.com
Проблема 3: Масштабируемость
В теореме САР(Consistency,
Availability, Partition), мы всегда
выбираем целостность
данных.
www.luxoft.com
Проблема 4: В реальной жизни не бывает конфликтов
модификации данных
1. В бизнес процессах, происходящих в реальной жизни, не бывает
конфликтов модицикации данных
2. Даже если такой конфликт возникает, значит где-то проблема в
реализации бизнес-логики
3. CRUD не учитывает этот аспект
www.luxoft.com
CQRS, как возможное решение
3. CQRS как решение
www.luxoft.com
CQRS
CQRS – Command Query Responsibility Segregation
Разделение ответственности на команды и запросы
www.luxoft.com
Архитектура
www.luxoft.com
CQRS используется в связке с шаблонами
1. CQS – Command-query separation, изобретён Бертраном Мейером в далёком 1988
году. Вкратце: метод должен быть либо командой, выполняющей какое-то действие,
либо запросом, возвращающим данные, но не одновременно.
1. CQRS – возводит CQS на уровень приложения, применяя его к компонентам.
2. Event Sourcing – все изменения состояния приложения хранятся, как
последовательность событий.
3. Eventual Consistency – позволяет увеличить доступность и масштабируемость.
Согласованность в конечном счёте (англ. eventual consistency) — модель работы с данными.
Гарантирует, что в отсутствии изменений данных, через какое-то время после последнего
обновления («в конечном счёте») все запросы будут возвращать последнее обновлённое
значение.
www.luxoft.com
Роль Java Bean
Java Bean используется для
отображения данных на стороне
обработки запросов, но Java Bean !=
Domain Entity.
www.luxoft.com
Проблема 2: Оптимизация
производительности и её последствия
Денормализация данных выполняется только на
стороне обработки запросов. Доменная область
не тронута.
www.luxoft.com
Запрашиваемые данные
Каждая таблица – денормализованное представление
данных на экране пользователя
Высокопроизводительные альтернативы –
Apache Cassandra, HBase, Hypertable…
Не обязательно применять SQL базы данных
www.luxoft.com
Проблема 3: Масштабируемость
• Целостность данных нужна только на стороне
обработки бизнес логики
• На стороне обработки запросов можно использовать
eventual consistency
www.luxoft.com
Проблема 4: В реальной жизни не бывает
конфликтов модификации данных
Представление состояния объекта в виде
последовательности событий:
+3k$ -1k$ +5k$
sum: 7k$
www.luxoft.com
Представление объектов, как череда событий
• Каждый агрегат - это пакет событий
• Нет необходимости использовать реляционные базы
данных
• База должна обладать ACID(Atomicity, Consistency, Isolation,
Durability) свойствами
www.luxoft.com
Представление объектов, как череда событий
Преимущества:
• Удобно отслеживать изменения состояния системы
• Возможность отката состояния системы до любого момента
времени
• Удобный механизм воспроизведения данных и разрешения
конфликтов
• Тестирование поведения приложения(BDD)
• Расширенные возможности для дебага
www.luxoft.com
Расширенные возможности для дебага
Захватить пакет событий, которые привели к ошибке
???
Воспроизвести пакет событий локально
Четко увидеть, какая последовательность действий
привела пользователя к ошибке
PROFIT
www.luxoft.com
Архитектура CQRS приложений
4. Архитектура CQRS приложений
www.luxoft.com
Только подход....
CQRS – это набор шаблонов, очень
гибкий в плане реализаций. Всё
зависит от вас, ну и нужд бизнеса.
www.luxoft.com
Запросы к БД
www.luxoft.com
Сравнение запросов
Запрос к БД
Конвертирование в DTO
Конвертирование в
доменную модель
Передача клиенту
Многослойная архитектура:
Запрос к БД
Конвертирование в DTO
Конвертирование в
доменную модель
Передача клиенту
CQRS:
www.luxoft.com
Команды
www.luxoft.com
Команды
Преимущества использования команд:
1. Ориентация на бизнес задачи клиента
2. Удобный инструмент мониторинга и масштабирования
Команда это бизнес действие пользователя. Это то
действие, которое необходимо для реализации нужд
бизнеса.
Пример – user story: «Я, как пользователь, я хочу создавать новую
запись в адресной книге»
www.luxoft.com
Event store
www.luxoft.com
...и publish
www.luxoft.com
Плюшки
Обработка сложных событий (англ. complex event
processing, CEP) заключается в обработке
множества событий, происходящих на всех уровнях
организации, при этом идентифицируются
наиболее существенные события из множества
событий, анализируется их влияние и в режиме
реального времени предпринимаются
соответствующие действия.
www.luxoft.com
Реализация CQRS
5. Реализация CQRS
www.luxoft.com
Hail the Axon Framework
Axon framework –
достаточно
«взрослый», а так же
самый популярный и
наиболее
функциональный
из всех CQRS
фреймворков.
www.luxoft.com
Пример CQRS приложения на Java
Address Book -
Управление
списком адресов.
www.luxoft.com
www.luxoft.com
Создание и отправка команды
www.luxoft.com
www.luxoft.com
Обработка команды
www.luxoft.com
Бизнес действие
www.luxoft.com
Обработка события
www.luxoft.com
www.luxoft.com
Запрос
www.luxoft.com
Настройка через spring application context
www.luxoft.com
Axon - repository и event store
Repository
Event Store
JPA
JPA
www.luxoft.com
Event stores pros and cons
JPA event store MongoDB, Local Filesystem
Нет поддержки ACID,
большая скорость.
www.luxoft.com
Итого...
CQRS - решение, которое позволяет разрабатывать большие
корпоративные системы. Его использование облегчит
разработку и поддержку, позволит внедрить удобную систему
аудита, а так же практически без ограничений масштабировать
приложение. Применять CQRS для всей системы, не
обязательно, обычно его используют для сложных компонентов.
В то же время, его применение практически не оправдано для
маленьких систем.
www.luxoft.com

More Related Content

PDF
Микросервисы, чистый PaaS и конкурс Мисс Россия
PPTX
(2 часть) 1С-Битрикс. Производительность проекта. Архитектура проекта «Битрик...
PPTX
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
PPTX
CQRS innovations
PPTX
Что нового в 11.0?
PDF
Embarcadero Team Server для администраторов БД
PPT
1 открытые системы. клиент и сервер
PPTX
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)
Микросервисы, чистый PaaS и конкурс Мисс Россия
(2 часть) 1С-Битрикс. Производительность проекта. Архитектура проекта «Битрик...
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
CQRS innovations
Что нового в 11.0?
Embarcadero Team Server для администраторов БД
1 открытые системы. клиент и сервер
Проектируем облачный веб-сервис "по-взрослому" (Сергей Рыжиков)

What's hot (16)

PPTX
Ustar Hpc Day 2009 (R2 Highlights And Netbooting) Rus Draft0.5
PPTX
DB REPLICATION
PPTX
Преимущества системы Docsvision (наше видение)
PPT
Backendless BaaS. Dinosaurus for Jeeconf 2013
PPT
Функциональные возможности и основные модули Naumen DMS
ODP
Распределённые приложения. Часть 1. «Клиент и ядро бизнес-логики»
PDF
Дмитрий Немеш "Миграция нагруженного проекта на микросервисы"
PDF
Микросервисы на практике
PDF
Минисервисы или микросервисы в условия цейтнота, Руслан Каримов, UWDC 2015
PPTX
Bitrix24
PPTX
Проектирование и особенности проектирования клиент серверных экономических ин...
PDF
Буклет "Интеграция DIRECTUM и Dynamics CRM"
PPTX
Андрей Завадский "Бессерверная архитектура"
PPT
Битрикс-Framework
PPTX
Mediabrain & Bitrix24
Ustar Hpc Day 2009 (R2 Highlights And Netbooting) Rus Draft0.5
DB REPLICATION
Преимущества системы Docsvision (наше видение)
Backendless BaaS. Dinosaurus for Jeeconf 2013
Функциональные возможности и основные модули Naumen DMS
Распределённые приложения. Часть 1. «Клиент и ядро бизнес-логики»
Дмитрий Немеш "Миграция нагруженного проекта на микросервисы"
Микросервисы на практике
Минисервисы или микросервисы в условия цейтнота, Руслан Каримов, UWDC 2015
Bitrix24
Проектирование и особенности проектирования клиент серверных экономических ин...
Буклет "Интеграция DIRECTUM и Dynamics CRM"
Андрей Завадский "Бессерверная архитектура"
Битрикс-Framework
Mediabrain & Bitrix24
Ad

Viewers also liked (19)

PDF
Igor Dmitriev: "Java behind the scenes"
PPTX
Sergii Tsypanov: "Tricky enterprise"
PDF
ISTA 2016: Event Sourcing
PPTX
PPTX
Introduction to CQRS - command and query responsibility segregation
PPTX
PPTX
рентабельный код
PPTX
CQRS Evolved - CQRS + Akka.NET
PPTX
CQRS recipes or how to cook your architecture
PDF
CQRS на практике. В поиске точки масштабирования и новых метафор
PDF
CQRS + Event Sourcing
PDF
CQRS and Event Sourcing with MongoDB and PHP
PPTX
Fisiologìa
PPTX
DOC
Mock bar-exam-civil-law
PPTX
Rompecabezas
PPTX
term life vs whole life
PPTX
Multi-tenancy: Amplify sales with channel partners
PPTX
Tik bab 5
Igor Dmitriev: "Java behind the scenes"
Sergii Tsypanov: "Tricky enterprise"
ISTA 2016: Event Sourcing
Introduction to CQRS - command and query responsibility segregation
рентабельный код
CQRS Evolved - CQRS + Akka.NET
CQRS recipes or how to cook your architecture
CQRS на практике. В поиске точки масштабирования и новых метафор
CQRS + Event Sourcing
CQRS and Event Sourcing with MongoDB and PHP
Fisiologìa
Mock bar-exam-civil-law
Rompecabezas
term life vs whole life
Multi-tenancy: Amplify sales with channel partners
Tik bab 5
Ad

Similar to Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing" (20)

ODP
Middleware
PPT
Governance of content
PPT
Платформа Docsvision
PPTX
Roman Zdebskiy - Windows Azure
PPT
Архитектура CompanyMedia next
PDF
Система автоматизации бизнес-процессов на платформе K2 blackpearl в компании ...
PDF
redux: the best for isomorphic apps
PDF
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
PDF
AiCare - самоорганизующийся сервис управления
PPTX
AiCare - self-organizing device management service
PPTX
Kanban vs scrum_v3
PPTX
В’ячеслав Москаленко «10 criteria: Scrum vs Kanban»
PDF
Artsofte for b2 b
PPT
1С-Битрикс - Производительность
PPTX
Docker и оркетсрация контейнеров в облаке Azure
PPTX
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
PPTX
Обзор OMNITRACKER CleverENGINE
PDF
Экскурс в мир WEB разработки
PPTX
Cisco ScanSafe. Защита web-доступа как услуга “из облака”
PPT
Владимир Никонов "Вызовы при разработке enterprise продукта"
Middleware
Governance of content
Платформа Docsvision
Roman Zdebskiy - Windows Azure
Архитектура CompanyMedia next
Система автоматизации бизнес-процессов на платформе K2 blackpearl в компании ...
redux: the best for isomorphic apps
"Redux: the best for isomorphic apps", Денис Измайлов, MoscowJS 25
AiCare - самоорганизующийся сервис управления
AiCare - self-organizing device management service
Kanban vs scrum_v3
В’ячеслав Москаленко «10 criteria: Scrum vs Kanban»
Artsofte for b2 b
1С-Битрикс - Производительность
Docker и оркетсрация контейнеров в облаке Azure
Лучшие практики корпоративной разработки. Лекция 0: обзор курса.
Обзор OMNITRACKER CleverENGINE
Экскурс в мир WEB разработки
Cisco ScanSafe. Защита web-доступа как услуга “из облака”
Владимир Никонов "Вызовы при разработке enterprise продукта"

More from LogeekNightUkraine (20)

PPTX
Face recognition with c++
PPTX
C++20 features
PPTX
Autonomous driving on your developer pc. technologies, approaches, future
PDF
Orkhan Gasimov "High Performance System Design"
PPTX
Vitalii Korzh "Managed Workflows or How to Master Data"
PDF
Yevhen Tatarynov "From POC to High-Performance .NET applications"
PDF
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
PDF
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
PDF
Pavlo Zhdanov "Mastering solid and base principles for software design"
PDF
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
PDF
Iurii Antykhovych "Java and performance tools and toys"
PDF
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
PPTX
Aleksandr Kutsan "Managing Dependencies in C++"
PDF
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
PDF
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
PPTX
Michal Kordas "Docker: Good, Bad or Both"
PPTX
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
PPTX
Shestakov Illia "The Sandbox Theory"
PPTX
Dmytro Kochergin “Autotest with CYPRESS”
PPTX
Ivan Dryzhyruk “Ducks Don’t Like Bugs”
Face recognition with c++
C++20 features
Autonomous driving on your developer pc. technologies, approaches, future
Orkhan Gasimov "High Performance System Design"
Vitalii Korzh "Managed Workflows or How to Master Data"
Yevhen Tatarynov "From POC to High-Performance .NET applications"
Oleksii Kuchuk "Reading gauge values with open cv imgproc"
Oleksandr Kutsan "Using katai struct to describe the process of working with ...
Pavlo Zhdanov "Mastering solid and base principles for software design"
Serhii Zemlianyi "Error Retries with Exponential Backoff Using RabbitMQ"
Iurii Antykhovych "Java and performance tools and toys"
Eugene Bova "Dapr (Distributed Application Runtime) in a Microservices Archit...
Aleksandr Kutsan "Managing Dependencies in C++"
Yevhen Tatarynov "My .NET Application Allocates too Much Memory. What Can I Do?"
Alexandr Golyak, Nikolay Chertkov "Automotive Testing vs Test Automatio"
Michal Kordas "Docker: Good, Bad or Both"
Kolomiyets Dmytro "Dealing with Multiple Caches, When Developing Microservices"
Shestakov Illia "The Sandbox Theory"
Dmytro Kochergin “Autotest with CYPRESS”
Ivan Dryzhyruk “Ducks Don’t Like Bugs”

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