SlideShare a Scribd company logo
1 of 64
Download to read offline
Svaťa
Šimara
Read Model
CQRS
Read Model
CQRS
Model
Mapa
Model
• Mentální reprezentace reality
• Pro konkrétní použítí
• Neuniverzální
Konkrétní model
Oproti unierzálnímu
• Snadnější porozumění
• Lépe popisuje use-case
• Více modelů
– Více práce, údržby
Model produktu
Product
Property
Value
0..*
Model produktu
Product
Parent Variant
1..*
Property
Value
0..*
Model produktu
• Doménový model
• Pravidla
• Významy
• Pojmy
Model produktu
• Super na práci s pravidly
– Změny
– Údržba
– Pochpení
Model produktu
• Nevhodný pro vyhledávání
– Složitý
– Pomalý
Řešení pro vyhledávání
Ústupky v modelu
Ústupky v modelu
• Neexistující koncepty
• Složité na pochopení
• „Proč je toto takto?”
– Pokud autor myšlenek odešel,
nikdo neví
Ústupky v modelu
• Změny
– „Neřešitelné” problémy
• 2 modely zároveň
– Doménový
– Rychlý čtecí
Model pro vyhledávání
Model pro vyhledávání
• Podle use-case vyhledávání
• Varianty obsahují přímo vlastnosti
rodičů
• Není rozdíl mezi produktem a
variantou
– Produkt má vždy alespoň
jednu variantu
• ...
Model pro vyhledávání
Product
Variant1..*
Property
Value0..*
Read Model
Read Model
• Další model
• Pro čtecí use-case
• Neočekáváme chování
• Read only
Read Model
Read
Model
Write
Model
Write
Use Cases
Read
Use Cases
Read Model
Read
Model
Write
Model
Write
Use Cases
Read
Use Cases
✔ Model pro čtecí use-case
✗ Performance
Čtecí databáze
Read
Model
Write
Model
Write
Use Cases
Read
Use Cases
Čtecí databáze
✔ Model pro čtecí use-case
✔ Performance
Read
Model
Write
Model
Write
Use Cases
Read
Use Cases
Synchronizace
• Nový prvek systému
– Nové problémy
• Netransakčnost
Read Model ≠ Cache
¿ přestávka ?
Read
Model
Write
Model
Write
Use Cases
Read
Use Cases
Znáte to?
• Web je pomalý
– protože importujeme data
• Máme deadlocky
– takže se nedá importovat
• Web je pomalý,
– protože používáme ORM
CQRS
CQRS
• Command
• Query
• Responsibility
• Separation
CQRS
• Oddělení čtecích a zápisových
zodpovědností
Command
Command
• Jednosměrná akce
– Co se má provést
• Pokyn k vykonání use-case
• Command nic nevrací
– Jednosměrná komunikace
– Akce může odpovědět
vyjímkou
Command
• Vystav fakturu!
• Deaktivuj účet!
• Pošli e-mail k obnovení
zapomenutého hesla!
Command
Command
Bus
UI
API
CLI
Handler
(Write Model)
Command
Command
Command
UI
• UI je zodpovědné za sestavení
commandu a odeslání
• Jasná zodpovědnost
• Testování
Command
Bus
UI
API
CLI
Handler
(Write Model)
Command
UI
Command Bus
• Pro UI rozhraní
• Dispečer commandů
• Pro daný command vykoná daný
handler
• Použijte existující knihovny
Command
Bus
UI
API
CLI
Handler
(Write Model)
Command
Command
Handler
• Obsluha commandu
• Vykonává konkrétní doménový
use-case
• Jasná zodpovědnost
• Testování
Command
Bus
UI
API
CLI
Handler
(Write Model)
Command
Handler
Vše je zřejmé?
Commandy NIC nevrací
Commandy NIC nevrací
Commandy NIC nevrací
Commandy NIC nevrací
• Generování ID dopředu
• UUID
Commandy NIC nevrací
¿ přestávka ?
Query
Query
Query
• Dotaz na data
• Nikdy nemění stav
– Nikdy
– Nikdy
– Nikdy
Query
• Přesně pro potřeby UI
• Vrací objekty Read Modelu
Query
Query
ServiceUI
Query
Objekty
UI
• UI nepřekládá objekty
(jsou Read Model)
• Pouze sestaví odpověď
• Testování
Query
ServiceUI
Query
Objekty
UI
Query Service
• Pro UI rozhraní
• Přesně pro dané čtení
• Efektivní
Query
ServiceUI
Query
Objekty
Query Service
CQRS
Command
Bus
UI
Handler
Query
Service
(Write Model)
(Read Model)
CQRS
• Jednoduchý architektonický vzor
• Zápis a čtení jsou oddělené a
neovlivňují se
• Umožňuje tunit výkon
Command
Bus
UI
Handler
Query
Service
(Write Model)
(Read Model)
CQRS ≠ Event Sourcing
CQRS
Bez čtecí DB
Command
Bus
UI
Handler
Query
Service
(Write Model)
(Read Model)
CQRS
Mixujte DB
Handler
Vyhledávání
90% Systému
Domain-Driven
Design Svaťa Šimara
svatasimara.cz
simara-svatopluk
@svatasimara

