SlideShare une entreprise Scribd logo
1  sur  72
CQRS
       with
                      v3
JOliver Event Store
Дорога к CQRS
Database            GUI
  GUI access
  Business
  Database access             GUI



  GUI
      logic logic
               Business
                  GUI

     Database access
 Business logic
                  GUI
Database access
            Business logic
 GUI        DatabaseGUI
Business logic access
   GUI    Business logic
   Database access
GUI

Business
  logic

  Data
 access
GUI




Domain Model




ORM




Database       M$$SQL
GUI




Domain Model            Lazy Loading !!!
                            OUCH!




ORM




Database       M$$SQL
GUI


               DTO

Domain Model




ORM




Database       M$$SQL
GUI


               DTO

Domain Model            Object-To-Object Mapping !!!
                                  OUCH!




ORM




Database       M$$SQL
Отчеты




                         Domain


          ORM




8-ми этажный SQL




                   RDB
А ручки то, на что?
Отчеты




                      Ручками



                                                SQL красиво упрятан за
                                                  фасадом хранимых
                                                     процедур 
          N этажный SQL
(правда, почище и побыстрее, чем с ORM)




                                          RDB
Form UI               Reports UI

                                                                      send


                                                                      request


                            DTO         DTO         DTO       DTO

                              Application              Reporting
                               Services                 Services

                            Domain   Domain
                            Object   Object
                                                    Handcrafted SQL
                                  ORM

  3NF with optimizations
like 1NF in some places 

                                              RDB
Form UI             Reports UI




DTO       DTO          DTO     DTO

  Application           Reporting
   Services              Services
                                       Здесь
                                     жирненько
Domain
Object
                Handcrafted SQL
ORM




                 RDB
И что дальше?
CQRS (did you mean “Cars”?)
                     Client




   Command                        Query



  Application                      Query
   Services                       Services

Domain      Domain
                               DTO         DTO
Object      Object




   Data Storage                  Data Storage
Как синхронизировать ?



Domain Model     View Model
Потеря «сути» изменений


Domain      ORM     Changeset               Denormalizer


                                               View Model




                                Непрозрачный сгусток
                                     данных 
CQRS
       +
Event Sourcing
       =
   LOVE!
Традиционный подход


                             Текущее состояние



Domain    ORM


                   Storage
Event Sourcing
                              Журнал всех изменений




Domain            Invoice
                  Created

                   Invoice
                  Approved

                   Invoice
                  Finalized
Традиционный подход
Event Sourcing
SRP на уровне метода !



 Принятие решения о
возможности перехода
     состояния
    (бизнес-правила)




 Переход состояния
      (транзитор)




Собственно, изменен
   ие состояния
     (аппликатор)
И как это работает?




Ну и как это всж работает?
Восстановление текущего состояния


Журнал изменений

      Invoice
1     Created

      Invoice
2    Approved

      Invoice
3    Finalized
Сохранение изменений

                       Буфер



                        Invoice
                       Approved




                        Invoice
                       Finalized
Сохранение изменений

Буфер                 Журнал изменений

 Invoice                   Invoice
                      1    Created
Approved
             append
 Invoice                   Invoice
Finalized
                      2   Approved

                            Invoice
                      3    Finalized
Тривиально,
неправда ли?
Log.append(id, events)
events = Log.read(id)
Обеспечение параллельного доступа
Параллельные модификации


           Invoice

  update               finalize
           Invoice
           Created




            Invoice
           Finalized

           Invoice
           Updated
Оптимистическая блокировка



Invoice                    Stream                    Invoice
[ID:542]                   [ID:542]                  [ID:542]

Invoice         load       Invoice        load       Invoice
Created     1          1   Created    1          1   Created
Оптимистическая блокировка



Invoice                      Stream                      Invoice
[ID:542]                      [ID:542]                    [ID:542]

Invoice           load        Invoice        load        Invoice
Created     1            1    Created    1           1   Created



                              Invoice        store        Invoice
                         2   Finalized   2           2   Finalized




                originalRevision = currentRevison
Оптимистическая блокировка



