CQRS basierte 
Architekturen 
mit 
Microservices
Michael Plöd 
@bitboss
Die klassische, bewährte 
N-Tier Software- 
Architektur
IncidentSOAPEndpoint 
IncidentBusinessService 
IncidentDAO 
Incident 
View 
Model 
Incident! 
Business 
Model 
Client 
Incident 
DTO 
RDBMS 
Incident 
ER-Model 
Netzwerk 
Netzwerk
Charakteristika
1 Wir lesen und schreiben 
Daten über den identischen 
Weg 
IncidentSOAPEndpoint 
IncidentBusinessService 
IncidentDAO 
Incident 
View 
Model 
Incident! 
Business 
Model 
Client 
Incident 
DTO 
RDBMS 
Incident 
ER-Model 
Netzwerk 
Netzwerk 
WRITE 
READ
2 Wir verwenden für Lesen 
und Schreiben das gleiche 
Modell 
IncidentSOAPEndpoint 
IncidentBusinessService 
IncidentDAO 
Incident 
View 
Model 
Incident! 
Business 
Model 
Client 
Incident 
DTO 
RDBMS 
Incident 
ER-Model 
Netzwerk 
Netzwerk
3 Grobgranulares 
Deployment 
Client 
IncidentSOAPEndpoint 
IncidentBusinessService 
IncidentDAO 
RDBMS 
Frontend-Server 
Backend-Server 
Datenbank-Server
?Probleme
Zahlreiche Anwendungen 
fahren mit der klassischen 
Architektur gut
Es gibt dennoch Bereiche, in 
denen dieses 
Architekturmodell an seine 
Grenzen stößt
1 Datenmodell ist ein 
Kompromiss 
2 Skalierbarkeit 
3 Hang zum Monolithen
CQRS
Command 
Query 
Responsibility 
Separation
! 
CQRS ist ein 
Pattern, keine 
Architektur
IncidentSOAPEndpoint 
IncidentBusinessService 
IncidentDAO 
Incident 
View 
Model 
Incident! 
Business 
Model 
Client 
Incident 
DTO 
RDBMS 
Incident 
ER-Model 
Netzwerk 
Netzwerk
Einfache CQRS 
Architektur 
IncidentQueryEndpoint 
IncidentQueryService 
IncidentQueryDAO 
Netzwerk 
RDBMS 
IncidentCommandEndpoint 
IncidentCommandService 
IncidentCommandDAO
Code Beispiel
Klassisches Interface 
public interface IncidentManagementService {! 
! Incident saveIncident(Incident i);! 
! void updateIncident(Incident i);! 
! List<Incident> retrieveBySeverity(Severity s);! 
! Incident retriveById(Long id);! 
}
CQRS Interface 
public interface IncidentManagementQueryService {! 
! List<Incident> retrieveBySeverity(Severity s);! 
! Incident retriveById(Long id);! 
} 
public interface IncidentManagementCommandService {! 
! Incident saveIncident(Incident i);! 
! void updateIncident(Incident i);! 
}
1 Optimiertes Lese- und 
Schreib-Modell
Getrenntes Model 
IncidentQueryEndpoint 
IncidentQueryService 
IncidentQueryDAO 
Netzwerk 
RDBMS 
IncidentCommandEndpoint 
IncidentCommandService 
IncidentCommandDAO 
Read 
Model 
Write 
Model 
Achtung: aktuell laufen beide 
Models noch auf ein 
gemeinsames Datenbank- 
Modell zusammen
2 CQRS ist gut für Event 
Sourcing geeignet
Klassische Architektur 
IncidentRestController 
IncidentBusinessService 
IncidentDAO 
Incident 
ID USER_ID DATUM TEXT 
1 23423 11.03.2014 Maus defekt 
2 67454 12.03.2014 EMail Empfang 
3 93729 12.03.2014 Monitor defekt 
… … … …
Update 
IncidentRestController 
IncidentBusinessService 
IncidentDAO 
Incident 
ID USER_ID DATUM TEXT 
1 23423 11.03.2014 Maus ist kaputt" 
2 67454 12.03.2014 EMail Empfang 
3 93729 12.03.2014 Monitor defekt 
… … … …
Update 
IncidentRestController 
IncidentBusinessService 
Der Datensatz wird direkt geändert. 
IncidentDAO 
Incident 
Keine Historie 
ID USER_ID DATUM TEXT 
1 23423 11.03.2014 Maus ist kaputt" 
2 67454 12.03.2014 EMail Empfang 
3 93729 12.03.2014 Monitor defekt 
… … … …
Event Sourcing ist ein 
Architekturstil bei dem 
der Zustand der Daten 
einer Anwendung aus 
einer Sequenz von 
Events bestimmt wird
Event Sourcing 
IncidentCreateEvent 
incidentNumber: 1 
userNumber: 23423! 
timestamp: 11.03.2014 12:23:23 
text: „Maus defekt“! 
status: „offen“ 
IncidentUpdateEvent 
incidentNumber: 1 
text: „Maus ist Kaputt“ 
IncidentUpdateEvent 
incidentNumber: 1 
solution: „Neue Maus“! 
status: „geschlossen“
Event Sourcing 
Select * from Insert into 
EventHandler EEvveennttss 
IncidentCommandEndpoint 
IncidentCommandService 
IncidentCommandDAO 
RDBMS 
IncidentQueryEndpoint 
IncidentQueryService 
IncidentQueryDAO 
Lese Datenhaltung 
Events
3 CQRS eignet sich gut für 
asynchrones Processing / 
messaging Patterns
Async CQRS 
Commands können 
asynchron prozessiert 
Select * from Insert into 
EventHandler EEvveennttss 
IncidentCommandEndpoint 
IncidentCommandService 
IncidentCommandDAO 
RDBMS 
IncidentQueryEndpoint 
IncidentQueryService 
IncidentQueryDAO 
Lese Datenhaltung 
Events 
werden
Microservices
Martin Fowler: 
„In short, the microservice 
architectural style is an approach to 
developing a single application as a 
suite of small services, each running in 
its own process and communicating 
with lightweight mechanisms, often an 
HTTP resource API.“ 
http://martinfowler.com/articles/microservices.html
CQRS basierte 
Anwendungen eignen sich 
hervorragend für ein 
Microservice-Modell
Command und Query 
Incident 
CommandMicroservice 
Incident 
QueryMicroservice 
Split 
EEvveennttss 
Events 
EventHandling 
Microservice 
IncidentQueryEndpoint 
IncidentQueryService 
IncidentQueryDAO 
Lese Datenhaltung 
IncidentCommandEndpoint 
IncidentCommandService 
IncidentCommandDAO 
RDBMS
1 Individuelle Skalierbarkeit 
2 Technologie-Freiheit für 
Query, Command und 
Event Handling Teil 
3 Vermeidung von 
Monolithen
? Eignung
Fragen? 
Michael Plöd" 
@bitboss" 
http://slideshare.net/mploed" 
michael.ploed@gmail.com

