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       with                      v3JOliver Event Store
Дорога к CQRS
Database            GUI  GUI access  Business  Database access             GUI  GUI      logic logic               Busines...
GUIBusiness  logic  Data access
GUIDomain ModelORMDatabase       M$$SQL
GUIDomain Model            Lazy Loading !!!                            OUCH!ORMDatabase       M$$SQL
GUI               DTODomain ModelORMDatabase       M$$SQL
GUI               DTODomain Model            Object-To-Object Mapping !!!                                  OUCH!ORMDatabas...
Отчеты                         Domain          ORM8-ми этажный SQL                   RDB
А ручки то, на что?
Отчеты                      Ручками                                                SQL красиво упрятан за                 ...
Form UI               Reports UI                                                                      send                ...
Form UI             Reports UIDTO       DTO          DTO     DTO  Application           Reporting   Services              ...
И что дальше?
CQRS (did you mean “Cars”?)                     Client   Command                        Query  Application                ...
Как синхронизировать ?Domain Model     View Model
Потеря «сути» измененийDomain      ORM     Changeset               Denormalizer                                           ...
CQRS       +Event Sourcing       =   LOVE!
Традиционный подход                             Текущее состояниеDomain    ORM                   Storage
Event Sourcing                              Журнал всех измененийDomain            Invoice                  Created       ...
Традиционный подход
Event Sourcing
SRP на уровне метода ! Принятие решения овозможности перехода     состояния    (бизнес-правила) Переход состояния      (тр...
И как это работает?Ну и как это всж работает?
Восстановление текущего состоянияЖурнал изменений      Invoice1     Created      Invoice2    Approved      Invoice3    Fin...
Сохранение изменений                       Буфер                        Invoice                       Approved            ...
Сохранение измененийБуфер                 Журнал изменений Invoice                   Invoice                      1    Cre...
Тривиально,неправда ли?Log.append(id, events)events = Log.read(id)
Обеспечение параллельного доступа
Параллельные модификации           Invoice  update               finalize           Invoice           Created            I...
Оптимистическая блокировкаInvoice                    Stream                    Invoice[ID:542]                   [ID:542] ...
Оптимистическая блокировкаInvoice                      Stream                      Invoice[ID:542]                      [I...
Оптимистическая блокировкаInvoice                       Stream                      Invoice[ID:542]                       ...
Допустимые параллельные модификации               General Ledger        post                    post                 Trans...
Высокая производительность
Минимальное количество           операций записиAggregate                               Stream                   Commit   ...
Минимальное количество           операций записиAggregate                               Stream                   Commit   ...
Гибкие возможности сериализации     • JSON     • Binary     • Custom (ProtoBuf, .NET, whatever)     • GZip     • Криптование
Оптимизация операции восстановления  состояния при помощи «снимков»                                                 E1 Агг...
Распределенная транзакцияCommand Queue  С1      С2         ..            Сn                  dequeue (C1)                 ...
Без 2PCCommand Queue С1         С2             ..         Сn  0. peek (C1)             2. remove (C1)    T2       Command ...
Без 2PC необходимаподдержка идемпотентности Command Queue     С1          С2          ..        Сn        0. peek (C1)    ...
Без 2PC необходимаподдержка идемпотентности Command Queue     С1          С2          ..        Сn        0. peek (C1)    ...
Без 2PC необходимаподдержка идемпотентности Command Queue     С1          С2          ..        Сn        0. peek (C1)    ...
Обработка событий              publish              update                         E1   E2Event Store                     ...
Обработка событий (PULL)              Get new events since (Time)Event Store                                      View Mod...
Обработка событий (PULL)              Get new events since (Time)Event Store                                 View Model   ...
Обработка событий (PULL)              Get new events since (Time)Event Store                                 View Model   ...
Обработка событий (PULL)              Get undispatched eventsEvent Store                                     View Model   ...
Обработка событий (PUSH)                      publish (commit)Event Store                                  View Model     ...
Встроенный диспетчер событий                              BUS                cmd                                events    ...
Встроенный диспетчер событий                                   BUS                cmd                                     ...
Архитектура
Event Stream         Commit                                      Commit                                  Event MessageDisp...
Поддерживаемые технологии                        хранилища данныхRelational Databases:                  Embedded Relationa...
Расширяемость
Метаданые  Commit            Dictionary<string, object>                 Office, User, PrecedingMessageIdEvent Message     ...
Хуки                          Event StoreМесто для “врезки” вконвейер обработки                                           ...
Хуки
Диспатчер – это встроенный хук
Механизмы эволюции  схемы событий
2 подхода• Толерантный сериализатор• Явное версионирование
Свалка аппликаторов в бизнес-аггрегате
Преемственность версий      InvoiceCreated              convert to     InvoiceCreated_v2              convert to     Invoi...
Хук-конвертер в Event Store
Проект CommonDomain
Базовый класс для Аггрегатов
Репозиторий - DAO для Аггрегатов
Обработка конфликтов параллельного доступа
Допустимые параллельные модификации               General Ledger        post                    post                 Trans...
Легко создавать специализированные политикиопределения конфликтов параллельных изменений
Ссылочки:•   http://cqrs.wordpress.com•   https://github.com/joliver/EventStore•   https://github.com/joliver/CommonDomain
Upcoming SlideShare
Loading in …5
×

CQRS EventStore

3,719 views

Published on

Published in: Technology

CQRS EventStore

  1. 1. CQRS with v3JOliver Event Store
  2. 2. Дорога к CQRS
  3. 3. Database GUI GUI access Business Database access GUI GUI logic logic Business GUI Database access Business logic GUIDatabase access Business logic GUI DatabaseGUIBusiness logic access GUI Business logic Database access
  4. 4. GUIBusiness logic Data access
  5. 5. GUIDomain ModelORMDatabase M$$SQL
  6. 6. GUIDomain Model Lazy Loading !!! OUCH!ORMDatabase M$$SQL
  7. 7. GUI DTODomain ModelORMDatabase M$$SQL
  8. 8. GUI DTODomain Model Object-To-Object Mapping !!! OUCH!ORMDatabase M$$SQL
  9. 9. Отчеты Domain ORM8-ми этажный SQL RDB
  10. 10. А ручки то, на что?
  11. 11. Отчеты Ручками SQL красиво упрятан за фасадом хранимых процедур  N этажный SQL(правда, почище и побыстрее, чем с ORM) RDB
  12. 12. Form UI Reports UI send request DTO DTO DTO DTO Application Reporting Services Services Domain Domain Object Object Handcrafted SQL ORM 3NF with optimizationslike 1NF in some places  RDB
  13. 13. Form UI Reports UIDTO DTO DTO DTO Application Reporting Services Services Здесь жирненькоDomainObject Handcrafted SQLORM RDB
  14. 14. И что дальше?
  15. 15. CQRS (did you mean “Cars”?) Client Command Query Application Query Services ServicesDomain Domain DTO DTOObject Object Data Storage Data Storage
  16. 16. Как синхронизировать ?Domain Model View Model
  17. 17. Потеря «сути» измененийDomain ORM Changeset Denormalizer View Model Непрозрачный сгусток данных 
  18. 18. CQRS +Event Sourcing = LOVE!
  19. 19. Традиционный подход Текущее состояниеDomain ORM Storage
  20. 20. Event Sourcing Журнал всех измененийDomain Invoice Created Invoice Approved Invoice Finalized
  21. 21. Традиционный подход
  22. 22. Event Sourcing
  23. 23. SRP на уровне метода ! Принятие решения овозможности перехода состояния (бизнес-правила) Переход состояния (транзитор)Собственно, изменен ие состояния (аппликатор)
  24. 24. И как это работает?Ну и как это всж работает?
  25. 25. Восстановление текущего состоянияЖурнал изменений Invoice1 Created Invoice2 Approved Invoice3 Finalized
  26. 26. Сохранение изменений Буфер Invoice Approved Invoice Finalized
  27. 27. Сохранение измененийБуфер Журнал изменений Invoice Invoice 1 CreatedApproved append Invoice InvoiceFinalized 2 Approved Invoice 3 Finalized
  28. 28. Тривиально,неправда ли?Log.append(id, events)events = Log.read(id)
  29. 29. Обеспечение параллельного доступа
  30. 30. Параллельные модификации Invoice update finalize Invoice Created Invoice Finalized Invoice Updated
  31. 31. Оптимистическая блокировкаInvoice Stream Invoice[ID:542] [ID:542] [ID:542]Invoice load Invoice load InvoiceCreated 1 1 Created 1 1 Created
  32. 32. Оптимистическая блокировкаInvoice Stream Invoice[ID:542] [ID:542] [ID:542]Invoice load Invoice load InvoiceCreated 1 1 Created 1 1 Created Invoice store Invoice 2 Finalized 2 2 Finalized originalRevision = currentRevison
  33. 33. Оптимистическая блокировкаInvoice Stream Invoice[ID:542] [ID:542] [ID:542]Invoice load Invoice load InvoiceCreated 1 1 Created 1 1 Created Invoice store Invoice 2 Finalized 2 2 FinalizedInvoice storeUpdated 2 2 originalRevision != currentRevison
  34. 34. Допустимые параллельные модификации General Ledger post post Transaction Posted Transaction Posted Transaction Posted Трекать ревизию аггрегата недостаточно 
  35. 35. Высокая производительность
  36. 36. Минимальное количество операций записиAggregate Stream Commit C1 pack serialize E1 E1 E1
  37. 37. Минимальное количество операций записиAggregate Stream Commit C1 pack serialize E1 E1 E1 Commit C2 E2 E2 E2 pack serialize E3 E3 E3
  38. 38. Гибкие возможности сериализации • JSON • Binary • Custom (ProtoBuf, .NET, whatever) • GZip • Криптование
  39. 39. Оптимизация операции восстановления состояния при помощи «снимков» E1 Аггрегат с очень E2 длинным жизненным … циклом и кучей restore ивентов E100500 Snapshot [rev: E100500] replay the rest of events E100501
  40. 40. Распределенная транзакцияCommand Queue С1 С2 .. Сn dequeue (C1) MSDTC Command Processor store (E1, E2) Event Store
  41. 41. Без 2PCCommand Queue С1 С2 .. Сn 0. peek (C1) 2. remove (C1) T2 Command Processor 1. store (E1, E2) T1 Event Store
  42. 42. Без 2PC необходимаподдержка идемпотентности Command Queue С1 С2 .. Сn 0. peek (C1) 4. remove (С1) Command Processor Commit1. store (С1, [E1, E2]) 2. dup (С1) E1 E2 Event Store
  43. 43. Без 2PC необходимаподдержка идемпотентности Command Queue С1 С2 .. Сn 0. peek (C1) 4. remove (С1) Command Processor Commit ID : UUID1. store (С1, [E1, E2]) 2. dup (С1) E1 E2 Event Store
  44. 44. Без 2PC необходимаподдержка идемпотентности Command Queue С1 С2 .. Сn 0. peek (C1) 4. remove (С1) Command ID : UUID Command Processor Commit ID : UUID1. store (С1, [E1, E2]) 2. dup (С1) E1 E2 Event Store
  45. 45. Обработка событий publish update E1 E2Event Store View Model 2PC, опять?
  46. 46. Обработка событий (PULL) Get new events since (Time)Event Store View Model Запоминать последнее обработанное событие
  47. 47. Обработка событий (PULL) Get new events since (Time)Event Store View Model Commit ID : UUID E1 E2
  48. 48. Обработка событий (PULL) Get new events since (Time)Event Store View Model Commit ID : UUID Dispatched : bool E1 E2
  49. 49. Обработка событий (PULL) Get undispatched eventsEvent Store View Model Commit ID : UUID Dispatched : bool mark as dispatched E1 E2
  50. 50. Обработка событий (PUSH) publish (commit)Event Store View Model Commit ID : UUID Идемпотентность во Dispatched : bool View Model хранилище mark as по-прежнему нужна  dispatched E1 E2
  51. 51. Встроенный диспетчер событий BUS cmd events Command EventYour App Processor Publisher events commit OKEvent Store commit DispatcherStorage commit mark as dispatched
  52. 52. Встроенный диспетчер событий BUS cmd events Command EventYour App Processor Publisher events commit FAILEvent Store commit DispatcherStorage commit dispatched = false
  53. 53. Архитектура
  54. 54. Event Stream Commit Commit Event MessageDispatcher Event Store Persistence Engine Storage
  55. 55. Поддерживаемые технологии хранилища данныхRelational Databases: Embedded Relational Databases:• SQL Server 2005 (or later) • SQL Server CE 3.5 (or later)• MySQL • SQLite 3.0 (or later)• Firebird • MS Access 2000 (or later)• Oracle (planned)Cloud-based Databases: Document Databases• MS SQL Azure • RavenDB r322 (or later)• Amazon RDS (MySQL) • MongoDB 1.6 (or later)• Azure Tables/Blobs (in progress) • CouchDB 1.0 (planned)• Amazon SimpleDB/S3 (in progress)
  56. 56. Расширяемость
  57. 57. Метаданые Commit Dictionary<string, object> Office, User, PrecedingMessageIdEvent Message Dictionary<string, object> EventId, AggregateType
  58. 58. Хуки Event StoreМесто для “врезки” вконвейер обработки Hook into: • select • pre-commit Commit • post-commit Persistence Engine
  59. 59. Хуки
  60. 60. Диспатчер – это встроенный хук
  61. 61. Механизмы эволюции схемы событий
  62. 62. 2 подхода• Толерантный сериализатор• Явное версионирование
  63. 63. Свалка аппликаторов в бизнес-аггрегате
  64. 64. Преемственность версий InvoiceCreated convert to InvoiceCreated_v2 convert to InvoiceCreated_v3
  65. 65. Хук-конвертер в Event Store
  66. 66. Проект CommonDomain
  67. 67. Базовый класс для Аггрегатов
  68. 68. Репозиторий - DAO для Аггрегатов
  69. 69. Обработка конфликтов параллельного доступа
  70. 70. Допустимые параллельные модификации General Ledger post post Transaction Posted Transaction Posted Transaction Posted
  71. 71. Легко создавать специализированные политикиопределения конфликтов параллельных изменений
  72. 72. Ссылочки:• http://cqrs.wordpress.com• https://github.com/joliver/EventStore• https://github.com/joliver/CommonDomain

×