Invoice                       Stream                      Invoice
[ID:542]                       [ID:542]                    [ID:542]

Invoice           load        Invoice         load        Invoice
Created     1             1   Created     1           1   Created



                               Invoice        store        Invoice
                          2   Finalized   2           2   Finalized




Invoice           store
Updated     2             2


                originalRevision != currentRevison
Допустимые параллельные модификации


               General Ledger

        post                    post
                 Transaction
                   Posted




                 Transaction
                   Posted

                 Transaction
                   Posted


                                          Трекать ревизию
                                       аггрегата недостаточно
                                                  
Высокая производительность
Минимальное количество
           операций записи

Aggregate                               Stream
                   Commit
                                          C1
            pack            serialize
   E1                E1                   E1
Минимальное количество
           операций записи

Aggregate                               Stream
                   Commit
                                          C1
            pack            serialize
   E1                E1                   E1




                   Commit
                                          C2
   E2                E2                   E2
            pack            serialize

   E3                E3                   E3
Гибкие возможности сериализации

     • JSON
     • Binary
     • Custom (ProtoBuf, .NET, whatever)

     • GZip
     • Криптование
Оптимизация операции восстановления
  состояния при помощи «снимков»

                                                 E1

 Аггрегат с очень
                                                 E2
    длинным
   жизненным                                     …
 циклом и кучей
                                  restore
     ивентов                                 E100500


                                            Snapshot
                                            [rev: E100500]
                    replay the rest
                       of events
                                              E100501
Распределенная транзакция

Command Queue
  С1      С2         ..            Сn



                  dequeue (C1)



                                        MSDTC
       Command Processor


                  store (E1, E2)




           Event Store
Без 2PC

Command Queue
 С1         С2             ..         Сn



  0. peek (C1)             2. remove (C1)    T2


       Command Processor


                         1. store (E1, E2)
                                             T1

                 Event Store
Без 2PC необходима
поддержка идемпотентности

 Command Queue
     С1          С2          ..        Сn



        0. peek (C1)        4. remove (С1)



            Command Processor

                                             Commit

1. store (С1, [E1, E2])      2. dup (С1)
                                               E1


                                               E2
                   Event Store
Без 2PC необходима
поддержка идемпотентности

 Command Queue
     С1          С2          ..        Сn



        0. peek (C1)        4. remove (С1)



            Command Processor                 Commit

                                             ID : UUID
1. store (С1, [E1, E2])      2. dup (С1)
                                                E1


                                                E2
                   Event Store
Без 2PC необходима
поддержка идемпотентности

 Command Queue
     С1          С2          ..        Сn



        0. peek (C1)        4. remove (С1)   Command

                                             ID : UUID

            Command Processor                 Commit

                                             ID : UUID
1. store (С1, [E1, E2])      2. dup (С1)
                                                E1


                                                E2
                   Event Store
Обработка событий




              publish              update
                         E1   E2
Event Store                                 View Model




                        2PC, опять?
Обработка событий (PULL)




              Get new events since (Time)
Event Store                                      View Model




                                            Запоминать последнее
                                            обработанное событие
Обработка событий (PULL)




              Get new events since (Time)
Event Store                                 View Model




                           Commit

                          ID : UUID

                             E1


                             E2
Обработка событий (PULL)




              Get new events since (Time)
Event Store                                 View Model




                           Commit

                          ID : UUID
                      Dispatched : bool


                             E1


                             E2
Обработка событий (PULL)




              Get undispatched events
Event Store                                     View Model




                         Commit

                        ID : UUID
                     Dispatched : bool
                                          mark as
                                         dispatched
                            E1


                            E2
Обработка событий (PUSH)




                      publish (commit)
Event Store                                  View Model




                          Commit

                         ID : UUID
                                           Идемпотентность во
                      Dispatched : bool
                                          View Model хранилище
          mark as                         по-прежнему нужна 
         dispatched
                             E1


                             E2
Встроенный диспетчер событий

                              BUS

                cmd                                events


                  Command                 Event
Your App          Processor              Publisher


              events                      commit            OK




Event Store        commit               Dispatcher




Storage
                   commit
                              mark as dispatched