More Related Content

What's hot

What's hot (20)

Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all startedKernel Recipes 2019 - ftrace: Where modifying a running kernel all started
Kernel Recipes 2019 - ftrace: Where modifying a running kernel all started
 
Continguous Memory Allocator in the Linux Kernel
Continguous Memory Allocator in the Linux KernelContinguous Memory Allocator in the Linux Kernel
Continguous Memory Allocator in the Linux Kernel
 
Sisteme de Operare: Memorie virtuala
Sisteme de Operare: Memorie virtualaSisteme de Operare: Memorie virtuala
Sisteme de Operare: Memorie virtuala
 
DRPE : Evaluation du risque d’inondation
DRPE : Evaluation du risque d’inondationDRPE : Evaluation du risque d’inondation
DRPE : Evaluation du risque d’inondation
 
Jumping into heaven’s gate
Jumping into heaven’s gateJumping into heaven’s gate
Jumping into heaven’s gate
 
Linux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQLLinux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQL
 
CS9222 ADVANCED OPERATING SYSTEMS
CS9222 ADVANCED OPERATING SYSTEMSCS9222 ADVANCED OPERATING SYSTEMS
CS9222 ADVANCED OPERATING SYSTEMS
 
Les systèmes parcellaires de la forêt de Sénart (77 et 91)
Les systèmes parcellaires de la forêt de Sénart (77 et 91)Les systèmes parcellaires de la forêt de Sénart (77 et 91)
Les systèmes parcellaires de la forêt de Sénart (77 et 91)
 
jemalloc 세미나
jemalloc 세미나jemalloc 세미나
jemalloc 세미나
 
Pwning in c++ (basic)
Pwning in c++ (basic)Pwning in c++ (basic)
Pwning in c++ (basic)
 
What the CRaC - Superfast JVM startup
What the CRaC - Superfast JVM startupWhat the CRaC - Superfast JVM startup
What the CRaC - Superfast JVM startup
 
MySQL Parallel Replication: inventory, use-case and limitations
MySQL Parallel Replication: inventory, use-case and limitationsMySQL Parallel Replication: inventory, use-case and limitations
MySQL Parallel Replication: inventory, use-case and limitations
 
Java File I/O Performance Analysis - Part I - JCConf 2018
Java File I/O Performance Analysis - Part I - JCConf 2018Java File I/O Performance Analysis - Part I - JCConf 2018
Java File I/O Performance Analysis - Part I - JCConf 2018
 
MacOS memory allocator (libmalloc) Exploitation
MacOS memory allocator (libmalloc) ExploitationMacOS memory allocator (libmalloc) Exploitation
MacOS memory allocator (libmalloc) Exploitation
 
