SlideShare a Scribd company logo
1 of 75
CQRS
with
JOliver Event Storev3
Об авторе
• 22 countries
• 20 banks integrations
• 80,000 financial administrations
• 50,000 users
• 51% of Dutch market
• Own data center
• 3500 concurrent users
• > 100 TPS
Дорога к CQRS
GUI
Database
access
Business
logicGUI
Database access
Business logic
GUI
GUI
Database access
GUI
Database access
Business logic
GUI
GUI Database
accessBusiness logic
GUI
Business
logic
Business logicGUI
Database access
GUI
Business
logic
Data
access
M$$SQL
GUI
Domain Model
ORM
Database
M$$SQL
GUI
Domain Model
ORM
Database
Lazy Loading !!!
OUCH!
M$$SQL
GUI
Domain Model
ORM
Database
DTO
M$$SQL
GUI
Domain Model
ORM
Database
DTO
Object-To-Object Mapping !!!
OUCH!
RDB
ORM
Отчеты
Domain
8-ми этажный SQL
А ручки то, на что?
RDB
Ручками
Отчеты
N этажный SQL
(правда, почище и побыстрее, чем с ORM)
SQL красиво упрятан за
фасадом хранимых
процедур 
RDB
DTO
Handcrafted SQL
ORM
Application
Services
Domain
Object
Domain
Object
Reporting
Services
3NF with optimizations
like 1NF in some places 
DTO DTO DTO
Form UI Reports UI
send
request
RDB
DTO
Handcrafted SQL
ORM
Application
Services
Domain
Object
Reporting
Services
DTO DTO DTO
Form UI Reports UI
Здесь
жирненько
И что дальше?
Data Storage
Command
Application
Services
Domain
Object
Query
Services
Client
Domain
Object
Query
Data Storage
DTO DTO
CQRS (did you mean “Cars”?)
Domain Model View Model
Как синхронизировать ?
ORMDomain Changeset Denormalizer
View Model
Потеря «сути» изменений
Непрозрачный сгусток
данных 
CQRS
+
Event Sourcing
=
LOVE!
ORMDomain
Storage
Текущее состояние
Традиционный подход
Domain Invoice
Created
Invoice
Approved
Invoice
Finalized
Журнал всех изменений
Event Sourcing
Традиционный подход
Event Sourcing
SRP на уровне метода !
Принятие решения о
возможности перехода
состояния
(бизнес-правила)
Переход состояния
(транзитор)
Собственно,
изменение состояния
(аппликатор)
И как это работает?
Ну и как это всё работает?
Восстановление текущего состояния
Invoice
Created
Invoice
Approved
Invoice
Finalized
Журнал изменений
1
2
3
Сохранение изменений
Invoice
Approved
Invoice
Finalized
Буфер
Сохранение изменений
Invoice
Approved
Invoice
Finalized
Буфер
Invoice
Created
Журнал изменений
1
append
2
Invoice
Approved
Invoice
Finalized3
Log.append(id, events)
events = Log.read(id)
Тривиально,
неправда ли?
Обеспечение параллельного доступа
Параллельные модификации
Invoice
Created
Invoice
Updated
Invoice
Finalized
update
Invoice
finalize
Оптимистическая блокировка
Invoice
Created
Stream
[ID:542]
1
Invoice
Created
Invoice
[ID:542]
1
load Invoice
Created
Invoice
[ID:542]
1
load
1
Оптимистическая блокировка
Invoice
Created
Stream
[ID:542]
1
2
Invoice
Finalized
load Invoice
Created
Invoice
[ID:542]
1
2 Invoice
Finalized
load
store
1
2
originalRevision = currentRevison
Invoice
Created
Invoice
[ID:542]
1
Оптимистическая блокировка
Invoice
Created
Stream
[ID:542]
1
2
Invoice
Finalized
22
Invoice
Updated
load
store
Invoice
Created
Invoice
[ID:542]
1
2 Invoice
Finalized
load
store
1
2
Invoice
Created
Invoice
[ID:542]
1
originalRevision != currentRevison
Допустимые параллельные модификации
Transaction
Posted
Transaction
Posted
Transaction
Posted
post
General Ledger
post
Трекать ревизию
аггрегата недостаточно

