2. CQRS and Event Sourcing
• Applica0on
Architecture
• CQRS
and
Event
Sourcing
• Code
/
Example
• Ques0ons
• Resources
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 2
3. Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
Application Architecture
4. Source:
[Evans,
DDD]
Layered Architecture
• One
of
the
oldest
paGerns
• Each
layer
could
couple
only
to
itself
or
below
• Lower
levels
could
loosely
couple
to
upper
via
Observer
or
Mediator
[GoF]
• UI
Layer
– Only
renders
informa0on
– Example:
OHS
(Remote
Façade)
• Applica0on
Layer
– Very
lightweight
– Building
Blocks:
Applica0on
Services
– Coordinate
opera0ons
over
Aggregates
(i.e.
express
Use
Cases)
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 4
5. Source:
[Evans,
DDD]
Layered Architecture
• Applica0on
Layer
– Register
Subscribers
for
Dom.
Events
– Transac0ons,
Email
sending
etc.
– Devoid
of
domain
logic
• Domain
Layer
– Expressive
Behavioural-‐Rich
Domain
Model
• Infrastructure
Layer
– Low
Level
Services
– Focus
on
technology
specific
decisions
– Persistence,
Messaging,
etc.
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 5
6. Source:
[Vernon,
DDD]
Hexagonal Architecture (HA)
• Also
known
as
“Ports
and
Adapters”
• Ports
– Outer
hexagon
(HTTP,
Messaging
etc.)
– Each
hexagon’s
side
represents
a
port
– Either
for
input
or
output
– Do
not
implement
ports(use
e.g.
Jersey)
• Adapters
– Transform
client’s
input
into
internal
API’s
“terms”
– Transform
internal
API’s
output
to
input
suitable
for
clients
– Each
client
type
has
an
Adapter
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 6
7. Source:
[Vernon,
DDD]
Hexagonal Architecture (HA)
• Outer
hexagon
reaches
inner
hexagon
via
applica0on’s
API
• Design
applica0on
inside
per
func0onal
requirements(use
cases
API)
• Layered
Architecture
+
DI
encourages
the
use
of
Hexagonal
Arch.
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 7
8. Event Driven Architecture (EDA)
• Event
Sourcing
• Promotes,
detect,
consume
and
react
to
events
• Pipes
and
Filters
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 8
EpisodeAdded
b#1,s#2
SeriesRenamed
b#20,s#1
BrandAc0vated
b#3
9. Event Driven Architecture (EDA)
• EDA
could
be
combined
with
Hexagonal
Architecture
(HA)
– EDA
used
for
integra0on
– HA
used
for
Bounded
Contexts
– LA
could
replace
HA
as
well
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 9
Source:
[Vernon,
DDD]
10. Event Driven Architecture (EDA)
• Events
as
mechanism
for
Storage
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 10
Source:
[Vernon,
DDD]
11. Event Driven Architecture (EDA)
• Append-‐only
architecture
– No
“Delete”
ac0on
• Distribute
easier
than
RDBMS
– Due
to
no
locks
– Sharding
(uses
only
Aggregate
keys)
• Loading
Objects
– Loads
accumulated
events
for
an
Aggregate
– Performance
issue
for
over
than
100
events
– Rolling
Snapshots
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 11
EpisodeAdded
b#1,s#2
SeriesRenamed
b#20,s#1
SeriesRemoved
b#10,s#2
BrandAc0vated
b#3
4
3
snap
2
1
12. CQRS
• Command
and
Query
Responsibility
Segrega0on
(CQRS)
• Bertrand
Mayer’s
CQS
Principle
– Command:
If
method
alters
the
state
should
not
return
value
(i.e.
returns
void)
– Query:
If
you
return
value
you
cannot
mutate
state
• What
if
we
apply
it
at
architectural
level?
;)
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 12
Read Service
Write Service
13. CQRS
• Stereotypical
vs.
CQRS
Architecture
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 13
Source:
[Young,
CQRS]
Stereotypical Architecture
14. CQRS
• Stereotypical
vs.
CQRS
Architecture
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 14
Source:
[Young,
CQRS]
CQRS
15. CQRS and Event Sourcing
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
16. Source:
[Young,
CQRS]
CQRS + ES
• CQRS
+
EDA
with
Domain
Events
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 16
17. CQRS + ES
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 17
Source:
[Young,
CQRS]
19. Code / Example
• Example
project
– DDD-‐CQRS
Sample,
(v.02)
– HLA:
h"p://prezi.com/akrfq7jyau8w/ddd-‐cqrs-‐leaven-‐v20/
– Code
base:
h"ps://github.com/Bo"egaIT/ddd-‐leaven-‐v2
– User
Group:
h"ps://groups.google.com/forum/#!forum/ddd-‐cqrs-‐sample
• More
projects
on
official
CQRS
site
– hGp://cqrs.wordpress.com/examples/
Bulgarian Java User Group
Nikolay Vasilev, CC BY-SA 3.0
CQRS + ES Page 19