cqrs eventstore

72
CQRS with JOliver Event Store v3

Upload: kiev-altnet

Post on 22-Jun-2015

2.755 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: CQRS EventStore

CQRS with

JOliver Event Store

v3

Page 2: CQRS EventStore

Дорога к CQRS

Page 3: CQRS EventStore

GUIDatabase

accessBusiness

logicGUI

Database accessBusiness

logic

GUI

GUI

Database access

GUIDatabase accessBusiness

logic

GUI

GUI Database access

Business logic

GUI

Business logic

Business logicGUIDatabase access

Page 4: CQRS EventStore

GUI

Business logic

Data access

Page 5: CQRS EventStore

M$$SQL

GUI

Domain Model

ORM

Database

Page 6: CQRS EventStore

M$$SQL

GUI

Domain Model

ORM

Database

Lazy Loading !!! OUCH!

Page 7: CQRS EventStore

M$$SQL

GUI

Domain Model

ORM

Database

DTO

Page 8: CQRS EventStore

M$$SQL

GUI

Domain Model

ORM

Database

DTO

Object-To-Object Mapping !!!

OUCH!

Page 9: CQRS EventStore

RDB

ORM

Отчеты

Domain

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

Page 10: CQRS EventStore

А ручки то, на что?

Page 11: CQRS EventStore

RDB

Ручками

Отчеты

N этажный SQL(правда, почище и побыстрее, чем с ORM)

SQL красиво упрятан за фасадом

хранимых процедур

Page 12: CQRS EventStore

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

Page 13: CQRS EventStore

RDB

DTO

Handcrafted SQLORM

Application Services

Domain Object

Reporting Services

DTO DTO DTO

Form UI Reports UI

Здесьжирненько

Page 14: CQRS EventStore

И что дальше?

Page 15: CQRS EventStore

Data Storage

Command

Application Services

Domain Object

Query Services

Client

Domain Object

Query

Data Storage

DTO DTO

CQRS (did you mean “Cars”?)

Page 16: CQRS EventStore

Domain Model View Model

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

Page 17: CQRS EventStore

ORMDomain Changeset Denormalizer

View Model

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

Непрозрачный сгусток данных

Page 18: CQRS EventStore

CQRS+

Event Sourcing =

LOVE!

Page 19: CQRS EventStore

ORMDomain

Storage

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

Традиционный подход

Page 20: CQRS EventStore

Domain InvoiceCreated

InvoiceApproved

Invoice Finalized

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

Event Sourcing

Page 21: CQRS EventStore

Традиционный подход

Page 22: CQRS EventStore

Event Sourcing

Page 23: CQRS EventStore

SRP на уровне метода !

Принятие решения о возможности

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

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

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

Page 24: CQRS EventStore

И как это работает?

Ну и как это всё работает?

Page 25: CQRS EventStore

Восстановление текущего состояния

InvoiceCreated

InvoiceApproved

Invoice Finalized

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

1

2

3

Page 26: CQRS EventStore

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

InvoiceApproved

Invoice Finalized

Буфер

Page 27: CQRS EventStore

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

InvoiceApproved

Invoice Finalized

Буфер

InvoiceCreated

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

1append

2Invoice

Approved

Invoice Finalized3

Page 28: CQRS EventStore

Log.append(id, events)

events = Log.read(id)

Тривиально, неправда ли?

Page 29: CQRS EventStore

Обеспечение параллельного доступа

Page 30: CQRS EventStore

Параллельные модификации

InvoiceCreated

InvoiceUpdated

Invoice Finalized

update

Invoice

finalize

Page 31: CQRS EventStore

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

InvoiceCreated

Stream [ID:542]

1InvoiceCreated

Invoice[ID:542]

1load Invoice

Created

Invoice[ID:542]

1load

1

Page 32: CQRS EventStore

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

InvoiceCreated

Stream [ID:542]

1

2 InvoiceFinalized

load InvoiceCreated

Invoice[ID:542]

1

2 InvoiceFinalized

load

store

1

2

originalRevision = currentRevison

InvoiceCreated

Invoice[ID:542]

1

Page 33: CQRS EventStore

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

InvoiceCreated

Stream [ID:542]

1

2 InvoiceFinalized

22InvoiceUpdated

load

store

InvoiceCreated

Invoice[ID:542]

1

2 InvoiceFinalized

load

store

1

2

InvoiceCreated

Invoice[ID:542]

1

originalRevision != currentRevison

Page 34: CQRS EventStore

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

