15. Supported By:
DOMAIN DRIVEN DESIGN
Context Map
Context mapping is a design process where the contact points and translations
between bounded contexts are explicitly mapped out. Focus on mapping the existing
landscape, and deal with the actual transformations later.
?Relation
General Ledger
Account Payable
20. Supported By:
Entity & Value Object
Entity…
An object fundamentally defined not by its attributes, but by
a thread of continuity and identity.
Value Object…
An immutable object that describes some characteristic or
attribute but carries no concept of identity.
21. Supported By:
Aggregate
…
Cluster of associated objects that are treated as a unit for
the purpose of data changes.
…
Aggregate enforce concictency
Order Line Items
Customer
Shipping
Address
Aggregate Root
27. Supported By:
CQRS
Pioneered by Greg Young & Udi Dahan
In this context,
» Commands = Writes
» Queries = Reads
Command/Query Responsibility Segregation (CQRS) is the idea
that you can use a different model to update information than
the model you use to read information.
29. Supported By:
Why Is CQRS needed ?
Read vs Write Capacity…
Scale read operations differently from write operations
Split the concerns…
Simplicity in domain model by separating read and writes.
Decreased COMPLEXITY…
Write need validation and consequential logic.
Read have many representation model, and storage mechanism
(polyglot storage)
30. Supported By:
How Does CQRS work ?
Persistent View Model schema
matches UI view model
Scale out
as many
copies as
needed
Command captures the
intent of the user
Commandbus deliver
command to command
handler
A queue can be
utilized to optimize
write performance
After database is
updated, publish result
to view model via
eventbus
31. Supported By:
How Does CQRS work ?
Command
Commands encapsulate the user’s intent
but do not contain business logic, only
enough data for the command.
Command message handled by
command handler.
Just once command handler / command
message.
Command handler can reject a
command, validation / bussines rules
violation
32. Supported By:
How Does CQRS work ?
Event
Events describe changes in the system
state.
An Event Bus can be utilized to dispatch
events to subscribers.
Events primary purpose update the read
model
Events can also provider integration with
external systems
CQRS can also be used in conjunction
with Event Sourcing.
34. Supported By:
Traditional systems store current state
INSERT INTO charging_stations
VALUES (“CP001”, “Acme Corp.”, “Widget B”);
INSERT INTO charging_stations
VALUES (“CP003”, “ABC Widgets”, “Model-1”);
UPDATE charging_stations
SET model = “Widget A”
WHERE identity = “CP001”;
36. Supported By:
Traditional systems store current state
keeping only the current state…
lot of valuable historic data is lost, e.g. the information about the
time a state change happened, who invoked the change, and so
on. This historic data may remind you of something called an
audit log.
conceptual model…
there is no single model that could be used universally for every
possible case that the system needs to address. Moreover, the
structure of the application data tends to change overtime..
41. Supported By:
How Does CQRS work ?
Persistent View Model
Read model can be denormalized
RDBMS, document store, etc.
Optimize read model with different data
storage technologies for different kinds
of data (polyglot)
Eventually Concistence
51. Supported By:
AMQP IN A NUTSHELL
A producer is a user
application that
sends messages
A exchange is message router
that routes message to
queue. There is Direct,
Fanout, Topic Exchange
A queue is a buffer that
stores messages
A consumer
is a user
application
that receives
messages.
52. Supported By:
Fanout Exchange
A fanout exchange routes messages to all of the queues that are bound to it and the routing
key is ignored. If N queues are bound to a fanout exchange, when a new message is
published to that exchange a copy of the message is delivered to all N queues. Fanout
exchanges are ideal for the broadcast routing of messages.
54. Supported By:
Topic Exchange
Topic exchanges route messages to one or many queues based on matching between a
message routing key and the pattern that was used to bind a queue to an exchange.
57. Supported By:
Why Axon Framework
Compatibility with CQRS and ES …
Axon Framework is a Java Framework for scalable and high performance applications and being
focused on making life easier for developers that want to create applications based on the CQRS
principles and concepts, i.e. commands, events, aggregates, entities, sagas, etc. On top of that, it
also supports event sourcing.
Integrability…
It supports the Spring Framework's configuration and dependency injection. It also uses Java
annotations for building the domain model and event listeners without being tied to the Axon's
specific logic.
Active development and support…
the latest version at the time of writing this was 2.4.4. It is actively developed, a new major version
3 is a work in progress. It has nice and detailed documentation and a sample project to showcase
the code. The authors also provide commercial services such as support contracts, training, and
consultancy.
Popularity…
The code repository on GitHub has more than 300 stars and 100 forks. The user community is
active on the mailing lists and on the issue tracker.
58. Supported By:
Axon Framework
CommandBus
SimpleCommandBus…
It does straightforward processing of commands in the thread that dispatches them. After a
command is processed, the modified aggregate(s) are saved and generated events are published in
that same thread.
AsynchronousCommandBus …
It does processing of commands in new thread. After a command is processed, the modified
aggregate(s) are saved and generated events are published in that same thread.
DisruptorCommandBus …
The DisruptorCommandBus takes a different approach to multithreaded processing. Instead of
doing the processing in the calling thread, the tasks are handed off to two groups of threads, that
each take care of a part of the processing. The first group of threads will execute the command
handler, changing an aggregate's state. The second group will store and publish the events to the
Event Store and Event Bus.
62. Supported By:
Axon Framework
EventBus
SimpleEventBus …
The SimpleEventBus just dispatches each incoming Event to each of the subscribed EventListeners
sequentially. If an EventListener throws an Exception, dispatching stops and the exception is
propagated to the component publishing the Event..
ClusteringEventsBus …
The ClusteringEventsBus allows application developers
to bundle EventListeners into Clusters based on their
properties and non-functional requirements. The
ClusteringEventBus is also more capable to deal with
Events being dispatched among different machines.
Contains two mechanisms: the ClusterSelector, which
selects a Cluster instance for each of the registered
EventListeners, and the EventBusTerminal, which is
responsible for dispatching Events to each of the
relevant clusters..
65. Supported By:
Axon Framework
Event Store
FileSystemEventStore…
The FileSystemEventStore stores the events in a file on the file system. It provides good
performance and easy configuration. Not a suitable implementation for production environments
JpaEventStore …
The JpaEventStore stores events in a JPA-compatible data source. Unlike the file system version, the
JPAEventStore supports transactions. The JPA Event Store stores events in so called entries. To use
the JpaEventStore, you must have the JPA (javax.persistence) annotations on your classpath..
JDBC Event Store …
The JDBC event store uses a JDBC Connection to store Events in a JDBC compatible data storage.
Typically, these are relational databases. Theoretically, anything that has a JDBC driver could be
used to back the JDBC Event Store.
MongoDB Event Store …
Use mongodb to store Events.
68. Supported By:
Axon Framework
Aggregate Repositories
GenericJpaRepository…
This is a repository implementation that can store JPA compatible Aggregates. It is configured with
an EntityManager to manage the actual persistence, and a class specifying the actual type of
Aggregate stored in the Repository.
EventSourcingRepository …
The EventSourcingRepository implementation provides the basic functionality needed by any event
sourcing repository in the AxonFramework.
HybridJpaRepository…
The HybridJpaRepository is a combination of the GenericJpaRepository and an Event Sourcing
repository. It can only deal with event sourced aggregates, and stores them in a relational model as
well as in an event store. When the repository reads an aggregate back in, it uses the relational
model exclusively..