Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 = NSPredicat...
CQRS
class User {
private(set) var email: String?
func isValid(emailAddress: String?) -> Bool {
let emailTest = NSPredicat...
CQRS
class User {
private(set) var email: String?
func isValid(emailAddress: String?) -> Bool {
let emailTest = NSPredicat...
CQRS
class User {
private(set) var email: String?
func isValid(emailAddress: String?) -> Bool {
let emailTest = NSPredicat...
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) {
s...
CQRS
Query
•Не изменяет состояние системы
•Хранит нужные для её выполнения данные
•Возвращает результат
CQRS
Query
class FindUserByIdQuery: Query {
private var session: Session
init(session: Session) {
self.session = session
}...
CQRS
MessageService
- (void)createDraftMessageWithCompletion:(CompletionBlock)block;
- (void)sendMessage:(Message *)messag...
CQRS
MessageService
- (void)createDraftMessageWithCompletion:(CompletionBlock)block;
- (void)sendMessage:(Message *)messag...
CQRS
MessageService
•- query•- command
CreateMessageCommand
SendMessageCommand
ObtainMessagesInFolderQuery
ObtainAttachmen...
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
Александр Сычев "Разделяй и властвуй: CQRS в iOS"
Upcoming SlideShare
Loading in …5
×

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

199 views

Published on

В сложных мобильных приложениях, работающих с большим объемом постоянно изменяющихся данных, задача их синхронизации и своевременного обновления в разных модулях становится нетривиальной. В своем докладе я предлагаю отойти от привычных подходов и применить практику разделения ответственности на команды и запросы, предполагающую использование разных моделей для обновления и чтения информации. Я продемонстрирую области, в которых этот подход поможет мобильным разработчикам эффективно развивать их приложения. Слушатели узнают о сложностях, с которыми им придется столкнуться при его адаптации и о том, как их следует решать.
Рассказ будет интересен опытным разработчикам, сталкивающимся в своей практике с задачей развития высокопроизводительных приложений со множеством потоков данных.

Published in: Education
  • Be the first to comment

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

  1. 1. CQRS Lead iOS developer Александр Сычев a.sychev@rambler-co.ru @asychev89
  2. 2. CQRS Collaboration and staleness
  3. 3. CQRS
  4. 4. CQRS 😈
  5. 5. CQRS Consistency Availability Partition tolerance
  6. 6. CQRS Consistency Availability Partition tolerance AP
  7. 7. CQRS
  8. 8. CQRS
  9. 9. CQRS Presentation layer Data access layer Data layer Business logic layer
  10. 10. CQRS Presentation layer Data access layer Data layer Business logic layer SQL
  11. 11. CQRS Presentation layer Data access layer Data layer Business logic layer SQL ManagedObject
  12. 12. CQRS Presentation layer Data access layer Data layer Business logic layer SQL ManagedObject PlainObject
  13. 13. CQRS Presentation layer Data access layer Data layer Business logic layer SQL ManagedObject PlainObject ViewModel
  14. 14. CQRS Presentation layer Data assess layer Data layer Business logic layer SQL ManagedObject PlainObject ViewModel 3
  15. 15. CQRS Presentation layer Data access layer Data layer Business logic layer ViewModel ViewModel ViewModel ViewModel
  16. 16. CQRS SELECT * FROM MyViewTable WHERE FolderID = INBOX
  17. 17. CQRS SELECT * FROM MyViewTable WHERE FolderID = INBOX In-memory
  18. 18. CQRS In-memory In-memory
  19. 19. CQRS key/value store key/value store
  20. 20. CQRS Queries and Commands
  21. 21. CQRS Command–query separation B. Meyer
  22. 22. CQRS 1. Queries 2. Commands
  23. 23. 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 } }
  24. 24. 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 } }
  25. 25. 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 } }
  26. 26. 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 } } }
  27. 27. CQRS Command Query Responsibility Segregation
  28. 28. CQRS Domain Model Validation … O R M Presentation
  29. 29. CQRS Domain Model Validation … Query Command Query model O R M
  30. 30. CQRS Command •Изменяет состояние системы •Ничего не возвращает •Описывает действия пользователей над системой •Хранит нужные для её выполнения данные
  31. 31. CQRS Command class DeleteUserCommand: Command, DeleteUserContext { private var session: Session init(session: Session) { self.session = session } func execute(context: CommandContext) { session.delete(context) } }
  32. 32. CQRS Query •Не изменяет состояние системы •Хранит нужные для её выполнения данные •Возвращает результат
  33. 33. CQRS Query class FindUserByIdQuery: Query { private var session: Session init(session: Session) { self.session = session } func ask(context: QueryContext) -> User { return session.query(context) } }
  34. 34. CQRS MessageService - (void)createDraftMessageWithCompletion:(CompletionBlock)block; - (void)sendMessage:(Message *)message; - (Array<Message> *)messagesForFolder:(NSString *)folder; - (void)obtainAttachment:(Attachment *)attachment completion:(ErrorBlock)block;
  35. 35. CQRS MessageService - (void)createDraftMessageWithCompletion:(CompletionBlock)block; - (void)sendMessage:(Message *)message; - (Array<Message> *)messagesForFolder:(NSString *)folder; - (void)obtainAttachment:(Attachment *)attachment completion:(ErrorBlock)block; •- query•- command
  36. 36. CQRS MessageService •- query•- command CreateMessageCommand SendMessageCommand ObtainMessagesInFolderQuery ObtainAttachmentQuery
  37. 37. CQRS CQRS •Меньше зависимостей в каждом классе •Соблюдается SRP •Проще изменять •Проще тестировать •Однотипный дизайн кода
  38. 38. CQRS Domain Model Validation … Query Command Query model O R M w r Event Publisher
  39. 39. CQRS Event struct Event { var name: String var payload: [String: AnyObject]? } DidSendMessage DidCreateDraft
  40. 40. CQRS Occasionally Connected Clients
  41. 41. CQRS
  42. 42. CQRS Conference •Что пойдет не так, если сети нет? •Как клиент обрабатывает отложенные события? •Что стоит сделать при появлении сети?
  43. 43. CQRS Conference •Пусть клиент продолжает работать •Нужна очередь отложенных событий •Синхронизировать данные и сообщить о конфликте
  44. 44. CQRS Domain Model Validation … Query Command Query model O R M w r Event Publisher
  45. 45. CQRS Flux
  46. 46. CQRS
  47. 47. CQRS Выводы
  48. 48. CQRS Недостатки •Новый стиль мышления •Сложность синхронизации •Overengineering
  49. 49. CQRS Достоинства •Высокая производительность чтения •SRP •Тестируемость
  50. 50. CQRS Достоинства ivdyagileva@gmail.com
  51. 51. CQRS Достоинства •Высокая производительность чтения •SRP •Тестируемость
  52. 52. CQRS a.sychev@rambler-co.ru @asychev89 Domain Model Validation … Query Command Query model w r Event O R M

×