Transaction Posted

Transaction Posted

Transaction Posted

post

General Ledger

post

Трекать ревизию аггрегата

недостаточно

Page 35: CQRS EventStore

Высокая производительность

Page 36: CQRS EventStore

Минимальное количество операций записи

E1

Aggregate StreamCommit

E1 E1pack

C1serialize

Page 37: CQRS EventStore

Минимальное количество операций записи

Commit

E1

Aggregate

E2

E3

E2

E3

Stream

C2

E2

E3

Commit

E1 E1pack

pack

C1serialize

serialize

Page 38: CQRS EventStore

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

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

• GZip• Криптование

Page 39: CQRS EventStore

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

Аггрегат с очень

длинным жизненным

циклом и кучей ивентов

E1

E2

E100500

Snapshot[rev: E100500]

E100501

restore

replay the restof events

Page 40: CQRS EventStore

Распределенная транзакция

С1 С2 .. Сn

Command Queue

Command Processor

Event Store

dequeue (C1)

store (E1, E2)

MSDTC

Page 41: CQRS EventStore

Без 2PC

С1 С2 .. Сn

Command Queue

Command Processor

Event Store

0. peek (C1)

1. store (E1, E2)

2. remove (C1) T2

T1

Page 42: CQRS EventStore

Без 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

Page 43: CQRS EventStore

Без 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

Page 44: CQRS EventStore

Без 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

Page 45: CQRS EventStore

Обработка событий

Event Store

View Model

E1 E2publish update

2PC, опять?

Page 46: CQRS EventStore

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

Event Store

View Model

Get new events since (Time)

Запоминать последнее

обработанное событие

Page 47: CQRS EventStore

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

Event Store

View Model

Get new events since (Time)

Commit

E1

E2

ID : UUID

Page 48: CQRS EventStore

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

Event Store

View Model

Get new events since (Time)

Commit

E1

E2

ID : UUID

Dispatched : bool

Page 49: CQRS EventStore

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

Event Store

View Model

Get undispatched events

Commit

E1

E2

ID : UUID

Dispatched : boolmark as

dispatched

Page 50: CQRS EventStore

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

Event Store

View Model

publish (commit)

Commit

E1

E2

ID : UUID

Dispatched : boolИдемпотентность во

View Model хранилище по-

прежнему нужна mark as

dispatched

Page 51: CQRS EventStore

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

BUS

Command Processor

Event Store

cmd

events

commit

Dispatcher

EventPublisher

commit

events

Storage

Your App

commit mark as dispatched

OK

Page 52: CQRS EventStore

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

BUS

Command Processor

Event Store

cmd

events

commit

Dispatcher

EventPublisher

commit

events

Storage

Your App

commit

dispatched = false

FAIL

Page 53: CQRS EventStore

Архитектура

Page 54: CQRS EventStore

CommitEvent Store

Persistence Engine

Event Stream Commit

Event MessageDispatche

r

Storage

Page 55: CQRS EventStore

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

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)

Page 56: CQRS EventStore

Расширяемость

Page 57: CQRS EventStore

Метаданые

Commit

Event Message

Dictionary<string, object>

Dictionary<string, object>

Office, User, PrecedingMessageId

EventId, AggregateType

Page 58: CQRS EventStore

Хуки

Event Store

Persistence Engine

Commit

Место для “врезки” в конвейер обработки

Hook into:• select• pre-commit• post-commit

Page 59: CQRS EventStore

Хуки

Page 60: CQRS EventStore

Диспатчер – это встроенный хук

Page 61: CQRS EventStore

Механизмы эволюции схемы событий

Page 62: CQRS EventStore

2 подхода

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

• Явное версионирование

Page 63: CQRS EventStore

Свалка аппликаторов в бизнес-аггрегате

Page 64: CQRS EventStore

Преемственность версий

InvoiceCreated

InvoiceCreated_v2

InvoiceCreated_v3

convert to

convert to

Page 65: CQRS EventStore

Хук-конвертер в Event Store

Page 66: CQRS EventStore

Проект CommonDomain

Page 67: CQRS EventStore

Базовый класс для Аггрегатов

Page 68: CQRS EventStore

Репозиторий - DAO для Аггрегатов

Page 69: CQRS EventStore

Обработка конфликтов параллельного доступа

Page 70: CQRS EventStore

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

Transaction Posted

Transaction Posted

Transaction Posted

post

General Ledger

post

Page 71: CQRS EventStore

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