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

2,788

Published on

Published in: Technology
3 Comments
1 Like
Statistics
Notes
No Downloads
Views
Total Views
2,788
On Slideshare
0
From Embeds
0
Number of Embeds
8
Actions
Shares
0
Downloads
15
Comments
3
Likes
1
Embeds 0
No embeds

No notes for slide
  • Так зачем же нам нужна, специальная библиотека, для такой, простой операции как :
  • Использование оптимистической блокировки при помощи StreamRevision
  • Использование оптимистической блокировки при помощи StreamRevision
  • originalRevision = currentRevison
  • originalRevision != currentRevision
  • Гибкие возможности сериализации: JSON, BSON, Gzip, криптованиеДекораторы
  • Начинает культивироваться мнение что длинные агрегаты и необходимость снапшотов вообще, это ошибка дизайна
  • Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  • Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  • Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  • Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  • Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  • Идемпотентность во View Model хранилище все еще нужна 
  • Sync or Async
  • При следующем запускевсе андиспатчедкоммиты будут повторно задиспатчены
  • File System[Planned] .NET Managed System.IO APIs Dynamo Clones[Planned] Cassandra[Planned] RiakKV Stores / NoSQL[Planned] Redis[Planned] Memcached (Membase, Gear6, etc.)[Planned] HBase
  • Хранение метаданных в заголовках
  • ВерсионированиеАвтоматический апгрейд (конвертация)
  • ВерсионированиеАвтоматический апгрейд (конвертация)
  • Применение в контексте DDD\\CQRS архитектур
  • Слияние событий
  • Слияние событий
  • 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
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×