CQRS, ES, Scala @ Confitura 2012
-
date post
21-Oct-2014 -
Category
Software
-
view
94 -
download
2
description
Transcript of CQRS, ES, Scala @ Confitura 2012
![Page 1: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/1.jpg)
CQRS, ES, Scala?
![Page 2: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/2.jpg)
Maciek Próchniak
Topologia algebraiczna
TouK
Funktory
Monady
Drools
CamelServicemix
OSGiActiviti
Scala
hocolim
![Page 3: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/3.jpg)
![Page 4: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/4.jpg)
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
![Page 5: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/5.jpg)
Wymagania
![Page 6: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/6.jpg)
Alarmy
czujnikipracownicy
korelacje długoterminowe wzorce
![Page 7: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/7.jpg)
Wydajność
Korelacje, przetwarzanie
Strumień danych (~300/sec)
![Page 8: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/8.jpg)
Dane historyczne
Audyt Raporty
Reagowanie na zmiany
![Page 9: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/9.jpg)
Raporty
http://www.flickr.com/photos/littlejohncollection/4325397661/sizes/l/in/photostream/
![Page 10: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/10.jpg)
UI?
![Page 11: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/11.jpg)
CRUD
![Page 12: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/12.jpg)
Zadania
![Page 13: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/13.jpg)
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
![Page 14: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/14.jpg)
CQS
Command
Query
![Page 15: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/15.jpg)
CQRS
Komenda
Zapytanie
Model domeny
Model odczytu
![Page 16: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/16.jpg)
Event Sourcing
CommentAdded
OrderConfirmed
![Page 17: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/17.jpg)
Event Sourcing
![Page 18: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/18.jpg)
CQRS + ES
Komenda
Zapytanie
Model domeny
Model odczytu
Zdarzenia
![Page 19: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/19.jpg)
Architektura z lotu ptaka
![Page 20: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/20.jpg)
domena
log zdarzeń raporty
modele odczytu
korelacje
![Page 21: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/21.jpg)
A co jeśli...?
![Page 22: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/22.jpg)
Będzie zbyt dużo zdarzeń?
Snapshoty
Zmieni się format zdarzeń?
Migracja logu danych
Modyfikacje w locie
![Page 23: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/23.jpg)
Model do odczytu "popsuje się"?
Odtwarzamy z logu zdarzeń
Potrzebujemy nowych modeli?
Tworzymy z logu zdarzeń
![Page 24: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/24.jpg)
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
![Page 25: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/25.jpg)
domena
log zdarzeń raporty
modele odczytu
korelacje
![Page 26: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/26.jpg)
dane w pamięci
jeden wątek
docelowo: użycie STM
Repozytorium
![Page 27: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/27.jpg)
Teraz będzie Scala
Zamknij oczy i myśl o AngliiJavie
![Page 28: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/28.jpg)
![Page 29: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/29.jpg)
Domena funkcyjna
?
![Page 30: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/30.jpg)
Agregat
reguły biznesowe
transakcjespójność
dostęp
zachowanie
![Page 31: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/31.jpg)
Niezmienialne agregaty
?
![Page 32: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/32.jpg)
Event Sourcing
![Page 33: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/33.jpg)
domena
log zdarzeń raporty
modele odczytu
korelacje
![Page 34: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/34.jpg)
class Update[A,E] { val aggregate : A val event : E}
trait EventHandler { def handle(update:Update[_,_])}
![Page 35: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/35.jpg)
Zachowanie a zmiana stanu
NO BEHAVIOR in state changing methods, no conditional logic, no exceptions
- Greg Young
![Page 36: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/36.jpg)
class Order { //zachowania def confirm() : List[DomainEvent] def addLine(productId:UID): List[DomainEvent]
//brak logiki def apply(event:DomainEvent):Order }
![Page 37: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/37.jpg)
Encje jako ADT - case class
case class Order(id:String, lines:List[OrderLine]){
def addOrderLine(line:OrderLine)= def confirm() = ... def cancel() = ...}
![Page 38: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/38.jpg)
Bonus - FSM
![Page 39: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/39.jpg)
Bonus - FSM
case class PreOrder(...) extends Order {def confirm : OrderConfirmed
def apply(e:OrderConfirmed) : ConfirmedOrder
}case class ConfirmedOrder(..) extends Order { def send() : OrderSent}
![Page 40: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/40.jpg)
Bonus - testy
When did you read test to assure sth hasn't happened?
- Greg Young
![Page 41: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/41.jpg)
Bonus - testy
//givenAlarmCreated, AlarmAckonwledged
//whenclearAlarm
//thenAcknowledgedAlarmCleared
![Page 42: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/42.jpg)
Walidacja
![Page 43: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/43.jpg)
Walidacja
if (total < 0) {throw ValidationError("Not enough");
}
if (total < 0) {validationErrors.add("Not enough");
}if (validationErrors.size() > 0) {
fail()...}
![Page 44: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/44.jpg)
Walidacja
if (total < 0) {throw ValidationError("Not enough");
}
if (total < 0) {validationErrors.add("Not enough");
}if (validationErrors.size() > 0) {
fail()...}
![Page 45: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/45.jpg)
Walidacja bez wyjątków
Never throw an exception of my own- Joel Spolsky
![Page 46: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/46.jpg)
Walidacje - przykład kodu
Funktor walidacjiscalaz.Validation[Error,_]
//przykładowa metodanonEmpty(val:String) : Validation[Error,String]
![Page 47: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/47.jpg)
Walidacje - przykład kodu
?Error("empty.name")
for { name <- nonEmpty(command.name)
![Page 48: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/48.jpg)
Walidacje - przykład kodu
for { name <- nonEmpty(command.name) size <- geq(0, command.size)
?Error("negative.size")
![Page 49: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/49.jpg)
Walidacje - przykład kodu
for { name <- nonEmpty(command.name) size <- geq(0, command.size)} yield addCompany(name,size)
?Error("bad.company")
![Page 50: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/50.jpg)
Walidacje - przykład kodu
for { name <- nonEmpty(command.name) size <- geq(0, command.size)} yield addCompany(name,size)
?CompanyAdded(...)
![Page 51: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/51.jpg)
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
![Page 52: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/52.jpg)
Domena funkcyjna
● Oddzielenie stanu od zachowania
● Testowalność
● Dostęp do technik funkcyjnych
● Zrównoleglanie
![Page 53: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/53.jpg)
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
![Page 54: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/54.jpg)
domena
log zdarzeń raporty
modele odczytu
korelacje
![Page 55: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/55.jpg)
Aktor
skrzynka
wiadomości
stan
hierarchie
![Page 56: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/56.jpg)
![Page 57: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/57.jpg)
Akka
![Page 58: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/58.jpg)
Co ze spójnością w GUI?
![Page 59: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/59.jpg)
Akka - komponowanie przyszłości
actorRef ! message
actorRef ? message : Future
![Page 60: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/60.jpg)
Akka - komponowanie przyszłości
![Page 61: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/61.jpg)
Akka - komponowanie przyszłości
![Page 62: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/62.jpg)
Akka - komponowanie przyszłości
![Page 63: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/63.jpg)
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
![Page 64: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/64.jpg)
domena
log zdarzeń raporty
modele odczytu
korelacje
![Page 65: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/65.jpg)
Modele odczytu
Don’t pay an American developer to do this!!!
- Greg Young
![Page 66: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/66.jpg)
SELECT * from CUSTOMER LEFT JOIN PRODUCT ...
![Page 67: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/67.jpg)
Skąd brać dane?
WarehouseView
DeviceConnected
![Page 68: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/68.jpg)
Skąd brać dane - zdarzenia
OldWarhouseId
WarehouseView
![Page 69: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/69.jpg)
Skąd brać dane - inny model
WarehouseView
DeviceView
![Page 70: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/70.jpg)
Skąd brać dane - ten sam model
WarehouseView
deviceIds
![Page 71: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/71.jpg)
● System
● CQRS,ES - z lotu ptaka
● (Funkcyjny) model domeny
● Komunikacja
● Konsumenci zdarzeń
● Czy to się opłaca?
![Page 72: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/72.jpg)
każdy System jest bardziej CRUDowy
niż się to początkowo wydaje
![Page 73: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/73.jpg)
CQRS na poziomie autonomicznych serwisów
![Page 74: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/74.jpg)
czy klient rozumie koszty i ograniczenia
?
![Page 75: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/75.jpg)
EventSourcing
![Page 76: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/76.jpg)
EventSourcing+
Scala+
Akka
![Page 77: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/77.jpg)
EventSourcing+
Scala+
Akka
![Page 78: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/78.jpg)
Literatura
● Debasish Gosh - http://debasishg.blogspot.com/
● Martin Krasser - http://krasserm.blogspot.com/
● Greg Young● Udi Dahan - http://www.udidahan.com
![Page 79: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/79.jpg)
Dzięki
![Page 80: CQRS, ES, Scala @ Confitura 2012](https://reader033.fdocuments.us/reader033/viewer/2022051608/5446568bafaf9f65178b45ff/html5/thumbnails/80.jpg)
● 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