CQRS basierte Architekturen mit Microservices

  • 1.
    CQRS basierte Architekturen mit Microservices
  • 2.
  • 3.
    Die klassische, bewährte N-Tier Software- Architektur
  • 4.
    IncidentSOAPEndpoint IncidentBusinessService IncidentDAO Incident View Model Incident! Business Model Client Incident DTO RDBMS Incident ER-Model Netzwerk Netzwerk
  • 5.
  • 6.
    1 Wir lesenund schreiben Daten über den identischen Weg IncidentSOAPEndpoint IncidentBusinessService IncidentDAO Incident View Model Incident! Business Model Client Incident DTO RDBMS Incident ER-Model Netzwerk Netzwerk WRITE READ
  • 7.
    2 Wir verwendenfür Lesen und Schreiben das gleiche Modell IncidentSOAPEndpoint IncidentBusinessService IncidentDAO Incident View Model Incident! Business Model Client Incident DTO RDBMS Incident ER-Model Netzwerk Netzwerk
  • 8.
    3 Grobgranulares Deployment Client IncidentSOAPEndpoint IncidentBusinessService IncidentDAO RDBMS Frontend-Server Backend-Server Datenbank-Server
  • 9.
  • 10.
    Zahlreiche Anwendungen fahrenmit der klassischen Architektur gut
  • 11.
    Es gibt dennochBereiche, in denen dieses Architekturmodell an seine Grenzen stößt
  • 12.
    1 Datenmodell istein Kompromiss 2 Skalierbarkeit 3 Hang zum Monolithen
  • 13.
  • 14.
  • 15.
    ! CQRS istein Pattern, keine Architektur
  • 16.
    IncidentSOAPEndpoint IncidentBusinessService IncidentDAO Incident View Model Incident! Business Model Client Incident DTO RDBMS Incident ER-Model Netzwerk Netzwerk
  • 17.
    Einfache CQRS Architektur IncidentQueryEndpoint IncidentQueryService IncidentQueryDAO Netzwerk RDBMS IncidentCommandEndpoint IncidentCommandService IncidentCommandDAO
  • 18.
  • 19.
    Klassisches Interface publicinterface IncidentManagementService {! ! Incident saveIncident(Incident i);! ! void updateIncident(Incident i);! ! List<Incident> retrieveBySeverity(Severity s);! ! Incident retriveById(Long id);! }
  • 20.
    CQRS Interface publicinterface IncidentManagementQueryService {! ! List<Incident> retrieveBySeverity(Severity s);! ! Incident retriveById(Long id);! } public interface IncidentManagementCommandService {! ! Incident saveIncident(Incident i);! ! void updateIncident(Incident i);! }
  • 21.
    1 Optimiertes Lese-und Schreib-Modell
  • 22.
    Getrenntes Model IncidentQueryEndpoint IncidentQueryService IncidentQueryDAO Netzwerk RDBMS IncidentCommandEndpoint IncidentCommandService IncidentCommandDAO Read Model Write Model Achtung: aktuell laufen beide Models noch auf ein gemeinsames Datenbank- Modell zusammen
  • 23.
    2 CQRS istgut für Event Sourcing geeignet
  • 24.
    Klassische Architektur IncidentRestController IncidentBusinessService IncidentDAO Incident ID USER_ID DATUM TEXT 1 23423 11.03.2014 Maus defekt 2 67454 12.03.2014 EMail Empfang 3 93729 12.03.2014 Monitor defekt … … … …
  • 25.
    Update IncidentRestController IncidentBusinessService IncidentDAO Incident ID USER_ID DATUM TEXT 1 23423 11.03.2014 Maus ist kaputt" 2 67454 12.03.2014 EMail Empfang 3 93729 12.03.2014 Monitor defekt … … … …
  • 26.
    Update IncidentRestController IncidentBusinessService Der Datensatz wird direkt geändert. IncidentDAO Incident Keine Historie ID USER_ID DATUM TEXT 1 23423 11.03.2014 Maus ist kaputt" 2 67454 12.03.2014 EMail Empfang 3 93729 12.03.2014 Monitor defekt … … … …
  • 27.
    Event Sourcing istein Architekturstil bei dem der Zustand der Daten einer Anwendung aus einer Sequenz von Events bestimmt wird
  • 28.
    Event Sourcing IncidentCreateEvent incidentNumber: 1 userNumber: 23423! timestamp: 11.03.2014 12:23:23 text: „Maus defekt“! status: „offen“ IncidentUpdateEvent incidentNumber: 1 text: „Maus ist Kaputt“ IncidentUpdateEvent incidentNumber: 1 solution: „Neue Maus“! status: „geschlossen“
  • 29.
    Event Sourcing Select* from Insert into EventHandler EEvveennttss IncidentCommandEndpoint IncidentCommandService IncidentCommandDAO RDBMS IncidentQueryEndpoint IncidentQueryService IncidentQueryDAO Lese Datenhaltung Events
  • 30.
    3 CQRS eignetsich gut für asynchrones Processing / messaging Patterns
  • 31.
    Async CQRS Commandskönnen asynchron prozessiert Select * from Insert into EventHandler EEvveennttss IncidentCommandEndpoint IncidentCommandService IncidentCommandDAO RDBMS IncidentQueryEndpoint IncidentQueryService IncidentQueryDAO Lese Datenhaltung Events werden
  • 32.
  • 33.
    Martin Fowler: „Inshort, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API.“ http://martinfowler.com/articles/microservices.html
  • 34.
    CQRS basierte Anwendungeneignen sich hervorragend für ein Microservice-Modell
  • 35.
    Command und Query Incident CommandMicroservice Incident QueryMicroservice Split EEvveennttss Events EventHandling Microservice IncidentQueryEndpoint IncidentQueryService IncidentQueryDAO Lese Datenhaltung IncidentCommandEndpoint IncidentCommandService IncidentCommandDAO RDBMS
  • 36.
    1 Individuelle Skalierbarkeit 2 Technologie-Freiheit für Query, Command und Event Handling Teil 3 Vermeidung von Monolithen
  • 37.
  • 38.
    Fragen? Michael Plöd" @bitboss" http://slideshare.net/mploed" michael.ploed@gmail.com