Высокая производительность
Минимальное количество
операций записи
E1
Aggregate Stream
Commit
E1 E1
pack
C1
serialize
Минимальное количество
операций записи
Commit
E1
Aggregate
E2
E3
E2
E3
Stream
C2
E2
E3
Commit
E1 E1
pack
pack
C1
serialize
serialize
Гибкие возможности сериализации
• JSON
• Binary
• Custom (ProtoBuf, .NET, whatever)
• GZip
• Криптование
Оптимизация операции восстановления
состояния при помощи «снимков»
Аггрегат с очень
длинным
жизненным
циклом и кучей
ивентов
E1
E2
…
E100500
Snapshot
[rev: E100500]
E100501
restore
replay the rest
of events
Распределенная транзакция
С1 С2 .. Сn
Command Queue
Command Processor
Event Store
dequeue (C1)
store (E1, E2)
MSDTC
Без 2PC
С1 С2 .. Сn
Command Queue
Command Processor
Event Store
0. peek (C1)
1. store (E1, E2)
2. remove (C1) T2
T1
Без 2PC необходима
поддержка идемпотентности
С1 С2 .. Сn
Command Queue
Command Processor
Event Store
0. peek (C1)
1. store (С1, [E1, E2]) 2. dup (С1)
4. remove (С1)
Commit
E1
E2
Без 2PC необходима
поддержка идемпотентности
С1 С2 .. Сn
Command Queue
Command Processor
Event Store
0. peek (C1)
1. store (С1, [E1, E2]) 2. dup (С1)
4. remove (С1)
Commit
E1
E2
ID : UUID
Без 2PC необходима
поддержка идемпотентности
С1 С2 .. Сn
Command Queue
Command Processor
Event Store
0. peek (C1)
1. store (С1, [E1, E2]) 2. dup (С1)
4. remove (С1)
Commit
E1
E2
ID : UUID
Command
ID : UUID
Обработка событий
Event Store View Model
E1 E2
publish update
2PC, опять?
Обработка событий (PULL)
Event Store View Model
Get new events since (Time)
Запоминать последнее
обработанное событие
Обработка событий (PULL)
Event Store View Model
Get new events since (Time)
Commit
E1
E2
ID : UUID
Обработка событий (PULL)
Event Store View Model
Get new events since (Time)
Commit
E1
E2
ID : UUID
Dispatched : bool
Обработка событий (PULL)
Event Store View Model
Get undispatched events
Commit
E1
E2
ID : UUID
Dispatched : bool
mark as
dispatched
Обработка событий (PUSH)
Event Store View Model
publish (commit)
Commit
E1
E2
ID : UUID
Dispatched : bool
Идемпотентность во
View Model хранилище
по-прежнему нужна 
mark as
dispatched
Встроенный диспетчер событий
BUS
Command
Processor
Event Store
cmd
events
commit Dispatcher
Event
Publisher
commit
events
Storage
Your App
commit
mark as dispatched
OK
Встроенный диспетчер событий
BUS
Command
Processor
Event Store
cmd
events
commit Dispatcher
Event
Publisher
commit
events
Storage
Your App
commit dispatched = false
FAIL
Архитектура
Commit
Event Store
Persistence Engine
Event Stream Commit
Event Message
Dispatcher
Storage
Поддерживаемые технологии
хранилища данных
Relational Databases:
• SQL Server 2005 (or later)
• MySQL
• Firebird
• Oracle (planned)
Embedded Relational Databases:
• SQL Server CE 3.5 (or later)
• SQLite 3.0 (or later)
• MS Access 2000 (or later)
Cloud-based Databases:
• MS SQL Azure
• Amazon RDS (MySQL)
• Azure Tables/Blobs (in progress)
• Amazon SimpleDB/S3 (in progress)
Document Databases
• RavenDB r322 (or later)
• MongoDB 1.6 (or later)
• CouchDB 1.0 (planned)
Расширяемость
Метаданые
Commit
Event Message
Dictionary<string, object>
Dictionary<string, object>
Office, User, PrecedingMessageId
EventId, AggregateType
Хуки
Event Store
Persistence Engine
Commit
Место для “врезки” в
конвейер обработки
Hook into:
• select
• pre-commit
• post-commit
Хуки
Диспатчер – это встроенный хук
Механизмы эволюции
схемы событий
2 подхода
• Толерантный сериализатор
• Явное версионирование
Свалка аппликаторов в бизнес-аггрегате
Преемственность версий
InvoiceCreated
InvoiceCreated_v2
InvoiceCreated_v3
convert to
convert to
Хук-конвертер в Event Store
Проект CommonDomain
Базовый класс для Аггрегатов
Репозиторий - DAO для Аггрегатов
Обработка конфликтов параллельного доступа
Допустимые параллельные модификации
Transaction
Posted
Transaction
Posted
Transaction
Posted
post
General Ledger
post
Легко создавать специализированные политики
определения конфликтов параллельных изменений
Ссылочки:
• http://cqrs.wordpress.com
• https://github.com/joliver/EventStore
• https://github.com/joliver/CommonDomain
CQRS with JOliver EventStore v3

