SlideShare ist ein Scribd-Unternehmen logo
1 von 44
Downloaden Sie, um offline zu lesen
CQRS v
@ProchazkaFilip
Co si povíme
- Na čem běží Rohlik.cz
- Co je ORM, a proč ho používat
- Seznámení s Doctrine 2
- Seznámení s ElasticSearch
- CQRS
Na čem běžíme
Na čem běžíme: platforma
- PHP-FPM
- NGINX
- Percona (MySQL)
- Redis
- RabbitMQ
- ElasticSearch
Na čem běžíme: aplikace
- Nette Framework
- Doctrine 2 ORM
- Symfony komponenty
- React.PHP
Na čem běžíme: podpůrné technologie
- NewRelic
- Papertrail
- Travis CI
- GitHub
- Slack
- Composer
- ...
Proč používat ORM
“Nejhloupější” modely
class OrdersModel
{
private $db;
function __construct(DbConnection $db) {
$this->db = $db;
}
function findAll() {
return $this->db->query("SELECT * FROM orders");
}
ORM?
Object-relational mapping is a programming
technique for converting data between
incompatible type systems in object-oriented
programming languages.
via https://en.wikipedia.org/wiki/Object-relational_mapping
Pseudo-ORM
class OrdersModel
{
private $db;
function __construct(DbConnection $db) {
$this->db = $db;
}
function findAll() {
return $this->mapResult(
$this->db->query("SELECT * FROM orders")
);
}
Active Record
$user = User::create(['name' => 'Tito']);
$user = User::find_by_name('Tito');
$user->name = 'Tito Jr';
$user->save();
$user->delete();
SOLID
● Single responsibility principle
● Open/closed principle
● Liskov substitution principle
● Interface segregation principle
● Dependency inversion principle
Data Mapper
$user = new User('Pepa');
$em->persist($user);
$em->flush();
$user = $em->find(User::class, 1);
Data Mapper
- Můžu mít kompletně objektový model
- Entity jsou objekty, které se nestarají o persistenci
- To že je entita uložena v DB je “detail”
Doctrine 2 ORM
Doctrine: architektura
DBAL
Doctrine ORM
Entities
Services
Facades
Database
EntityManager
Repository
Doctrine: DBAL
- Obálka nad PDO
- Abstrakce mezi databázemi
- Primitivní datové typy
- Schéma
- Snadnější DB migrace
Doctrine:
- Persistence entit
- Událostní systém (Eventy)
- UnitOfWork
- Identity Mapa
- DQL
Doctrine ORM
Doctrine:
class Product
{
/** @var int */
private $id;
/** @var string */
private $name;
Entities
Doctrine:
/** @Entity @Table(name="products") **/
class Product
{
/** @Id @Column(type="integer") @GeneratedValue **/
private $id;
/** @Column(type="string") **/
private $name;
Entities
Doctrine: Services
- Logické jednotky a operace v aplikaci
- Může být více services na jednu entitu
- Může být více entit na jednu service
Doctrine: DQL
SELECT b, e, r
FROM Bug b
JOIN b.engineer e
JOIN b.reporter r
ORDER BY b.created DESC
Doctrine: Facades
- Zapouzdřují services
- Jedna metoda využívá několik service
Doctrine: nevýhody
- Je nutné chápat OOP
- Je nutné chápat DataMapper a spol.
- Leaky abstraction
- Výkon
ElasticSearch
ElasticSearch
- schema-less search engine
- umí schéma
- škálování za hubičku
- REST api
ElasticSearch
- obsahuje index
- indexy obsahují typy
- typy obsahují dokumenty
- dokumenty mají id a fieldy
GET /rohlikcz/product/123
ElasticSearch: (de)normalizace
- app -> databáze = normalizace
- méně dat
- méně duplikací
- horší na dotazování
- databáze -> ES = denormalizace
- duplikace, duplikace, duplikace
- so fucking fast
ElasticSearch
GET /megacorp/employee/_search?q=last_name:Smith
{
...
"hits": {
"total": 2,
"hits": [
{
...
"_source": {
"first_name": "John",
"last_name": "Smith",
"age": 25,
"about": "I love to go rock climbing",
"interests": [ "sports", "music" ]
}
},
ElasticSearch + Doctrine
- Entity se nemapují 1:1 na typy
- Typy mají vlastní serializery
- V serializerech můžu pokládat SQL dotazy
- Synchronizace běží v RabbitMQ workeru
ElasticSearch + Doctrine
$product = $em->find(Product::class, 1);
$product->name = 'Banán';
$em->flush();
// volá se automaticky
$searchSync->append($product);
ElasticSearch + Doctrine
ElasticSearch + Doctrine
class ProductSerializer
{
public function serialize($product)
{
return [
'id' => $product->id,
'name' => $product->name,
];
}
ElasticSearch + Doctrine
$query = (new Query(...))
->andMust(...);
$resultSet = $searchManager
->search($query);
$products = $productsMapper
->mapResult($resultSet);
ElasticSearch + Doctrine
function mapResult(ResultSet $resultSet)
{
$result = [];
foreach ($resultSet->results as $item) {
$result[$item->id] =
new ProductDTO($item->id, $item->source);
}
return $result;
}
ElasticSearch + Doctrine
class ProductDTO
{
private $id;
private $source;
public function __construct($id, $source)
{
$this->id = $id;
$this->source = $source;
}
ElasticSearch + Doctrine
class ProductDTO
{
// ...
public function __get($field)
{
return $this->source[$field];
}
Command
Query
Responsibility
Segregation
CQS
It states that every method should either be a
command that performs an action, or a query
that returns data to the caller, but not both.
In other words, Asking a question should not
change the answer.
via https://en.wikipedia.org/wiki/Command%E2%80%93query_separation
CQRS
Applies the CQS principle by using separate
Query and Command objects to retrieve and
modify data, respectively.
via https://en.wikipedia.org/wiki/Command%E2%80%93query_separation
CQRS
- lepší škálování
- větší komplexita
- častěji je snažší použít CRUD
Shrnutí
- ORM je super
- S ORM je jednodušší se střelit do nohy
- ElasticSearch je super
- CQRS je super
Dotazy?
Díky za pozornost!
@ProchazkaFilip / @PecemeRohlik

Weitere ähnliche Inhalte

Was ist angesagt?

CRCE - přehled datového modelu a vybraná API
CRCE - přehled datového modelu a vybraná APICRCE - přehled datového modelu a vybraná API
CRCE - přehled datového modelu a vybraná APIPremek Brada
 
Aplikační nastavení v .NET
Aplikační nastavení v .NETAplikační nastavení v .NET
Aplikační nastavení v .NETJan Hřídel
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace Jan Hřídel
 
Webinář: Oracle DBA - RAC - Úvod do problematiky
Webinář: Oracle DBA - RAC - Úvod do problematikyWebinář: Oracle DBA - RAC - Úvod do problematiky
Webinář: Oracle DBA - RAC - Úvod do problematikyTomas Solar
 
Oracle RMAN - nastavení a provedení zálohy
Oracle RMAN - nastavení a provedení zálohyOracle RMAN - nastavení a provedení zálohy
Oracle RMAN - nastavení a provedení zálohyTomas Solar
 
Architektura databáze Oracle
Architektura databáze OracleArchitektura databáze Oracle
Architektura databáze OracleTomas Solar
 
Instalace databáze Oracle 12.1.0.2.0 na Oracle Enterprise linux 7.0 (OEL70)
Instalace databáze Oracle 12.1.0.2.0 na Oracle Enterprise linux 7.0 (OEL70)Instalace databáze Oracle 12.1.0.2.0 na Oracle Enterprise linux 7.0 (OEL70)
Instalace databáze Oracle 12.1.0.2.0 na Oracle Enterprise linux 7.0 (OEL70)Tomas Solar
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)Martin Zeman
 

Was ist angesagt? (12)

Kdyby/Events #posobota
Kdyby/Events #posobotaKdyby/Events #posobota
Kdyby/Events #posobota
 
CRCE - přehled datového modelu a vybraná API
CRCE - přehled datového modelu a vybraná APICRCE - přehled datového modelu a vybraná API
CRCE - přehled datového modelu a vybraná API
 
Aplikační nastavení v .NET
Aplikační nastavení v .NETAplikační nastavení v .NET
Aplikační nastavení v .NET
 
Kurz linux 1 pub
Kurz linux 1   pubKurz linux 1   pub
Kurz linux 1 pub
 
Clean code
Clean codeClean code
Clean code
 
INPTP Rekapitulace
INPTP Rekapitulace INPTP Rekapitulace
INPTP Rekapitulace
 
Webinář: Oracle DBA - RAC - Úvod do problematiky
Webinář: Oracle DBA - RAC - Úvod do problematikyWebinář: Oracle DBA - RAC - Úvod do problematiky
Webinář: Oracle DBA - RAC - Úvod do problematiky
 
Oracle RMAN - nastavení a provedení zálohy
Oracle RMAN - nastavení a provedení zálohyOracle RMAN - nastavení a provedení zálohy
Oracle RMAN - nastavení a provedení zálohy
 
Architektura databáze Oracle
Architektura databáze OracleArchitektura databáze Oracle
Architektura databáze Oracle
 
Instalace databáze Oracle 12.1.0.2.0 na Oracle Enterprise linux 7.0 (OEL70)
Instalace databáze Oracle 12.1.0.2.0 na Oracle Enterprise linux 7.0 (OEL70)Instalace databáze Oracle 12.1.0.2.0 na Oracle Enterprise linux 7.0 (OEL70)
Instalace databáze Oracle 12.1.0.2.0 na Oracle Enterprise linux 7.0 (OEL70)
 
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
MicroKernel - aneb špatný název pro Helper (5. sraz přátel Symfony v Praze)
 
PZ2021
PZ2021PZ2021
PZ2021
 

Andere mochten auch

Msa to rob
Msa to robMsa to rob
Msa to robfhcds
 
Metodologías Lúdicas como recurso didáctico y psicopedagógico en Educación In...
Metodologías Lúdicas como recurso didáctico y psicopedagógico en Educación In...Metodologías Lúdicas como recurso didáctico y psicopedagógico en Educación In...
Metodologías Lúdicas como recurso didáctico y psicopedagógico en Educación In...Campuseducación
 
Acta reunión 11 de noviembre
Acta reunión 11 de noviembreActa reunión 11 de noviembre
Acta reunión 11 de noviembrejamplitudrm
 
Tool digital meeting room solutions for efficient cross border meeting v1....
Tool   digital meeting room  solutions for efficient cross border meeting v1....Tool   digital meeting room  solutions for efficient cross border meeting v1....
Tool digital meeting room solutions for efficient cross border meeting v1....Jean-François Nguyen
 
Makalah model addie
Makalah model addieMakalah model addie
Makalah model addieEvi Masyur
 
[1] rpp sd kelas 5 benda-benda di lingkungan sekitar
[1] rpp sd kelas 5   benda-benda di lingkungan sekitar[1] rpp sd kelas 5   benda-benda di lingkungan sekitar
[1] rpp sd kelas 5 benda-benda di lingkungan sekitareli priyatna laidan
 
Nejlepší cache je žádná cache
Nejlepší cache je žádná cacheNejlepší cache je žádná cache
Nejlepší cache je žádná cacheFilip Procházka
 
Methodology: Agile introduction for deciders
Methodology: Agile introduction for decidersMethodology: Agile introduction for deciders
Methodology: Agile introduction for decidersJean-François Nguyen
 
ADVANCE WELDING TECHNOLOGY
ADVANCE WELDING TECHNOLOGY ADVANCE WELDING TECHNOLOGY
ADVANCE WELDING TECHNOLOGY Ravi Vishwakarma
 
Presence Health Case Study Revised
Presence Health Case Study RevisedPresence Health Case Study Revised
Presence Health Case Study Revisedgabriel sanabria
 
Kvalito consulting group life science consultant - device technical expert-...
Kvalito consulting group   life science consultant - device technical expert-...Kvalito consulting group   life science consultant - device technical expert-...
Kvalito consulting group life science consultant - device technical expert-...Daniel Attard
 
crimen y castigo....6 parte
crimen y castigo....6 partecrimen y castigo....6 parte
crimen y castigo....6 partecaretucan
 
Présentation de DBAL en PHP
Présentation de DBAL en PHPPrésentation de DBAL en PHP
Présentation de DBAL en PHPMickael Perraud
 

Andere mochten auch (18)

2013 - Benjamin Eberlei - Doctrine 2
2013 - Benjamin Eberlei - Doctrine 22013 - Benjamin Eberlei - Doctrine 2
2013 - Benjamin Eberlei - Doctrine 2
 
Pmbok6
Pmbok6Pmbok6
Pmbok6
 
Software libre
Software libreSoftware libre
Software libre
 
Msa to rob
Msa to robMsa to rob
Msa to rob
 
Metodologías Lúdicas como recurso didáctico y psicopedagógico en Educación In...
Metodologías Lúdicas como recurso didáctico y psicopedagógico en Educación In...Metodologías Lúdicas como recurso didáctico y psicopedagógico en Educación In...
Metodologías Lúdicas como recurso didáctico y psicopedagógico en Educación In...
 
Acta reunión 11 de noviembre
Acta reunión 11 de noviembreActa reunión 11 de noviembre
Acta reunión 11 de noviembre
 
Timeco
Timeco Timeco
Timeco
 
Tool digital meeting room solutions for efficient cross border meeting v1....
Tool   digital meeting room  solutions for efficient cross border meeting v1....Tool   digital meeting room  solutions for efficient cross border meeting v1....
Tool digital meeting room solutions for efficient cross border meeting v1....
 
Makalah model addie
Makalah model addieMakalah model addie
Makalah model addie
 
[1] rpp sd kelas 5 benda-benda di lingkungan sekitar
[1] rpp sd kelas 5   benda-benda di lingkungan sekitar[1] rpp sd kelas 5   benda-benda di lingkungan sekitar
[1] rpp sd kelas 5 benda-benda di lingkungan sekitar
 
Nejlepší cache je žádná cache
Nejlepší cache je žádná cacheNejlepší cache je žádná cache
Nejlepší cache je žádná cache
 
Methodology: Agile introduction for deciders
Methodology: Agile introduction for decidersMethodology: Agile introduction for deciders
Methodology: Agile introduction for deciders
 
ADVANCE WELDING TECHNOLOGY
ADVANCE WELDING TECHNOLOGY ADVANCE WELDING TECHNOLOGY
ADVANCE WELDING TECHNOLOGY
 
El cuento fer
El cuento ferEl cuento fer
El cuento fer
 
Presence Health Case Study Revised
Presence Health Case Study RevisedPresence Health Case Study Revised
Presence Health Case Study Revised
 
Kvalito consulting group life science consultant - device technical expert-...
Kvalito consulting group   life science consultant - device technical expert-...Kvalito consulting group   life science consultant - device technical expert-...
Kvalito consulting group life science consultant - device technical expert-...
 
crimen y castigo....6 parte
crimen y castigo....6 partecrimen y castigo....6 parte
crimen y castigo....6 parte
 
Présentation de DBAL en PHP
Présentation de DBAL en PHPPrésentation de DBAL en PHP
Présentation de DBAL en PHP
 

Ähnlich wie CQRS v rohlik.cz

RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?Tomáš Strejček
 
ORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM developmentORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM developmentBrnoPHP
 
Představení Ruby on Rails
Představení Ruby on RailsPředstavení Ruby on Rails
Představení Ruby on Railsigloonet
 
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
 
Relační databáze efektivně z pohledu vývojáře
Relační databáze efektivně z pohledu vývojářeRelační databáze efektivně z pohledu vývojáře
Relační databáze efektivně z pohledu vývojářeJan Smitka
 
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryData Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryTaste
 
Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Martin Cerveny
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)almadcz
 
NoSQL databáze, MongoDB
NoSQL databáze, MongoDBNoSQL databáze, MongoDB
NoSQL databáze, MongoDBLukas Korous
 
Slovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTraceSlovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTraceMartin Cerveny
 
Výkonnost webových aplikací
Výkonnost webových aplikacíVýkonnost webových aplikací
Výkonnost webových aplikacíTaste Medio
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidechseznamVyvojari
 
KST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaKST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaJan Hřídel
 
Glami - jak řešíme performance, aneb jak neshodit web TV reklamou
Glami - jak řešíme performance, aneb jak neshodit web TV reklamouGlami - jak řešíme performance, aneb jak neshodit web TV reklamou
Glami - jak řešíme performance, aneb jak neshodit web TV reklamouPetr Bechyně
 
JSON API: Možná nepotřebujete GraphQL
JSON API: Možná nepotřebujete GraphQLJSON API: Možná nepotřebujete GraphQL
JSON API: Možná nepotřebujete GraphQLOndřej Machulda
 

Ähnlich wie CQRS v rohlik.cz (20)

RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
RocDevs/PHPPrague - Proč by sakra někdo měl chtít dělat eshop?
 
ORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM developmentORM Designer: Speed up your ORM development
ORM Designer: Speed up your ORM development
 
Google App Engine
Google App EngineGoogle App Engine
Google App Engine
 
Představení Ruby on Rails
Představení Ruby on RailsPředstavení Ruby on Rails
Představení Ruby on Rails
 
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é
 
Relační databáze efektivně z pohledu vývojáře
Relační databáze efektivně z pohledu vývojářeRelační databáze efektivně z pohledu vývojáře
Relační databáze efektivně z pohledu vývojáře
 
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQueryData Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
Data Restart 2023: Václav Ráš - 10 tipů, jak pracovat s BigQuery
 
Django
DjangoDjango
Django
 
ORM
ORMORM
ORM
 
Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace Czech Oracle Solaris Administrators Day 2011 - DTrace
Czech Oracle Solaris Administrators Day 2011 - DTrace
 
node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)node.js: zápisky z fronty (Battle guide to node.js)
node.js: zápisky z fronty (Battle guide to node.js)
 
NoSQL databáze, MongoDB
NoSQL databáze, MongoDBNoSQL databáze, MongoDB
NoSQL databáze, MongoDB
 
Slovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTraceSlovak Sun Training Day 2010 - DTrace
Slovak Sun Training Day 2010 - DTrace
 
Výkonnost webových aplikací
Výkonnost webových aplikacíVýkonnost webových aplikací
Výkonnost webových aplikací
 
Javascript na steroidech
Javascript na steroidechJavascript na steroidech
Javascript na steroidech
 
KST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáškaKST/ICSHP - 1. přednáška
KST/ICSHP - 1. přednáška
 
Glami - jak řešíme performance, aneb jak neshodit web TV reklamou
Glami - jak řešíme performance, aneb jak neshodit web TV reklamouGlami - jak řešíme performance, aneb jak neshodit web TV reklamou
Glami - jak řešíme performance, aneb jak neshodit web TV reklamou
 
2 prz
 2 prz 2 prz
2 prz
 
Linq
LinqLinq
Linq
 
JSON API: Možná nepotřebujete GraphQL
JSON API: Možná nepotřebujete GraphQLJSON API: Možná nepotřebujete GraphQL
JSON API: Možná nepotřebujete GraphQL
 

Mehr von Filip Procházka

Mehr von Filip Procházka (7)

4 roky remote
4 roky remote4 roky remote
4 roky remote
 
Před čím vás Nette ani Symfony neochrání
Před čím vás Nette ani Symfony neochráníPřed čím vás Nette ani Symfony neochrání
Před čím vás Nette ani Symfony neochrání
 
Testování prakticky
Testování praktickyTestování prakticky
Testování prakticky
 
Kdyby/Translation
Kdyby/TranslationKdyby/Translation
Kdyby/Translation
 
Kdyby/Events
Kdyby/EventsKdyby/Events
Kdyby/Events
 
Nette Tester / Posobota
Nette Tester / PosobotaNette Tester / Posobota
Nette Tester / Posobota
 
Composer / Posobota
Composer / PosobotaComposer / Posobota
Composer / Posobota
 

CQRS v rohlik.cz