Встроенный диспетчер событий

                                   BUS

                cmd                                     events


                  Command                      Event
Your App          Processor                   Publisher


              events                           commit            FAIL




Event Store        commit                    Dispatcher




Storage
                   commit     dispatched = false
Архитектура
Event Stream         Commit


                                      Commit
                                  Event Message
Dispatcher      Event Store




             Persistence Engine




                   Storage
Поддерживаемые технологии
                        хранилища данных

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)
Расширяемость
Метаданые



  Commit            Dictionary<string, object>

                 Office, User, PrecedingMessageId




Event Message       Dictionary<string, object>

                        EventId, AggregateType
Хуки


                          Event Store
Место для “врезки” в
конвейер обработки
                                            Hook into:
                                            • select
                                            • pre-commit
                           Commit           • post-commit




                       Persistence Engine
Хуки
Диспатчер – это встроенный хук
Механизмы эволюции
  схемы событий
2 подхода



• Толерантный сериализатор

• Явное версионирование
Свалка аппликаторов в бизнес-аггрегате
Преемственность версий



      InvoiceCreated

              convert to


     InvoiceCreated_v2


              convert to


     InvoiceCreated_v3
Хук-конвертер в Event Store
Проект CommonDomain
Базовый класс для Аггрегатов
Репозиторий - DAO для Аггрегатов
Обработка конфликтов параллельного доступа
Допустимые параллельные модификации


               General Ledger

        post                    post
                 Transaction
                   Posted




                 Transaction
                   Posted

                 Transaction
                   Posted
Легко создавать специализированные политики
определения конфликтов параллельных изменений
Ссылочки:

•   http://cqrs.wordpress.com
•   https://github.com/joliver/EventStore
•   https://github.com/joliver/CommonDomain

Contenu connexe

Similaire à CQRS EventStore

технологические сценарии Windows azure
технологические сценарии Windows azureтехнологические сценарии Windows azure
технологические сценарии Windows azureExpolink
 
«Упрощая работу администратора: Enterprise Manager - единая точка управления ...
«Упрощая работу администратора: Enterprise Manager - единая точка управления ...«Упрощая работу администратора: Enterprise Manager - единая точка управления ...
«Упрощая работу администратора: Enterprise Manager - единая точка управления ...BDA
 
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"LogeekNightUkraine
 
DB REPLICATION
DB REPLICATIONDB REPLICATION
DB REPLICATIONsoft-point
 
софтсервис бекетов вадим - Itil. две недели, которые могут изменить вашу ит...
софтсервис   бекетов вадим - Itil. две недели, которые могут изменить вашу ит...софтсервис   бекетов вадим - Itil. две недели, которые могут изменить вашу ит...
софтсервис бекетов вадим - Itil. две недели, которые могут изменить вашу ит...Expolink
 
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Magecom Ukraine
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4Bars Group
 
Управление архивом на платформе Docsvision
Управление архивом на платформе DocsvisionУправление архивом на платформе Docsvision
Управление архивом на платформе DocsvisionDocsvision
 
Windows azure общий обзор
Windows azure общий обзорWindows azure общий обзор
Windows azure общий обзорMicrosoft
 
Irkutsk 181012 cloud
Irkutsk 181012 cloudIrkutsk 181012 cloud
Irkutsk 181012 cloudMicrosoft
 
CQRS with JOliver EventStore v3
CQRS with JOliver EventStore v3CQRS with JOliver EventStore v3
CQRS with JOliver EventStore v3Yevhen Bobrov
 
Модули платформы B4
Модули платформы B4Модули платформы B4
Модули платформы B4Bars Group
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS Pavel Tsukanov
 
KAZOOMEETUP MOSCOW 2015. Андрей Корнилов. Интеграция с CRM, биллингом, сайтом
KAZOOMEETUP MOSCOW 2015. Андрей Корнилов. Интеграция с CRM, биллингом, сайтомKAZOOMEETUP MOSCOW 2015. Андрей Корнилов. Интеграция с CRM, биллингом, сайтом
KAZOOMEETUP MOSCOW 2015. Андрей Корнилов. Интеграция с CRM, биллингом, сайтомSIPLABS Communications
 
