際際滷

際際滷Share a Scribd company logo
CQRS, ES, Scala?
Maciek Pr坦chniak
Topologia algebraiczna
TouK
Funktory
Monady
Drools
Camel
Servicemix
OSGi
Activiti
Scala
hocolim
CQRS, ES, Scala @ Confitura 2012
 System
 CQRS,ES - z lotu ptaka
 (Funkcyjny) model domeny
 Komunikacja
 Konsumenci zdarze
 Czy to si opaca?
Wymagania
Alarmy
czujniki
pracownicy
korelacje dugoterminowe
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 opaca?
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 jeli...?
Bdzie 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 opaca?
domena
log zdarze raporty
modele odczytu
korelacje
dane w pamici
jeden wtek
docelowo: u甜ycie STM
Repozytorium
Teraz bdzie Scala
Zamknij oczy i myl o Anglii
Javie
CQRS, ES, Scala @ Confitura 2012
Domena funkcyjna
?
Agregat
reguy
biznesowe
transakcje
sp坦jno
dostp
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 wyjtk坦w
Never throw an exception of my own
- Joel Spolsky
Walidacje - przykad kodu
Funktor walidacji
scalaz.Validation[Error,_]
//przykadowa metoda
nonEmpty(val:String) : Validation[Error,
String]
Walidacje - przykad kodu
?
Error("empty.name")
for {
name <- nonEmpty(command.name)
Walidacje - przykad kodu
for {
name <- nonEmpty(command.name)
size <- geq(0, command.size)
?
Error("negative.size")
Walidacje - przykad kodu
for {
name <- nonEmpty(command.name)
size <- geq(0, command.size)
} yield addCompany(name,size)
?
Error("bad.company")
Walidacje - przykad kodu
for {
name <- nonEmpty(command.name)
size <- geq(0, command.size)
} yield addCompany(name,size)
?
CompanyAdded(...)
Walidacja bez wyjtk坦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
 Dostp do technik funkcyjnych
 Zr坦wnoleglanie
 System
 CQRS,ES - z lotu ptaka
 (Funkcyjny) model domeny
 Komunikacja
 Konsumenci zdarze
 Czy to si opaca?
domena
log zdarze raporty
modele odczytu
korelacje
Aktor
skrzynka
wiadomoci
stan
hierarchie
CQRS, ES, Scala @ Confitura 2012
Akka
Co ze sp坦jnoci w GUI?
Akka - komponowanie 沿姻噛霞壊噛看界庄
actorRef ! message
actorRef ? message : Future
Akka - komponowanie 沿姻噛霞壊噛看界庄
Akka - komponowanie 沿姻噛霞壊噛看界庄
Akka - komponowanie 沿姻噛霞壊噛看界庄
 System
 CQRS,ES - z lotu ptaka
 (Funkcyjny) model domeny
 Komunikacja
 Konsumenci zdarze
 Czy to si opaca?
domena
log zdarze raporty
modele odczytu
korelacje
Modele odczytu
Dont pay an American developer to do
this!!!
- Greg Young
SELECT * from CUSTOMER LEFT JOIN
PRODUCT ...
Skd bra dane?
WarehouseView
DeviceConnected
Skd bra dane - zdarzenia
OldWarhouseId
WarehouseView
Skd bra dane - inny model
WarehouseView
DeviceView
Skd bra dane - ten sam model
WarehouseView
deviceIds
 System
 CQRS,ES - z lotu ptaka
 (Funkcyjny) model domeny
 Komunikacja
 Konsumenci zdarze
 Czy to si opaca?
ka甜dy System jest
bardziej CRUDowy
ni甜 si to pocztkowo wydaje
CQRS na poziomie
autonomicznych 壊艶姻敬庄壊坦敬
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
禽噛庄一庄
 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

More Related Content

CQRS, ES, Scala @ Confitura 2012