SlideShare une entreprise Scribd logo
1  sur  80
Télécharger pour lire hors ligne
CQRS, ES, Scala?
Maciek Próchniak
Topologia algebraiczna
TouK
Funktory
Monady
Drools
Camel
Servicemix
OSGi
Activiti
Scala
hocolim
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
Wymagania
Alarmy
czujniki
pracownicy
korelacje długoterminowe
wzorce
Wydajność
Korelacje, przetwarzanie
Strumień danych (~300/sec)
Dane historyczne
Audyt
Raporty
Reagowanie na
zmiany
Raporty
http://www.flickr.com/photos/littlejohncollection/4325397661/sizes/l/in/photostream/
UI?
CRUD
Zadania
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
CQS
Command
Query
CQRS
Komenda
Zapytanie
Model domeny
Model odczytu
Event Sourcing
CommentAdded
OrderConfirmed
Event Sourcing
CQRS + ES
Komenda
Zapytanie
Model domeny
Model odczytu
Zdarzenia
Architektura z lotu ptaka
domena
log zdarzeń raporty
modele odczytu
korelacje
A co jeśli...?
Będzie zbyt dużo zdarzeń?
Snapshoty
Zmieni się format zdarzeń?
Migracja logu danych
Modyfikacje w locie
Model do odczytu "popsuje się"?
Odtwarzamy z logu zdarzeń
Potrzebujemy nowych modeli?
Tworzymy z logu zdarzeń
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
domena
log zdarzeń raporty
modele odczytu
korelacje
dane w pamięci
jeden wątek
docelowo: użycie STM
Repozytorium
Teraz będzie Scala
Zamknij oczy i myśl o Anglii
Javie
Domena funkcyjna
?
Agregat
reguły
biznesowe
transakcje
spójność
dostęp
zachowanie
Niezmienialne agregaty
?
Event Sourcing
domena
log zdarzeń raporty
modele odczytu
korelacje
class Update[A,E] {
val aggregate : A
val event : E
}
trait EventHandler {
def handle(update:Update[_,_])
}
Zachowanie a zmiana stanu
NO BEHAVIOR in state changing methods, no
conditional logic, no exceptions
- Greg Young
class Order {
//zachowania
def confirm() : List[DomainEvent]
def addLine(productId:UID):
List[DomainEvent]
//brak logiki
def apply(event:DomainEvent):Order
}
Encje jako ADT - case class
case class Order(id:String,
lines:List[OrderLine]){
def addOrderLine(line:OrderLine)=
def confirm() = ...
def cancel() = ...
}
Bonus - FSM
Bonus - FSM
case class PreOrder(...) extends Order {
def confirm : OrderConfirmed
def apply(e:OrderConfirmed) :
ConfirmedOrder
}
case class ConfirmedOrder(..) extends
Order {
def send() : OrderSent
}
Bonus - testy
When did you read test to assure sth
hasn't happened?
- Greg Young
Bonus - testy
//given
AlarmCreated, AlarmAckonwledged
//when
clearAlarm
//then
AcknowledgedAlarmCleared
Walidacja
Walidacja
if (total < 0) {
throw ValidationError("Not enough");
}
if (total < 0) {
validationErrors.add("Not enough");
}
if (validationErrors.size() > 0) {
fail()...
}
Walidacja
if (total < 0) {
throw ValidationError("Not enough");
}
if (total < 0) {
validationErrors.add("Not enough");
}
if (validationErrors.size() > 0) {
fail()...
}
Walidacja bez wyjątków
Never throw an exception of my own
- Joel Spolsky
Walidacje - przykład kodu
Funktor walidacji
scalaz.Validation[Error,_]
//przykładowa metoda
nonEmpty(val:String) : Validation[Error,
String]
Walidacje - przykład kodu
?
Error("empty.name")
for {
name <- nonEmpty(command.name)
Walidacje - przykład kodu
for {
name <- nonEmpty(command.name)
size <- geq(0, command.size)
?
Error("negative.size")
Walidacje - przykład kodu
for {
name <- nonEmpty(command.name)
size <- geq(0, command.size)
} yield addCompany(name,size)
?
Error("bad.company")
Walidacje - przykład kodu
for {
name <- nonEmpty(command.name)
size <- geq(0, command.size)
} yield addCompany(name,size)
?
CompanyAdded(...)
Walidacja bez wyjątków
Non-breaking error handling is just an
applicative functor on a partially applied disjoint
union type constructor with semigroup error
elements so what's the big deal?!
- Tony Morris
Domena funkcyjna
● Oddzielenie stanu od zachowania
● Testowalność
● Dostęp do technik funkcyjnych
● Zrównoleglanie
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
domena
log zdarzeń raporty
modele odczytu
korelacje
Aktor
skrzynka
wiadomości
stan
hierarchie
Akka
Co ze spójnością w GUI?
Akka - komponowanie przyszłości
actorRef ! message
actorRef ? message : Future
Akka - komponowanie przyszłości
Akka - komponowanie przyszłości
Akka - komponowanie przyszłości
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
domena
log zdarzeń raporty
modele odczytu
korelacje
Modele odczytu
Don’t pay an American developer to do
this!!!
- Greg Young
SELECT * from CUSTOMER LEFT JOIN
PRODUCT ...
Skąd brać dane?
WarehouseView
DeviceConnected
Skąd brać dane - zdarzenia
OldWarhouseId
WarehouseView
Skąd brać dane - inny model
WarehouseView
DeviceView
Skąd brać dane - ten sam model
WarehouseView
deviceIds
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
każdy System jest
bardziej CRUDowy
niż się to początkowo wydaje
CQRS na poziomie
autonomicznych serwisów
czy klient rozumie
koszty i ograniczenia
?
EventSourcing
EventSourcing
+
Scala
+
Akka
EventSourcing
+
Scala
+
Akka
Literatura
● Debasish Gosh - http://debasishg.blogspot.
com/
● Martin Krasser - http://krasserm.blogspot.
com/
● Greg Young
● Udi Dahan - http://www.udidahan.com
Dzięki
● http://www.gettyicons.com/free-icons/112/must-have/png/256/cancel_256.png
● http://www.softicons.com/free-icons/web-icons/free-icon-set-by-eclipse-saitex/user-icon
● http://www.flickr.com/photos/littlejohncollection/4325397661/sizes/l/in/photostream/
● http://www.flickr.com/photos/alainpicard/4175215457/sizes/m/in/photostream/
● http://www.flickr.com/photos/squeakychu/5793070401/sizes/m/in/photostream/
● http://upload.wikimedia.org/wikipedia/commons/thumb/7/73/God2-Sistine_Chapel.png/800px-
God2-Sistine_Chapel.png

Contenu connexe

Similaire à CQRS, ES, Scala @ Confitura 2012

Poznańska grupa .Net spotkanie VI - Test Driven Development
Poznańska grupa .Net spotkanie VI - Test Driven DevelopmentPoznańska grupa .Net spotkanie VI - Test Driven Development
Poznańska grupa .Net spotkanie VI - Test Driven Developmentbartlomiej.szafko
 
Interoperability Testing
Interoperability TestingInteroperability Testing
Interoperability Testingkraqa
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyqbeuek
 
Slawek Kluz - Ewolucja modelu danych w testach funkcjonalnych – case study
Slawek Kluz - Ewolucja modelu danych w testach funkcjonalnych – case studySlawek Kluz - Ewolucja modelu danych w testach funkcjonalnych – case study
Slawek Kluz - Ewolucja modelu danych w testach funkcjonalnych – case studykraqa
 
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł GrajewskiPROIDEA
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaWojciech Lichota
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?Brainhub
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztatyintive
 
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13kraqa
 
Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)Bartlomiej Zass
 
OceanQuery - język zapytań edytora raportów
OceanQuery - język zapytań edytora raportówOceanQuery - język zapytań edytora raportów
OceanQuery - język zapytań edytora raportówmatmis
 
Empathy optymalizacja postgre_sql
Empathy optymalizacja postgre_sqlEmpathy optymalizacja postgre_sql
Empathy optymalizacja postgre_sqlSpodek 2.0
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPPiotr Gabryjeluk
 
Info meet pomiary wydajności
Info meet pomiary wydajnościInfo meet pomiary wydajności
Info meet pomiary wydajnościmagda3695
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?javOnet
 
Cloud computing na bazie Windows Azure, Tomek Kopacz, Microsoft
Cloud computing na bazie Windows Azure, Tomek Kopacz, MicrosoftCloud computing na bazie Windows Azure, Tomek Kopacz, Microsoft
Cloud computing na bazie Windows Azure, Tomek Kopacz, MicrosoftBiznes 2.0
 
Tomasz Kopacz, Cloud computing na bazie Windows Azure
Tomasz Kopacz, Cloud computing na bazie Windows AzureTomasz Kopacz, Cloud computing na bazie Windows Azure
Tomasz Kopacz, Cloud computing na bazie Windows AzureWebhosting.pl
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz
 

Similaire à CQRS, ES, Scala @ Confitura 2012 (20)

Poznańska grupa .Net spotkanie VI - Test Driven Development
Poznańska grupa .Net spotkanie VI - Test Driven DevelopmentPoznańska grupa .Net spotkanie VI - Test Driven Development
Poznańska grupa .Net spotkanie VI - Test Driven Development
 
Interoperability Testing
Interoperability TestingInteroperability Testing
Interoperability Testing
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Jak stworzyć udany system informatyczny
Jak stworzyć udany system informatycznyJak stworzyć udany system informatyczny
Jak stworzyć udany system informatyczny
 
Slawek Kluz - Ewolucja modelu danych w testach funkcjonalnych – case study
Slawek Kluz - Ewolucja modelu danych w testach funkcjonalnych – case studySlawek Kluz - Ewolucja modelu danych w testach funkcjonalnych – case study
Slawek Kluz - Ewolucja modelu danych w testach funkcjonalnych – case study
 
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
4Developers 2015: Property-based testing w języku Scala - Paweł Grajewski
 
Apache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użyciaApache http server - proste i zaawansowane przypadki użycia
Apache http server - proste i zaawansowane przypadki użycia
 
tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?tRPC - czy to koniec GraphQL?
tRPC - czy to koniec GraphQL?
 
Patronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 WarsztatyPatronage 2016 Windows 10 Warsztaty
Patronage 2016 Windows 10 Warsztaty
 
Wprowadzenie do PHPUnit
Wprowadzenie do PHPUnitWprowadzenie do PHPUnit
Wprowadzenie do PHPUnit
 
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
Więcej testów/mniej kodu - Michał Gaworski, kraQA 13
 
Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)Wzorce projektowe (w ASP.NET i nie tylko)
Wzorce projektowe (w ASP.NET i nie tylko)
 
