© 2016 Magento, Inc. Page | 1 © 2016 Magento, Inc. Page | 1 Command/Query Responsibility Segregation (CQRS) – отделяем мух от котлет Миняйло Игорь
© 2016 Magento, Inc. Page | 1© 2016 Magento, Inc. Page | 1
Command/Query Responsibility Segregation (CQRS) – отделяем мух от котлет
Миняйло Игорь
© 2016 Magento, Inc. Page | 2© 2016 Magento, Inc. Page | 2
© 2016 Magento, Inc. Page | 3© 2016 Magento, Inc. Page | 3
© 2016 Magento, Inc. Page | 4© 2016 Magento, Inc. Page | 4
© 2016 Magento, Inc. Page | 5© 2016 Magento, Inc. Page | 5
© 2016 Magento, Inc. Page | 6© 2016 Magento, Inc. Page | 6
RAD – Rapid Application Development
• Бизнес диктует сроки и требования. Deadline – «на вчера»
• Нужно как можно быстрее проверить гипотезы, понять, нужен ли продукт хоть кому-нибудь и попытаться подписать первых клиентов уже хотя бы на стадии MVP (особенно актуально для стартапов)
© 2016 Magento, Inc. Page | 7© 2016 Magento, Inc. Page | 7
Классическая N-слойная архитектура
© 2016 Magento, Inc. Page | 8© 2016 Magento, Inc. Page | 8
Классическая N-слойная архитектура
© 2016 Magento, Inc. Page | 9© 2016 Magento, Inc. Page | 9
Классическая N-слойная архитектура
Мы читаем и пишем данные через одни и те же слои
Используя те же интерфейсы (модели)
© 2016 Magento, Inc. Page | 10© 2016 Magento, Inc. Page | 10
© 2016 Magento, Inc. Page | 11© 2016 Magento, Inc. Page | 11
© 2016 Magento, Inc. Page | 12© 2016 Magento, Inc. Page | 12
Классическая N-слойная архитектура
• Компромисс в проектировании модели данных
• Невозможность масштабировать отдельно чтение от записи
• Анемичность моделей данных• Тенденция к монолитной
архитектуре
© 2016 Magento, Inc. Page | 13© 2016 Magento, Inc. Page | 13
© 2016 Magento, Inc. Page | 14© 2016 Magento, Inc. Page | 14
© 2016 Magento, Inc. Page | 15© 2016 Magento, Inc. Page | 15
© 2016 Magento, Inc. Page | 16© 2016 Magento, Inc. Page | 16
© 2016 Magento, Inc. Page | 17© 2016 Magento, Inc. Page | 17
© 2016 Magento, Inc. Page | 18© 2016 Magento, Inc. Page | 18
CQS – Command-Query Separation
Каждый метод должен быть либо командой (command) выполняющей действие, либо запросом (query) возвращающим данные, но не тем и другим одновременно. 1980, Бертран Мейер
Т.е Задавая вопрос вы не должны менять ответ на этот вопрос
© 2016 Magento, Inc. Page | 19© 2016 Magento, Inc. Page | 19
CQS
Создаем отдельные методы в рамках одного класса, чтобы читать (Query) и изменять состояние (Command)
class UserAccount{ /** * @var boolean */ private $isActive;
/** * @return boolean Return true if active; otherwise return false */ public function isActive() { return $this->isActive; }
/** * @return void */ public function activate() { $this->isActive = true; }}
© 2016 Magento, Inc. Page | 20© 2016 Magento, Inc. Page | 20
Query методы должны быть Идемпотентны
© 2016 Magento, Inc. Page | 21© 2016 Magento, Inc. Page | 21
CQRS – Command/Query Responsibility Segregation
© 2016 Magento, Inc. Page | 22© 2016 Magento, Inc. Page | 22
CQRS
CQRS – это просто создание двух объектов, там где мы раньше создавали один
Грег Янг
© 2016 Magento, Inc. Page | 23© 2016 Magento, Inc. Page | 23
CQRS – это просто!
© 2016 Magento, Inc. Page | 24© 2016 Magento, Inc. Page | 24
CQRS и Domain Driven Design
В CQRS вы должны думать о дизайне Доменной модели (Command)
© 2016 Magento, Inc. Page | 25© 2016 Magento, Inc. Page | 25
CQRS и Domain Driven Design
© 2016 Magento, Inc. Page | 26© 2016 Magento, Inc. Page | 26
Пользовательские Интерфейсы
(с) Cayetano de Arquer Buigas
© 2016 Magento, Inc. Page | 27© 2016 Magento, Inc. Page | 27
CRUD Based UI
Вам НЕ нужен CQRS для CRUD приложений (“forms over data”)
© 2016 Magento, Inc. Page | 28© 2016 Magento, Inc. Page | 28
Task Based UI
© 2016 Magento, Inc. Page | 29© 2016 Magento, Inc. Page | 29
Task Based UI
© 2016 Magento, Inc. Page | 30© 2016 Magento, Inc. Page | 30
CAP Теорема
© 2016 Magento, Inc. Page | 31© 2016 Magento, Inc. Page | 31
Eventual Consistency
http://www.enterpriseintegrationpatterns.com/docs/IEEE_Software_Design_2PC.pdf
© 2016 Magento, Inc. Page | 32© 2016 Magento, Inc. Page | 32
Eventual Consistency и асинхронность
© 2016 Magento, Inc. Page | 33© 2016 Magento, Inc. Page | 33
CQRS over HTTP
• GET (безопасный) – это Query• POST/PUT/DELETE/PATCH (не безопасные) –
это Command
© 2016 Magento, Inc. Page | 34© 2016 Magento, Inc. Page | 34
CQRS и REST API
© 2016 Magento, Inc. Page | 35© 2016 Magento, Inc. Page | 35
REST API и Асинхронность
© 2016 Magento, Inc. Page | 36© 2016 Magento, Inc. Page | 36
CQRS и MVC
Неправильная реализация
© 2016 Magento, Inc. Page | 37© 2016 Magento, Inc. Page | 37
CQRS и MVC
Правильная реализация
(c) https://antonkril.github.io/mvc-http-cqrs
© 2016 Magento, Inc. Page | 38© 2016 Magento, Inc. Page | 38
Микросервисная архитектура как альтернатива монолиту
© 2016 Magento, Inc. Page | 39© 2016 Magento, Inc. Page | 39
© 2016 Magento, Inc. Page | 40© 2016 Magento, Inc. Page | 40
© 2016 Magento, Inc. Page | 41© 2016 Magento, Inc. Page | 41
YAGNI - You aren't gonna need it
• CQRS – это дополнительная сложность, которая вам скорее всего не нужна
• Очень тяжело добавить в legacy системы• Нужно решить как денормализировать данные• Не подойдет для стартапов! (В условиях постоянной
спешки и постоянно меняющихся требований нет никакого смысла проектировать крутое и гибкое ядро. Эта инвестиция никогда не окупится, кроме случая, когда это ядро является самим продуктом.)
* YAGNI - Вам это не понадобится
© 2016 Magento, Inc. Page | 42© 2016 Magento, Inc. Page | 42
© 2016 Magento, Inc. Page | 43© 2016 Magento, Inc. Page | 43
Вопросы, господа!
© 2016 Magento, Inc. Page | 44© 2016 Magento, Inc. Page | 44
Если вы испуганы, одиноки, вам стыдно или просто хочется поговорить «об этом» - вы знаете где меня найти… igor.minyaylo
@iminyaylo
igor.minyaylo