SlideShare uma empresa Scribd logo
1 de 53
Baixar para ler offline
CQRS
Lead iOS developer
Александр Сычев
a.sychev@rambler-co.ru
@asychev89
CQRS
Collaboration and
staleness
CQRS
CQRS
😈
CQRS
Consistency Availability
Partition tolerance
CQRS
Consistency Availability
Partition tolerance
AP
CQRS
CQRS
CQRS
Presentation layer
Data access layer
Data layer
Business logic layer
CQRS
Presentation layer
Data access layer
Data layer
Business logic layer
SQL
CQRS
Presentation layer
Data access layer
Data layer
Business logic layer
SQL
ManagedObject
CQRS
Presentation layer
Data access layer
Data layer
Business logic layer
SQL
ManagedObject
PlainObject
CQRS
Presentation layer
Data access layer
Data layer
Business logic layer
SQL
ManagedObject
PlainObject
ViewModel
CQRS
Presentation layer
Data assess layer
Data layer
Business logic layer
SQL
ManagedObject
PlainObject
ViewModel
3
CQRS
Presentation layer
Data access layer
Data layer
Business logic layer
ViewModel
ViewModel
ViewModel
ViewModel
CQRS
SELECT *
FROM MyViewTable
WHERE FolderID = INBOX
CQRS
SELECT *
FROM MyViewTable
WHERE FolderID = INBOX
In-memory
CQRS
In-memory In-memory
CQRS
key/value store key/value store
CQRS
Queries and Commands
CQRS
Command–query separation
B. Meyer
CQRS
1. Queries
2. Commands
CQRS
class User {
private(set) var email: String?
func isValid(emailAddress: String?) -> Bool {
let emailTest = NSPredicate()
let isValid = emailTest.evaluate(with: emailAddress)
if isValid {
email = emailAddress // Command
}
return isValid // Query
}
}
CQRS
class User {
private(set) var email: String?
func isValid(emailAddress: String?) -> Bool {
let emailTest = NSPredicate()
let isValid = emailTest.evaluate(with: emailAddress)
if isValid {
email = emailAddress // Command
}
return isValid // Query
}
}
CQRS
class User {
private(set) var email: String?
func isValid(emailAddress: String?) -> Bool {
let emailTest = NSPredicate()
let isValid = emailTest.evaluate(with: emailAddress)
if isValid {
email = emailAddress // Command
}
return isValid // Query
}
}
CQRS
class User {
private(set) var email: String?
func isValid(emailAddress: String?) -> Bool {
let emailTest = NSPredicate()
return emailTest.evaluate(with: emailAddress)
}
func update(emailAddress: String?) {
if isValid(emailAddress: emailAddress) {
email = emailAddress
}
}
}
CQRS
Command Query
Responsibility Segregation
CQRS
Domain Model
Validation
…
O
R
M
Presentation
CQRS
Domain Model
Validation
…
Query
Command
Query model
O
R
M
CQRS
Command
•Изменяет состояние системы
•Ничего не возвращает
•Описывает действия пользователей над системой
•Хранит нужные для её выполнения данные
CQRS
Command
class DeleteUserCommand: Command, DeleteUserContext {
private var session: Session
init(session: Session) {
self.session = session
}
func execute(context: CommandContext) {
session.delete(context)
}
}
CQRS
Query
•Не изменяет состояние системы
•Хранит нужные для её выполнения данные
•Возвращает результат
CQRS
Query
class FindUserByIdQuery: Query {
private var session: Session
init(session: Session) {
self.session = session
}
func ask(context: QueryContext) -> User {
return session.query(context)
}
}
CQRS
MessageService
- (void)createDraftMessageWithCompletion:(CompletionBlock)block;
- (void)sendMessage:(Message *)message;
- (Array<Message> *)messagesForFolder:(NSString *)folder;
- (void)obtainAttachment:(Attachment *)attachment
completion:(ErrorBlock)block;
CQRS
MessageService
- (void)createDraftMessageWithCompletion:(CompletionBlock)block;
- (void)sendMessage:(Message *)message;
- (Array<Message> *)messagesForFolder:(NSString *)folder;
- (void)obtainAttachment:(Attachment *)attachment
completion:(ErrorBlock)block;
•- query•- command
CQRS
MessageService
•- query•- command
CreateMessageCommand
SendMessageCommand
ObtainMessagesInFolderQuery
ObtainAttachmentQuery
CQRS
CQRS
•Меньше зависимостей в каждом классе
•Соблюдается SRP
•Проще изменять
•Проще тестировать
•Однотипный дизайн кода
CQRS
Domain Model
Validation
…
Query
Command
Query model
O
R
M
w
r
Event
Publisher
CQRS
Event
struct Event {
var name: String
var payload: [String: AnyObject]?
}
DidSendMessage DidCreateDraft
CQRS
Occasionally Connected
Clients
CQRS
CQRS
Conference
•Что пойдет не так, если сети нет?
•Как клиент обрабатывает отложенные события?
•Что стоит сделать при появлении сети?
CQRS
Conference
•Пусть клиент продолжает работать
•Нужна очередь отложенных событий
•Синхронизировать данные и сообщить о конфликте
CQRS
Domain Model
Validation
…
Query
Command
Query model
O
R
M
w
r
Event
Publisher
CQRS
Flux
CQRS
CQRS
Выводы
CQRS
Недостатки
•Новый стиль мышления
•Сложность синхронизации
•Overengineering
CQRS
Достоинства
•Высокая производительность чтения
•SRP
•Тестируемость
CQRS
Достоинства
ivdyagileva@gmail.com
CQRS
Достоинства
•Высокая производительность чтения
•SRP
•Тестируемость
CQRS
a.sychev@rambler-co.ru
@asychev89
Domain Model
Validation
…
Query
Command
Query model
w
r
Event
O
R
M