Heyworks: Архитектура клиент-серверной мобильной игры: от общего к частному
Heyworks: Архитектура клиент-серверной мобильной игры: от общего к частномуHeyworks: Архитектура клиент-серверной мобильной игры: от общего к частному
Heyworks: Архитектура клиент-серверной мобильной игры: от общего к частномуDevGAMM Conference
 
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...Ontico
 

Similaire à CQRS EventStore (20)

технологические сценарии Windows azure
технологические сценарии Windows azureтехнологические сценарии Windows azure
технологические сценарии Windows azure
 
CQRS innovations
CQRS innovationsCQRS innovations
CQRS innovations
 
«Упрощая работу администратора: Enterprise Manager - единая точка управления ...
«Упрощая работу администратора: Enterprise Manager - единая точка управления ...«Упрощая работу администратора: Enterprise Manager - единая точка управления ...
«Упрощая работу администратора: Enterprise Manager - единая точка управления ...
 
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
Andrii Gryshchenko: "An Overview of CQRS and Event Sourcing"
 
DB REPLICATION
DB REPLICATIONDB REPLICATION
DB REPLICATION
 
софтсервис бекетов вадим - Itil. две недели, которые могут изменить вашу ит...
софтсервис   бекетов вадим - Itil. две недели, которые могут изменить вашу ит...софтсервис   бекетов вадим - Itil. две недели, которые могут изменить вашу ит...
софтсервис бекетов вадим - Itil. две недели, которые могут изменить вашу ит...
 
Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP Современные платформы (фреймворки) разработки веб- приложений на PHP
Современные платформы (фреймворки) разработки веб- приложений на PHP
 
Обзор платформы B4
Обзор платформы B4Обзор платформы B4
Обзор платформы B4
 
Управление архивом на платформе Docsvision
Управление архивом на платформе DocsvisionУправление архивом на платформе Docsvision
Управление архивом на платформе Docsvision
 
6 эволюция зрелости itsm процессов в телекоммуникационных компаниях
6 эволюция зрелости itsm процессов в телекоммуникационных компаниях6 эволюция зрелости itsm процессов в телекоммуникационных компаниях
6 эволюция зрелости itsm процессов в телекоммуникационных компаниях
 
Windows azure общий обзор
Windows azure общий обзорWindows azure общий обзор
Windows azure общий обзор
 
Irkutsk 181012 cloud
Irkutsk 181012 cloudIrkutsk 181012 cloud
Irkutsk 181012 cloud
 
CQRS with JOliver EventStore v3
CQRS with JOliver EventStore v3CQRS with JOliver EventStore v3
CQRS with JOliver EventStore v3
 
WinCC OA
WinCC OAWinCC OA
WinCC OA
 
Модули платформы B4
Модули платформы B4Модули платформы B4
Модули платформы B4
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
KAZOOMEETUP MOSCOW 2015. Андрей Корнилов. Интеграция с CRM, биллингом, сайтом
KAZOOMEETUP MOSCOW 2015. Андрей Корнилов. Интеграция с CRM, биллингом, сайтомKAZOOMEETUP MOSCOW 2015. Андрей Корнилов. Интеграция с CRM, биллингом, сайтом
KAZOOMEETUP MOSCOW 2015. Андрей Корнилов. Интеграция с CRM, биллингом, сайтом
 
Heyworks: Архитектура клиент-серверной мобильной игры: от общего к частному
Heyworks: Архитектура клиент-серверной мобильной игры: от общего к частномуHeyworks: Архитектура клиент-серверной мобильной игры: от общего к частному
Heyworks: Архитектура клиент-серверной мобильной игры: от общего к частному
 
MS Swit 2012 - SQL Server 2012
MS Swit 2012 - SQL Server 2012MS Swit 2012 - SQL Server 2012
MS Swit 2012 - SQL Server 2012
 
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
Как мы данные готовили ORM и все-все-все в приложении Почта Mail.Ru / Кирилл ...
 

Plus de Kiev ALT.NET

