Сommand query responsibility segregation (cqrs) - Отделяем Мух от Котлет

Post on 16-Apr-2017

166 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

© 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

top related