CQRS EventStore

3,294 views
3,215 views

Published on

Published in: Technology
3 Comments
1 Like
Statistics
Notes
No Downloads
Views
Total views
3,294
On SlideShare
0
From Embeds
0
Number of Embeds
1,580
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

    ×