Mais conteúdo relacionado

Mais procurados

Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
tvaleev
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Ontico
 

Mais procurados (20)

Введение в Realm.io
Введение в Realm.ioВведение в Realm.io
Введение в Realm.io
 
Clojure – есть ли жизнь после Java
Clojure – есть ли жизнь после JavaClojure – есть ли жизнь после Java
Clojure – есть ли жизнь после Java
 
Scala On Rest
Scala On RestScala On Rest
Scala On Rest
 
MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.
 
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
Многопоточность, работа с сетью (Lecture 12 – multithreading, network)
 
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
Stream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководовStream API: рекомендации лучших собаководов
Stream API: рекомендации лучших собаководов
 
Java threads - part 3
Java threads - part 3Java threads - part 3
Java threads - part 3
 
ECMAscript harmony
ECMAscript harmonyECMAscript harmony
ECMAscript harmony
 
Practical usage of RxJava 2
Practical usage of RxJava 2Practical usage of RxJava 2
Practical usage of RxJava 2
 
Scala for android
Scala for androidScala for android
Scala for android
 
«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​«Как перестать отлаживать асинхронные вызовы и начать жить»​
«Как перестать отлаживать асинхронные вызовы и начать жить»​
 
Java threads - part 2
Java threads - part 2Java threads - part 2
Java threads - part 2
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
 
Java threads - part 1
Java threads - part 1Java threads - part 1
Java threads - part 1
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
 
RDSDataSource: Promises
RDSDataSource: PromisesRDSDataSource: Promises
RDSDataSource: Promises
 
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
Библиотеки для передачи данных (Lecture 13 – multithreading, network (libs))
 
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETЧто нам стоит DAL построить? Акуляков Артём D2D Just.NET
Что нам стоит DAL построить? Акуляков Артём D2D Just.NET
 

Semelhante a Александр Сычев "Разделяй и властвуй: CQRS в iOS"

Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
sqadays8
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8
Technopark
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
Technopark
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
it-people
 

Semelhante a Александр Сычев "Разделяй и властвуй: CQRS в iOS" (20)

Расширение библиотеки Slick
Расширение библиотеки SlickРасширение библиотеки Slick
Расширение библиотеки Slick
 
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
Надежда Серкова -- Автоматическая генерация Perl скриптов для тестирования си...
 
Jdbc in java
Jdbc in javaJdbc in java
Jdbc in java
 
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
Industrial Programming Java - Lection Pack 03 - Relational Databases - Lavren...
 
JDBC
JDBCJDBC
JDBC
 
Работа с БД в Java
Работа с БД в JavaРабота с БД в Java
Работа с БД в Java
 
Sql server clr integration
Sql server clr integration Sql server clr integration
Sql server clr integration
 
Новости Global summit 2015
Новости Global summit 2015Новости Global summit 2015
Новости Global summit 2015
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8
 
Зачем нужна Scala?
Зачем нужна Scala?Зачем нужна Scala?
Зачем нужна Scala?
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
SQL Server Denali
SQL Server DenaliSQL Server Denali
SQL Server Denali
 