More Related Content

Similar to CQRS with JOliver EventStore v3

Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Oleksii Okhrymenko
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETDev2Dev
 
Модульная структура
Модульная структураМодульная структура
Модульная структураDenis Tsvettsih
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаMikhail Shcherbakov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаYandex
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Некриптографическое исследование носителей православной криптографии
Некриптографическое исследование носителей  православной криптографииНекриптографическое исследование носителей  православной криптографии
Некриптографическое исследование носителей православной криптографииSergey Soldatov
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6Technopark
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2Eugeniy Tyumentcev
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2etyumentcev
 
Основы OLAP. Вебинар Workaround в Softengi
Основы OLAP. Вебинар Workaround в SoftengiОсновы OLAP. Вебинар Workaround в Softengi
Основы OLAP. Вебинар Workaround в SoftengiSoftengi
 

Similar to CQRS with JOliver EventStore v3 (20)

Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2Превышаем скоросные лимиты с Angular 2
Превышаем скоросные лимиты с Angular 2
 
Модульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NETМодульная структура. Цветцих Денис D2D Just.NET
Модульная структура. Цветцих Денис D2D Just.NET
 
Модульная структура
Модульная структураМодульная структура
Модульная структура
 
WinCC OA
WinCC OAWinCC OA
WinCC OA
 
WinDbg в руках .NET разработчика
WinDbg в руках .NET разработчикаWinDbg в руках .NET разработчика
WinDbg в руках .NET разработчика
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Поговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложенийПоговорим о микрооптимизациях .NET-приложений
Поговорим о микрооптимизациях .NET-приложений
 
CQRS EventStore
CQRS EventStoreCQRS EventStore
CQRS EventStore
 
UA Mobile 2012
UA Mobile 2012UA Mobile 2012
UA Mobile 2012
 
Алексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кодаАлексей Андросов - Debugger: Отладка кода
Алексей Андросов - Debugger: Отладка кода
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
DevOps для 1С
DevOps для 1СDevOps для 1С
DevOps для 1С
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
Некриптографическое исследование носителей православной криптографии
Некриптографическое исследование носителей  православной криптографииНекриптографическое исследование носителей  православной криптографии
Некриптографическое исследование носителей православной криптографии
 
Java осень 2013 лекция 6
Java осень 2013 лекция 6Java осень 2013 лекция 6
Java осень 2013 лекция 6
 
Erlang
ErlangErlang
Erlang
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2разработка серверов и серверных приложений лекция №2
разработка серверов и серверных приложений лекция №2
 
Основы OLAP. Вебинар Workaround в Softengi
Основы OLAP. Вебинар Workaround в SoftengiОсновы OLAP. Вебинар Workaround в Softengi
Основы OLAP. Вебинар Workaround в Softengi
 
п10
п10п10
п10
 

CQRS with JOliver EventStore v3

Editor's Notes

  1. Так зачем же нам нужна, специальная библиотека, для такой, простой операции как :
  2. Использование оптимистической блокировки при помощи StreamRevision
  3. Использование оптимистической блокировки при помощи StreamRevision
  4. originalRevision = currentRevison
  5. originalRevision != currentRevision
  6. Гибкие возможности сериализации: JSON, BSON, Gzip, криптование Декораторы
  7. Начинает культивироваться мнение что длинные агрегаты и необходимость снапшотов вообще, это ошибка дизайна
  8. Защита от повторного выполнения команд в рамках «at least once delivery» инфраструктуры
  9. Защита от повторного выполнения команд в рамках «at least once delivery» инфраструктуры
  10. Защита от повторного выполнения команд в рамках «at least once delivery» инфраструктуры
  11. Защита от повторного выполнения команд в рамках «at least once delivery» инфраструктуры
  12. Защита от повторного выполнения команд в рамках «at least once delivery» инфраструктуры
  13. Идемпотентность во View Model хранилище все еще нужна 
  14. Sync or Async
  15. При следующем запуске все андиспатчед коммиты будут повторно задиспатчены
  16. File System [Planned] .NET Managed System.IO APIs Dynamo Clones [Planned] Cassandra [Planned] Riak KV Stores / NoSQL [Planned] Redis [Planned] Memcached (Membase, Gear6, etc.) [Planned] HBase
  17. Хранение метаданных в заголовках
  18. Версионирование Автоматический апгрейд (конвертация)
  19. Версионирование Автоматический апгрейд (конвертация)
  20. Применение в контексте DDD\CQRS архитектур
  21. Слияние событий
  22. Слияние событий