44
© 2016 Magento, Inc. Page | 1 © 2016 Magento, Inc. Page | 1 Command/Query Responsibility Segregation (CQRS) – отделяем мух от котлет Миняйло Игорь

Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

Embed Size (px)

Citation preview

Page 1: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 1© 2016 Magento, Inc. Page | 1

Command/Query Responsibility Segregation (CQRS) – отделяем мух от котлет

Миняйло Игорь

Page 2: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 2© 2016 Magento, Inc. Page | 2

Page 3: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 3© 2016 Magento, Inc. Page | 3

Page 4: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 4© 2016 Magento, Inc. Page | 4

Page 5: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 5© 2016 Magento, Inc. Page | 5

Page 6: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 6© 2016 Magento, Inc. Page | 6

RAD – Rapid Application Development

• Бизнес диктует сроки и требования. Deadline – «на вчера»

• Нужно как можно быстрее проверить гипотезы, понять, нужен ли продукт хоть кому-нибудь и попытаться подписать первых клиентов уже хотя бы на стадии MVP (особенно актуально для стартапов)

Page 7: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 7© 2016 Magento, Inc. Page | 7

Классическая N-слойная архитектура

Page 8: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 8© 2016 Magento, Inc. Page | 8

Классическая N-слойная архитектура

Page 9: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 9© 2016 Magento, Inc. Page | 9

Классическая N-слойная архитектура

Мы читаем и пишем данные через одни и те же слои

Используя те же интерфейсы (модели)

Page 10: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 10© 2016 Magento, Inc. Page | 10

Page 11: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 11© 2016 Magento, Inc. Page | 11

Page 12: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 12© 2016 Magento, Inc. Page | 12

Классическая N-слойная архитектура

• Компромисс в проектировании модели данных

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

• Анемичность моделей данных• Тенденция к монолитной

архитектуре

Page 13: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 13© 2016 Magento, Inc. Page | 13

Page 14: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 14© 2016 Magento, Inc. Page | 14

Page 15: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 15© 2016 Magento, Inc. Page | 15

Page 16: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 16© 2016 Magento, Inc. Page | 16

Page 17: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 17© 2016 Magento, Inc. Page | 17

Page 18: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 18© 2016 Magento, Inc. Page | 18

CQS – Command-Query Separation

Каждый метод должен быть либо командой (command) выполняющей действие, либо запросом (query) возвращающим данные, но не тем и другим одновременно. 1980, Бертран Мейер

Т.е Задавая вопрос вы не должны менять ответ на этот вопрос

Page 19: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 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; }}

Page 20: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 20© 2016 Magento, Inc. Page | 20

Query методы должны быть Идемпотентны

Page 21: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 21© 2016 Magento, Inc. Page | 21

CQRS – Command/Query Responsibility Segregation

Page 22: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 22© 2016 Magento, Inc. Page | 22

CQRS

CQRS – это просто создание двух объектов, там где мы раньше создавали один

Грег Янг

Page 23: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 23© 2016 Magento, Inc. Page | 23

CQRS – это просто!

Page 24: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 24© 2016 Magento, Inc. Page | 24

CQRS и Domain Driven Design

В CQRS вы должны думать о дизайне Доменной модели (Command)

Page 25: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 25© 2016 Magento, Inc. Page | 25

CQRS и Domain Driven Design

Page 26: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 26© 2016 Magento, Inc. Page | 26

Пользовательские Интерфейсы

(с) Cayetano de Arquer Buigas

Page 27: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 27© 2016 Magento, Inc. Page | 27

CRUD Based UI

Вам НЕ нужен CQRS для CRUD приложений (“forms over data”)

Page 28: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 28© 2016 Magento, Inc. Page | 28

Task Based UI

Page 29: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 29© 2016 Magento, Inc. Page | 29

Task Based UI

Page 30: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 30© 2016 Magento, Inc. Page | 30

CAP Теорема

Page 31: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 31© 2016 Magento, Inc. Page | 31

Eventual Consistency

http://www.enterpriseintegrationpatterns.com/docs/IEEE_Software_Design_2PC.pdf

Page 32: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 32© 2016 Magento, Inc. Page | 32

Eventual Consistency и асинхронность

Page 33: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 33© 2016 Magento, Inc. Page | 33

CQRS over HTTP

• GET (безопасный) – это Query• POST/PUT/DELETE/PATCH (не безопасные) –

это Command

Page 34: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 34© 2016 Magento, Inc. Page | 34

CQRS и REST API

Page 35: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 35© 2016 Magento, Inc. Page | 35

REST API и Асинхронность

Page 36: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 36© 2016 Magento, Inc. Page | 36

CQRS и MVC

Неправильная реализация

Page 37: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 37© 2016 Magento, Inc. Page | 37

CQRS и MVC

Правильная реализация

(c) https://antonkril.github.io/mvc-http-cqrs

Page 38: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 38© 2016 Magento, Inc. Page | 38

Микросервисная архитектура как альтернатива монолиту

Page 39: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 39© 2016 Magento, Inc. Page | 39

Page 40: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 40© 2016 Magento, Inc. Page | 40

Page 41: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 41© 2016 Magento, Inc. Page | 41

YAGNI - You aren't gonna need it

• CQRS – это дополнительная сложность, которая вам скорее всего не нужна

• Очень тяжело добавить в legacy системы• Нужно решить как денормализировать данные• Не подойдет для стартапов! (В условиях постоянной

спешки и постоянно меняющихся требований нет никакого смысла проектировать крутое и гибкое ядро. Эта инвестиция никогда не окупится, кроме случая, когда это ядро является самим продуктом.)

* YAGNI - Вам это не понадобится

Page 42: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 42© 2016 Magento, Inc. Page | 42

Page 43: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 43© 2016 Magento, Inc. Page | 43

Вопросы, господа!

Page 44: Сommand Query Responsibility Segregation (CQRS) - Отделяем Мух от Котлет

© 2016 Magento, Inc. Page | 44© 2016 Magento, Inc. Page | 44

Если вы испуганы, одиноки, вам стыдно или просто хочется поговорить «об этом» - вы знаете где меня найти… igor.minyaylo

@iminyaylo

igor.minyaylo