Тестирование производительности систем мониторинга на платформе Microsoft SCO...
Тестирование производительности систем мониторинга на платформе Microsoft SCO...Тестирование производительности систем мониторинга на платформе Microsoft SCO...
Тестирование производительности систем мониторинга на платформе Microsoft SCO...
 
Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!Взломать Web-сайт на ASP.NET? Сложно, но можно!
Взломать Web-сайт на ASP.NET? Сложно, но можно!
 
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NET
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
View как чистая функция от состояния базы данных  - Илья Беда, bro.agencyView как чистая функция от состояния базы данных  - Илья Беда, bro.agency
View как чистая функция от состояния базы данных - Илья Беда, bro.agency
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
Class queries
Class queriesClass queries
Class queries
 

Mais de IT Event

Mais de IT Event (20)

Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...
Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...
Denis Radin - "Applying NASA coding guidelines to JavaScript or airspace is c...
 
Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"
Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"
Sara Harkousse - "Web Components: It's all rainbows and unicorns! Is it?"
 
Max Voloshin - "Organization of frontend development for products with micros...
Max Voloshin - "Organization of frontend development for products with micros...Max Voloshin - "Organization of frontend development for products with micros...
Max Voloshin - "Organization of frontend development for products with micros...
 
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
Roman Romanovsky, Sergey Rak - "JavaScript в IoT "
 
Konstantin Krivlenia - "Continuous integration for frontend"
Konstantin Krivlenia - "Continuous integration for frontend"Konstantin Krivlenia - "Continuous integration for frontend"
Konstantin Krivlenia - "Continuous integration for frontend"
 
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
Illya Klymov - "Vue.JS: What did I swap React for in 2017 and why?"
 
Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"
Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"
Evgeny Gusev - "A circular firing squad: How technologies drag frontend down"
 
Vladimir Grinenko - "Dependencies in component web done right"
Vladimir Grinenko - "Dependencies in component web done right"Vladimir Grinenko - "Dependencies in component web done right"
Vladimir Grinenko - "Dependencies in component web done right"
 
Dmitry Bartalevich - "How to train your WebVR"
Dmitry Bartalevich - "How to train your WebVR"Dmitry Bartalevich - "How to train your WebVR"
Dmitry Bartalevich - "How to train your WebVR"
 
Aleksey Bogachuk - "Offline Second"
Aleksey Bogachuk - "Offline Second"Aleksey Bogachuk - "Offline Second"
Aleksey Bogachuk - "Offline Second"
 
James Allardice - "Building a better login with the credential management API"
James Allardice - "Building a better login with the credential management API"James Allardice - "Building a better login with the credential management API"
James Allardice - "Building a better login with the credential management API"
 
Fedor Skuratov "Dark Social: as messengers change the market of social media ...
Fedor Skuratov "Dark Social: as messengers change the market of social media ...Fedor Skuratov "Dark Social: as messengers change the market of social media ...
Fedor Skuratov "Dark Social: as messengers change the market of social media ...
 
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
Андрей Зайчиков "Архитектура распределенных кластеров NoSQL на AWS"
 
Алексей Рагозин "Java и linux борьба за микросекунды"
Алексей Рагозин "Java и linux борьба за микросекунды"Алексей Рагозин "Java и linux борьба за микросекунды"
Алексей Рагозин "Java и linux борьба за микросекунды"
 
Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"
Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"
Volodymyr Lyubinets "Introduction to big data processing with Apache Spark"
 
Наш ответ Uber’у
Наш ответ Uber’уНаш ответ Uber’у
Наш ответ Uber’у
 
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"Александр Крашенинников "Hadoop High Availability: опыт Badoo"
Александр Крашенинников "Hadoop High Availability: опыт Badoo"
 
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
Leonid Vasilyev  "Building, deploying and running production code at Dropbox"Leonid Vasilyev  "Building, deploying and running production code at Dropbox"
Leonid Vasilyev "Building, deploying and running production code at Dropbox"
 
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
Анатолий Пласковский "Миллионы карточных платежей за месяц, или как потерять ...
 
Mete Atamel "Resilient microservices with kubernetes"
Mete Atamel "Resilient microservices with kubernetes"Mete Atamel "Resilient microservices with kubernetes"
Mete Atamel "Resilient microservices with kubernetes"
 

Александр Сычев "Разделяй и властвуй: CQRS в iOS"