Best practices for MySQL/MariaDB Server/Percona Server High Availability
Best practices for MySQL/MariaDB Server/Percona Server High AvailabilityBest practices for MySQL/MariaDB Server/Percona Server High Availability
Best practices for MySQL/MariaDB Server/Percona Server High Availability
 
Splay tree C++
Splay tree C++Splay tree C++
Splay tree C++
 
Understanding &Troubleshooting the Windows Logon Process
Understanding &Troubleshooting the Windows Logon ProcessUnderstanding &Troubleshooting the Windows Logon Process
Understanding &Troubleshooting the Windows Logon Process
 
Multilevel queue scheduling
Multilevel queue schedulingMultilevel queue scheduling
Multilevel queue scheduling
 
OS Process Synchronization, semaphore and Monitors
OS Process Synchronization, semaphore and MonitorsOS Process Synchronization, semaphore and Monitors
OS Process Synchronization, semaphore and Monitors
 
Process Scheduler and Balancer in Linux Kernel
Process Scheduler and Balancer in Linux KernelProcess Scheduler and Balancer in Linux Kernel
Process Scheduler and Balancer in Linux Kernel
 

Similar to Read model & CQRS

TPL - konkurenční, paralelní a asynchronní kód pro náročné
TPL - konkurenční, paralelní a asynchronní kód pro náročnéTPL - konkurenční, paralelní a asynchronní kód pro náročné
TPL - konkurenční, paralelní a asynchronní kód pro náročné
René Stein
 

Similar to Read model & CQRS (6)

DDD kurz - 4. Implementace
DDD kurz - 4. ImplementaceDDD kurz - 4. Implementace
DDD kurz - 4. Implementace
 
Spring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou TvariSpring framework - J2EE S Lidskou Tvari
Spring framework - J2EE S Lidskou Tvari
 
Výběr vhodných technologii pro startup v prostředí cloudu
Výběr vhodných technologii pro startup v prostředí clouduVýběr vhodných technologii pro startup v prostředí cloudu
Výběr vhodných technologii pro startup v prostředí cloudu
 
Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022
Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022
Péhápkaři v Pecce: Naše cesta k read-modelu – Vojtěch Buba –18. 5. 2022
 
Axure RP training
Axure RP trainingAxure RP training
Axure RP training
 
TPL - konkurenční, paralelní a asynchronní kód pro náročné
TPL - konkurenční, paralelní a asynchronní kód pro náročnéTPL - konkurenční, paralelní a asynchronní kód pro náročné
TPL - konkurenční, paralelní a asynchronní kód pro náročné
 

More from Svatopluk Šimara

More from Svatopluk Šimara (8)

Focus on the essece with Domain-Driven Design
Focus on the essece with Domain-Driven DesignFocus on the essece with Domain-Driven Design
Focus on the essece with Domain-Driven Design
 
DDD + Doctrine
DDD + DoctrineDDD + Doctrine
DDD + Doctrine
 
DDD kurz - 5. Persistence + Doctrine
DDD kurz - 5. Persistence + DoctrineDDD kurz - 5. Persistence + Doctrine
DDD kurz - 5. Persistence + Doctrine
 
DDD kurz - 3. model
DDD kurz - 3. modelDDD kurz - 3. model
DDD kurz - 3. model
 
Monorepo: How We Started to Save Our Developers Time
Monorepo: How We Started to Save Our Developers TimeMonorepo: How We Started to Save Our Developers Time
Monorepo: How We Started to Save Our Developers Time
 
DDD kurz - 2. jazyk
DDD kurz - 2. jazykDDD kurz - 2. jazyk
DDD kurz - 2. jazyk
 
DDD kurz - 1. přehled
DDD kurz - 1. přehledDDD kurz - 1. přehled
DDD kurz - 1. přehled
 
Domain-Driven Design Sraz 6.6.2018
Domain-Driven Design Sraz 6.6.2018Domain-Driven Design Sraz 6.6.2018
Domain-Driven Design Sraz 6.6.2018
 

Read model & CQRS