Micro-ORM Introduction - Don't overcomplicate
Micro-ORM Introduction - Don't overcomplicateMicro-ORM Introduction - Don't overcomplicate
Micro-ORM Introduction - Don't overcomplicateKiev ALT.NET
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive ExtensionsKiev ALT.NET
 
Continuous Integration (CI)
Continuous Integration (CI)Continuous Integration (CI)
Continuous Integration (CI)Kiev ALT.NET
 
WebSharper - веб-программирование без слёз
WebSharper - веб-программирование без слёзWebSharper - веб-программирование без слёз
WebSharper - веб-программирование без слёзKiev ALT.NET
 
F# - функциональный язык «новой» волны
F# - функциональный  язык «новой» волныF# - функциональный  язык «новой» волны
F# - функциональный язык «новой» волныKiev ALT.NET
 
Caliburn Micro Overview
Caliburn Micro OverviewCaliburn Micro Overview
Caliburn Micro OverviewKiev ALT.NET
 
Введение в MVVM
Введение в MVVMВведение в MVVM
Введение в MVVMKiev ALT.NET
 
Command-Query Responsibility Segregation: теория и практика
Command-Query Responsibility Segregation: теория и практикаCommand-Query Responsibility Segregation: теория и практика
Command-Query Responsibility Segregation: теория и практикаKiev ALT.NET
 

Plus de Kiev ALT.NET (15)

Micro-ORM Introduction - Don't overcomplicate
Micro-ORM Introduction - Don't overcomplicateMicro-ORM Introduction - Don't overcomplicate
Micro-ORM Introduction - Don't overcomplicate
 
Async
AsyncAsync
Async
 
Linq providers
Linq providersLinq providers
Linq providers
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
NoSql, MongoDb
NoSql, MongoDbNoSql, MongoDb
NoSql, MongoDb
 
CouchDb
CouchDbCouchDb
CouchDb
 
Orchard
OrchardOrchard
Orchard
 
Mercurial
MercurialMercurial
Mercurial
 
CI via TFS
CI via TFSCI via TFS
CI via TFS
 
Continuous Integration (CI)
Continuous Integration (CI)Continuous Integration (CI)
Continuous Integration (CI)
 
WebSharper - веб-программирование без слёз
WebSharper - веб-программирование без слёзWebSharper - веб-программирование без слёз
WebSharper - веб-программирование без слёз
 
F# - функциональный язык «новой» волны
F# - функциональный  язык «новой» волныF# - функциональный  язык «новой» волны
F# - функциональный язык «новой» волны
 
Caliburn Micro Overview
Caliburn Micro OverviewCaliburn Micro Overview
Caliburn Micro Overview
 
Введение в MVVM
Введение в MVVMВведение в MVVM
Введение в MVVM
 
Command-Query Responsibility Segregation: теория и практика
Command-Query Responsibility Segregation: теория и практикаCommand-Query Responsibility Segregation: теория и практика
Command-Query Responsibility Segregation: теория и практика
 

CQRS EventStore

Notes de l'éditeur

  1. Так зачем же нам нужна, специальная библиотека, для такой, простой операции как :
  2. Использование оптимистической блокировки при помощи StreamRevision
  3. Использование оптимистической блокировки при помощи StreamRevision
  4. originalRevision = currentRevison
  5. originalRevision != currentRevision
  6. Гибкие возможности сериализации: JSON, BSON, Gzip, криптованиеДекораторы
  7. Начинает культивироваться мнение что длинные агрегаты и необходимость снапшотов вообще, это ошибка дизайна
  8. Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  9. Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  10. Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  11. Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  12. Защита от повторноговыполнения командв рамках «at least oncedelivery» инфраструктуры
  13. Идемпотентность во View Model хранилище все еще нужна 
  14. Sync or Async
  15. При следующем запускевсе андиспатчедкоммиты будут повторно задиспатчены
  16. 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
  17. Хранение метаданных в заголовках
  18. ВерсионированиеАвтоматический апгрейд (конвертация)
  19. ВерсионированиеАвтоматический апгрейд (конвертация)
  20. Применение в контексте DDD\\CQRS архитектур
  21. Слияние событий
  22. Слияние событий