OceanQuery - język zapytań edytora raportów
OceanQuery - język zapytań edytora raportówOceanQuery - język zapytań edytora raportów
OceanQuery - język zapytań edytora raportów
 
Empathy optymalizacja postgre_sql
Empathy optymalizacja postgre_sqlEmpathy optymalizacja postgre_sql
Empathy optymalizacja postgre_sql
 
TWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHPTWIG - niezłe widoki dla PHP
TWIG - niezłe widoki dla PHP
 
Info meet pomiary wydajności
Info meet pomiary wydajnościInfo meet pomiary wydajności
Info meet pomiary wydajności
 
Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?Jak podwoić wartość kodu .NET?
Jak podwoić wartość kodu .NET?
 
Cloud computing na bazie Windows Azure, Tomek Kopacz, Microsoft
Cloud computing na bazie Windows Azure, Tomek Kopacz, MicrosoftCloud computing na bazie Windows Azure, Tomek Kopacz, Microsoft
Cloud computing na bazie Windows Azure, Tomek Kopacz, Microsoft
 
Tomasz Kopacz, Cloud computing na bazie Windows Azure
Tomasz Kopacz, Cloud computing na bazie Windows AzureTomasz Kopacz, Cloud computing na bazie Windows Azure
Tomasz Kopacz, Cloud computing na bazie Windows Azure
 
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
Tomasz Kopacz MTS 2012 Wind RT w Windows 8 i tzw aplikacje lob (line of busin...
 

CQRS, ES, Scala @ Confitura 2012