SlideShare a Scribd company logo
Akka persistence	

(message sourcing in 30 minutes)
Konrad 'ktoso' Malawski	

Scalar 2014 @ Warsaw, PL
Konrad `@ktosopl` Malawski
typesafe.com	

geecon.org	

Java.pl / KrakowScala.pl	

sckrk.com / meetup.com/Paper-Cup @ London	

GDGKrakow.pl 	

meetup.com/Lambda-Lounge-Krakow
Konrad `@ktosopl` Malawski
typesafe.com	

geecon.org	

Java.pl / KrakowScala.pl	

sckrk.com / meetup.com/Paper-Cup @ London	

GDGKrakow.pl 	

meetup.com/Lambda-Lounge-Krakow
Konrad `@ktosopl` Malawski
typesafe.com	

geecon.org	

Java.pl / KrakowScala.pl	

sckrk.com / meetup.com/Paper-Cup @ London	

GDGKrakow.pl 	

meetup.com/Lambda-Lounge-Krakow
Konrad `@ktosopl` Malawski
typesafe.com	

geecon.org	

Java.pl / KrakowScala.pl	

sckrk.com / meetup.com/Paper-Cup @ London	

GDGKrakow.pl 	

meetup.com/Lambda-Lounge-Krakow
Konrad `@ktosopl` Malawski
typesafe.com	

geecon.org	

Java.pl / KrakowScala.pl	

sckrk.com / meetup.com/Paper-Cup @ London	

GDGKrakow.pl 	

meetup.com/Lambda-Lounge-Krakow
Konrad `@ktosopl` Malawski
typesafe.com	

geecon.org	

Java.pl / KrakowScala.pl	

sckrk.com / meetup.com/Paper-Cup @ London	

GDGKrakow.pl 	

meetup.com/Lambda-Lounge-Krakow
hAkker @
mainly by	

Martin Krasser
!
!
(as contractor for Typesafe)	

!
inspired by:
akka-persistence
https://github.com/krasserm
https://github.com/eligosource/eventsourced
dependencies
libraryDependencies ++= Seq(!
"com.typesafe.akka" %% “akka-actor" % "2.3.0",!
"com.typesafe.akka" %% "akka-persistence-experimental" % "2.3.0"!
)
Show of hands!
Show of hands!
Show of hands!
Show of hands!
sourcing styles
Command Sourcing Event Sourcing
msg: DoThing
msg persisted before receive
imperative, “do the thing”
business logic change,
can be reflected in reaction
Processor
sourcing styles
Command Sourcing Event Sourcing
msg: DoThing msg: ThingDone
msg persisted before receive
commands converted to events,
must be manually persisted
imperative, “do the thing” past tense, “happened”
business logic change,
can be reflected in reaction
business logic change,
won’t change previous events
Processor EventsourcedProcessor
Plain Actors
count: 0
!
!
Actor
count: 0
!
!
Actor
An Actor that keeps count of messages it processed
count: 0
!
!
Actor
An Actor that keeps count of messages it processed
count: 0
!
!
Actor
An Actor that keeps count of messages it processed
Let’s send 2 messages to it
count: 0
!
!
Actor
An Actor that keeps count of messages it processed
Let’s send 2 messages to it
(it’s “commands”)
Actor
!
!
class Counter extends Actor {!
var count = 0!


def receive = {!
case _ => count += 1!
}!
}
count: 0
!
!
Actor
count: 0
!
!
Actor
count: 1
!
!
Actor
count: 1
!
!
Actor
crash!
Actor
crash!
Actor
restart
count: 0
!
!
Actor
restart
count: 0
!
!
Actor
restarted
count: 1
!
!
Actor
restarted
count: 1
!
!
Actor
restarted
count: 1
!
!
wrong!	

expected count == 2!
Actor
restarted
Processor
var count = 0
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
Journal	

(DB)	

!
!
!
Processor
var count = 0
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
var count = 0
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
var count = 0
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
var count = 1
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
var count = 1
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
var count = 1
!
def processorId = “a”
!
crash!
Journal	

(DB)	

!
!
!
Processor
Journal	

(DB)	

!
!
!
Processor
restart
Journal	

(DB)	

!
!
!
Processor
var count = 0
!
def processorId = “a”
!
restart
Journal	

(DB)	

!
!
!
Processor
var count = 0
!
def processorId = “a”
!
replay!
restart
Journal	

(DB)	

!
!
!
Processor
var count = 0
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
var count = 0
!
def processorId = “a”
!
replay!
Journal	

(DB)	

!
!
!
Processor
var count = 1
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
var count = 1
!
def processorId = “a”
!
replay!
Journal	

(DB)	

!
!
!
Processor
var count = 1
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
var count = 2
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Processor
var count = 2
!
def processorId = “a”
!
yay!
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case Persistent(payload, seqNr) =>!
// payload already persisted!
count += 1!
}!
}
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case Persistent(payload, seqNr) =>!
// payload already persisted!
count += 1!
}!
}
counter ! Persistent(payload)
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case Persistent(payload, seqNr) =>!
// payload already persisted!
count += 1!
}!
}
counter ! Persistent(payload)
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case Persistent(payload, seqNr) =>!
// payload already persisted!
count += 1!
}!
}
counter ! Persistent(payload)
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case Persistent(payload, seqNr) =>!
// payload already persisted!
count += 1!
}!
}
counter ! Persistent(payload)
is already persisted!
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case Persistent(payload, seqNr) =>!
// payload already persisted!
count += 1!
}!
}
counter ! Persistent(payload)
sequenceNr
(generated by akka)
is already persisted!
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case notPersisted =>!
// will not replay this msg!!
count += 1!
}!
}
counter ! payload
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case notPersisted =>!
// will not replay this msg!!
count += 1!
}!
}
counter ! payload
won’t persist
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case notPersisted =>!
// will not replay this msg!!
count += 1!
}!
}
counter ! payload
won’t persist
won’t replay
Processor
import akka.persistence._!
!
class CounterProcessor extends Processor {!
var count = 0!


override val processorId = "counter"!
!
def receive = {!
case Persistent(payload, seqNr) =>!
// payload already persisted!
count += 1!
!
case notPersistentMsg =>!
// msg not persisted - like in normal Actor!
count += 1!
}!
}
Processor
Upsides
• Persistent Command Sourcing “out of the box”	

• Pretty simple, persist handled for you	

• Once you get the msg, it’s persisted	

• Pluggable Journals (HBase, Cassandra, Mongo, …)	

• Can replay to given seqNr (post-mortem etc!)
Processor
Downsides
• Exposes Persistent() to Actors who talk to you	

• No room for validation before persisting	

• There’s one Model, we act on the incoming msg	

• Lower throughput than plain Actor (limited by DB)
EventsourcedProcessor
EventsourcedProcessor	

(longer name == more flexibility)
;-)
super quick domain modeling!
super quick domain modeling!
sealed trait Command!
case class ManyCommand(nums: List[Int]) extends Command
Commands - input from user,“send emails”, not persisted
super quick domain modeling!
sealed trait Command!
case class ManyCommand(nums: List[Int]) extends Command
Commands - input from user,“send emails”, not persisted
sealed trait Event!
case class AddOneEvent(num: Int) extends Event!
Events - business events emitted by the processor, persisted
super quick domain modeling!
sealed trait Command!
case class ManyCommand(nums: List[Int]) extends Command
Commands - input from user,“send emails”, not persisted
case class State(count: Int) {!
def updated(more: Int) = State(count + more)!
}
State - internal actor state, kept in var
sealed trait Event!
case class AddOneEvent(num: Int) extends Event!
Events - business events emitted by the processor, persisted
var count = 0
!
def processorId = “a”
!
EventsourcedProcessor
!
!
Journal
C1
var count = 0
!
def processorId = “a”
!
EventsourcedProcessor
Command
!
!
Journal
C1
var count = 0
!
def processorId = “a”
!
EventsourcedProcessor
!
!
Journal
C1
var count = 0
!
def processorId = “a”
!
EventsourcedProcessor
!
!
Journal
C1
Generate
Events
C1
var count = 0
!
def processorId = “a”
!
EventsourcedProcessor
!
!
Journal
E1
C1
var count = 0
!
def processorId = “a”
!
EventsourcedProcessor
!
!
Journal
E1
Event
C1
var count = 0
!
def processorId = “a”
!
EventsourcedProcessor
!
!
Journal
E1
C1
var count = 0
!
def processorId = “a”
!
EventsourcedProcessor
!
!
Journal
E1
ACK
“persisted”
C1
var count = 1
!
def processorId = “a”
!
EventsourcedProcessor
!
!
Journal
E1
E1
C1
var count = 1
!
def processorId = “a”
!
EventsourcedProcessor
!
!
Journal
E1
E1
“Apply”
event
EventsourcedProcessor
class MultiCounter extends EventsourcedProcessor {!
!
var state = State(count = 0)!
!
def updateState(e: Event): State = {!
case event: AddOneEvent => state.updated(event.num)!
}!
!
// API:!
!
def receiveCommand = ??? // TODO!
!
def receiveRecover = ??? // TODO!
!
}!
EventsourcedProcessor
def receiveCommand = {!
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }!
!
case command: Command =>!
persist(AddOneEvent(command)) { state = updateState(_) }!
}
EventsourcedProcessor
def receiveCommand = {!
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }!
!
case command: Command =>!
persist(AddOneEvent(command)) { state = updateState(_) }!
}
EventsourcedProcessor
def receiveCommand = {!
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }!
!
case command: Command =>!
persist(AddOneEvent(command)) { state = updateState(_) }!
}
EventsourcedProcessor
def receiveCommand = {!
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }!
!
case command: Command =>!
persist(AddOneEvent(command)) { state = updateState(_) }!
}
async persist
that event
EventsourcedProcessor
def receiveCommand = {!
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }!
!
case command: Command =>!
persist(AddOneEvent(command)) { state = updateState(_) }!
}
async persist
that event
async called after
successful persist
EventsourcedProcessor
def receiveCommand = {!
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }!
!
case command: Command =>!
persist(AddOneEvent(command)) { state = updateState(_) }!
}
async persist
that event
async called after
successful persist
It is guaranteed that no new commands will be received by a processor
between a call to `persist` and the execution of its `handler`.
EventsourcedProcessor
def receiveCommand = {!
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }!
!
case command: Command =>!
persist(AddOneEvent(command)) { state = updateState(_) }!
}
EventsourcedProcessor
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }
EventsourcedProcessor
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }
“style fix”
EventsourcedProcessor
case ManyCommand(many) =>!
for (event <- many map AddOneEvent)!
persist(event) { state = updateState(_) }
case ManyCommand(many) =>!
persist(many map AddOneEvent) { state = updateState(_) }
“style fix”
Eventsourced, recovery
/** MUST NOT SIDE-EFFECT! */!
def receiveRecover = {!
case replayedEvent: Event => !
updateState(replayedEvent)!
}
Eventsourced, snapshots
Eventsourced, snapshots
/** MUST NOT SIDE-EFFECT! */!
def receiveRecover = {!
case SnapshotOffer(meta, snapshot: State) => !
this.state = state!
!
case replayedEvent: Event => !
updateState(replayedEvent)!
}
Eventsourced, snapshots
/** MUST NOT SIDE-EFFECT! */!
def receiveRecover = {!
case SnapshotOffer(meta, snapshot: State) => !
this.state = state!
!
case replayedEvent: Event => !
updateState(replayedEvent)!
}
Eventsourced, snapshots
/** MUST NOT SIDE-EFFECT! */!
def receiveRecover = {!
case SnapshotOffer(meta, snapshot: State) => !
this.state = state!
!
case replayedEvent: Event => !
updateState(replayedEvent)!
}
snapshot!?
how?
Eventsourced, snapshots
def receiveCommand = {!
case command: Command =>!
saveSnapshot(state) // async!!
}
/** MUST NOT SIDE-EFFECT! */!
def receiveRecover = {!
case SnapshotOffer(meta, snapshot: State) => !
this.state = state!
!
case replayedEvent: Event => !
updateState(replayedEvent)!
}
snapshot!?
how?
Snapshots
Snapshots	

(in SnapshotStore)
…sum of states…
Snapshots
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
state until [E8]
Snapshots
S8
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
state until [E8]
Snapshots
S8
!
!
Snapshot Store
snapshot!
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
state until [E8]
Snapshots
S8
!
!
Snapshot Store
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
S8
state until [E8]
Snapshots
S8
!
!
Snapshot Store
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
S8
crash!
Snapshots
!
!
Snapshot Store
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
S8
crash!
“bring me up-to-date!”
Snapshots
!
!
Snapshot Store
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
S8
restart!
“bring me up-to-date!”
Snapshots
!
!
Snapshot Store
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
S8
restart!
replay!
“bring me up-to-date!”
Snapshots
!
!
Snapshot Store
S8
restart!
replay!
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
“bring me up-to-date!”
Snapshots
!
!
Snapshot Store
S8
restart!
replay!
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
“bring me up-to-date!”
Snapshots
!
!
Snapshot Store
S8
restart!
replay!
S8
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
state until [E8]
Snapshots
!
!
Snapshot Store
S8
restart!
replay!
S8
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
state until [E8]
Snapshots
!
!
Snapshot Store
S8
S8
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
state until [E8]
Snapshots
!
!
Snapshot Store
S8
S8
!
!
Journal
E1 E2 E3 E4
E5 E6 E7 E8
We could delete these!
trait MySummer extends Processor {!
var nums: List[Int]!
var total: Int!
!
def receive = {!
case "snap" => saveSnapshot(total)!
case SaveSnapshotSuccess(metadata) => // ...!
case SaveSnapshotFailure(metadata, reason) => // ...!
}!
}!
Snapshots, save
trait MySummer extends Processor {!
var nums: List[Int]!
var total: Int!
!
def receive = {!
case "snap" => saveSnapshot(total)!
case SaveSnapshotSuccess(metadata) => // ...!
case SaveSnapshotFailure(metadata, reason) => // ...!
}!
}!
Snapshots, save
Async!
trait MySummer extends Processor {!
var nums: List[Int]!
var total: Int!
!
def receive = {!
case "snap" => saveSnapshot(total)!
case SaveSnapshotSuccess(metadata) => // ...!
case SaveSnapshotFailure(metadata, reason) => // ...!
}!
}!
Snapshots, success
trait MySummer extends Processor {!
var nums: List[Int]!
var total: Int!
!
def receive = {!
case "snap" => saveSnapshot(total)!
case SaveSnapshotSuccess(metadata) => // ...!
case SaveSnapshotFailure(metadata, reason) => // ...!
}!
}!
Snapshots, success
final case class SnapshotMetadata(!
processorId: String, sequenceNr: Long, !
timestamp: Long)
trait MySummer extends Processor {!
var nums: List[Int]!
var total: Int!
!
def receive = {!
case "snap" => saveSnapshot(total)!
case SaveSnapshotSuccess(metadata) => // ...!
case SaveSnapshotFailure(metadata, reason) => // ...!
}!
}!
Snapshots, success
Snapshot Recovery
class Counter extends Processor {!
var total = 0!
!
def receive = {!
case SnapshotOffer(metadata, snap: Int) => !
total = snap!
!
case Persistent(payload, sequenceNr) => // ...!
}!
}
Snapshots
Upsides
• Simple!
• Faster recovery (!)
• Allows to delete “older” events	

• “known state at point in time”
Snapshots
Downsides
• More logic to write	

• Maybe not needed if events replay “fast enough”	

• Possibly “yet another database” to pick	

• snapshots are different than events, may be big!
Views
Journal	

(DB)	

!
!
!
Views
!
Processor
!
def processorId = “a”
!
Journal	

(DB)	

!
!
!
Views
!
Processor
!
def processorId = “a”
!
!
View
!
def processorId = “a”
!
!
!
Journal	

(DB)	

!
!
!
Views
!
Processor
!
def processorId = “a”
!
!
View
!
def processorId = “a”
!
!
!
pooling
Journal	

(DB)	

!
!
!
Views
!
Processor
!
def processorId = “a”
!
!
View
!
def processorId = “a”
!
!
!
pooling
!
View
!
def processorId = “a”
!
!
!
pooling
Journal	

(DB)	

!
!
!
Views
!
Processor
!
def processorId = “a”
!
!
View
!
def processorId = “a”
!
!
!
pooling
!
View
!
def processorId = “a”
!
!
!
pooling
different ActorPath,
same processorId
View
class DoublingCounterProcessor extends View {!
var state = 0!


override val processorId = "counter"!
!
def receive = {!
case Persistent(payload, seqNr) =>!
// “state += 2 * payload” !
!
}!
}
Akka Persistence Plugins
Akka Persistence Plugins
Plugins are Community maintained!

(“not sure how production ready”)
http://akka.io/community/#journal_plugins
Akka Persistence Plugins
Plugins are Community maintained!

(“not sure how production ready”)
http://akka.io/community/#journal_plugins
• Journals - Cassandra, HBase, Mongo …
Akka Persistence Plugins
Plugins are Community maintained!

(“not sure how production ready”)
http://akka.io/community/#journal_plugins
• Journals - Cassandra, HBase, Mongo …
• SnapshotStores - Cassandra, HDFS, HBase, Mongo …
SnapshotStore Plugins!
http://akka.io/community/#journal_plugins
Links
• Official docs: http://doc.akka.io/docs/akka/2.3.0/scala/persistence.html	

• Patrik’s Slides & Webinar: http://www.slideshare.net/patriknw/akka-
persistence-webinar	

• Papers:	

• Sagas http://www.cs.cornell.edu/andru/cs711/2002fa/reading/
sagas.pdf	

• Life beyond Distributed Transactions: http://www-db.cs.wisc.edu/
cidr/cidr2007/papers/cidr07p15.pdf	

• Pics:	

• http://misaspuppy.deviantart.com/art/Messenger-s-Cutie-Mark-A-
Flying-Envelope-291040459
Mailing List
groups.google.com/forum/#!forum/akka-user
Links
Eric Evans - “the DDD book”	

http://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215	

!
!
!
!
!
!
VaughnVernon’s Book and Talk	

http://www.amazon.com/Implementing-Domain-Driven-Design-Vaughn-Vernon/dp/0321834577	

video: https://skillsmatter.com/skillscasts/4698-reactive-ddd-with-scala-and-akka	

!
!
!
ktoso @ typesafe.com
twitter: ktosopl	

github: ktoso	

blog: project13.pl	

team blog: letitcrash.com Scalar 2014 @ Warsaw, PL
!
Dzięki!	

Thanks!	

ありがとう!	

!
!
ping me:

More Related Content

PDF
Api presentation
PPTX
02 api gateway
PPTX
Android app development with kotlin heralding the future
PPT
Android seminar-presentation
PPTX
MLOps.pptx
PDF
Continuous Integration and Deployment Patterns for Magento
PPTX
What is an API
PDF
Microservice API Gateways with NGINX
Api presentation
02 api gateway
Android app development with kotlin heralding the future
Android seminar-presentation
MLOps.pptx
Continuous Integration and Deployment Patterns for Magento
What is an API
Microservice API Gateways with NGINX

What's hot (20)

PDF
Service Mesh with Apache Kafka, Kubernetes, Envoy, Istio and Linkerd
PPT
Workshop: API Management
PPTX
Android seminar ppt
PDF
Building APIs with the OpenApi Spec
PDF
API Monetization
PDF
C#.net interview questions for dynamics 365 ce crm developers
PPTX
Mobile Application Development: Hybrid, Native and Mobile Web Apps
PDF
API Gateway report
PDF
React.js Web Programlama
PPTX
Backstage at CNCF Madison.pptx
PPT
MVC ppt presentation
PPTX
FULL stack -> MEAN stack
PDF
OpenAPI 3.0, And What It Means for the Future of Swagger
PPTX
Resource description framework
PPTX
Introduction to C# Programming
PDF
TOSCA - Topology and Orchestration Specification for Cloud Applications
PDF
Why Microservice
PPTX
What is an API Gateway?
PDF
CI/DC in MLOps by J.B. Hunt
Service Mesh with Apache Kafka, Kubernetes, Envoy, Istio and Linkerd
Workshop: API Management
Android seminar ppt
Building APIs with the OpenApi Spec
API Monetization
C#.net interview questions for dynamics 365 ce crm developers
Mobile Application Development: Hybrid, Native and Mobile Web Apps
API Gateway report
React.js Web Programlama
Backstage at CNCF Madison.pptx
MVC ppt presentation
FULL stack -> MEAN stack
OpenAPI 3.0, And What It Means for the Future of Swagger
Resource description framework
Introduction to C# Programming
TOSCA - Topology and Orchestration Specification for Cloud Applications
Why Microservice
What is an API Gateway?
CI/DC in MLOps by J.B. Hunt
Ad

Viewers also liked (8)

PPTX
CQRS Evolved - CQRS + Akka.NET
PDF
Event-sourced architectures with Akka
PDF
Event Sourcing in less than 20 minutes - With Akka and Java 8
PPTX
Moving Beyond Lambda Architectures with Apache Kudu
ODP
Event sourcing with Eventuate
PDF
CQRS and Event Sourcing for Java Developers
PPTX
Going Serverless with CQRS on AWS
PDF
codecentric AG: CQRS and Event Sourcing Applications with Cassandra
CQRS Evolved - CQRS + Akka.NET
Event-sourced architectures with Akka
Event Sourcing in less than 20 minutes - With Akka and Java 8
Moving Beyond Lambda Architectures with Apache Kudu
Event sourcing with Eventuate
CQRS and Event Sourcing for Java Developers
Going Serverless with CQRS on AWS
codecentric AG: CQRS and Event Sourcing Applications with Cassandra
Ad

Similar to Akka persistence == event sourcing in 30 minutes (20)

PDF
DDDing Tools = Akka Persistence
PDF
[Tokyo Scala User Group] Akka Streams & Reactive Streams (0.7)
PDF
Implementing Server Side Data Synchronization for Mobile Apps
PDF
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich
PDF
Resilient Applications with Akka Persistence - Scaladays 2014
PDF
JVMLS 2016. Coroutines in Kotlin
PDF
HBase RowKey design for Akka Persistence
PDF
RubyConf Portugal 2014 - Why ruby must go!
PDF
Go Concurrency
PDF
Event-sourced architectures with Akka - Sander Mak
PDF
London Cassandra Meetup 10/23: Apache Cassandra at British Gas Connected Home...
PPT
Going crazy with Node.JS and CakePHP
PDF
Nodejs Explained with Examples
PDF
Nodejsexplained 101116115055-phpapp02
PDF
Functional Reactive Programming / Compositional Event Systems
PDF
Async – react, don't wait
PDF
Reactive Streams / Akka Streams - GeeCON Prague 2014
KEY
Socket applications
PPT
JS everywhere 2011
PDF
Reactive Stream Processing with Akka Streams
DDDing Tools = Akka Persistence
[Tokyo Scala User Group] Akka Streams & Reactive Streams (0.7)
Implementing Server Side Data Synchronization for Mobile Apps
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich
Resilient Applications with Akka Persistence - Scaladays 2014
JVMLS 2016. Coroutines in Kotlin
HBase RowKey design for Akka Persistence
RubyConf Portugal 2014 - Why ruby must go!
Go Concurrency
Event-sourced architectures with Akka - Sander Mak
London Cassandra Meetup 10/23: Apache Cassandra at British Gas Connected Home...
Going crazy with Node.JS and CakePHP
Nodejs Explained with Examples
Nodejsexplained 101116115055-phpapp02
Functional Reactive Programming / Compositional Event Systems
Async – react, don't wait
Reactive Streams / Akka Streams - GeeCON Prague 2014
Socket applications
JS everywhere 2011
Reactive Stream Processing with Akka Streams

More from Konrad Malawski (20)

PDF
Networks and Types - the Future of Akka @ ScalaDays NYC 2018
PDF
Akka Typed (quick talk) - JFokus 2018
PDF
ScalaSwarm 2017 Keynote: Tough this be madness yet theres method in't
PDF
State of Akka 2017 - The best is yet to come
PDF
Building a Reactive System with Akka - Workshop @ O'Reilly SAConf NYC
PDF
Akka-chan's Survival Guide for the Streaming World
PDF
Reactive integrations with Akka Streams
PDF
Not Only Streams for Akademia JLabs
PDF
Reactive Streams, j.u.concurrent & Beyond!
PDF
End to End Akka Streams / Reactive Streams - from Business to Socket
PDF
The Cloud-natives are RESTless @ JavaOne
PDF
Akka Streams in Action @ ScalaDays Berlin 2016
PDF
Krakow communities @ 2016
PDF
The things we don't see – stories of Software, Scala and Akka
PDF
100th SCKRK Meeting - best software engineering papers of 5 years of SCKRK
PDF
[Japanese] How Reactive Streams and Akka Streams change the JVM Ecosystem @ R...
PDF
Zen of Akka
PDF
How Reactive Streams & Akka Streams change the JVM Ecosystem
PDF
The Need for Async @ ScalaWorld
PDF
Fresh from the Oven (04.2015): Experimental Akka Typed and Akka Streams
Networks and Types - the Future of Akka @ ScalaDays NYC 2018
Akka Typed (quick talk) - JFokus 2018
ScalaSwarm 2017 Keynote: Tough this be madness yet theres method in't
State of Akka 2017 - The best is yet to come
Building a Reactive System with Akka - Workshop @ O'Reilly SAConf NYC
Akka-chan's Survival Guide for the Streaming World
Reactive integrations with Akka Streams
Not Only Streams for Akademia JLabs
Reactive Streams, j.u.concurrent & Beyond!
End to End Akka Streams / Reactive Streams - from Business to Socket
The Cloud-natives are RESTless @ JavaOne
Akka Streams in Action @ ScalaDays Berlin 2016
Krakow communities @ 2016
The things we don't see – stories of Software, Scala and Akka
100th SCKRK Meeting - best software engineering papers of 5 years of SCKRK
[Japanese] How Reactive Streams and Akka Streams change the JVM Ecosystem @ R...
Zen of Akka
How Reactive Streams & Akka Streams change the JVM Ecosystem
The Need for Async @ ScalaWorld
Fresh from the Oven (04.2015): Experimental Akka Typed and Akka Streams

Recently uploaded (20)

PDF
NewMind AI Monthly Chronicles - July 2025
PDF
KodekX | Application Modernization Development
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Machine learning based COVID-19 study performance prediction
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
[발표본] 너의 과제는 클라우드에 있어_KTDS_김동현_20250524.pdf
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PPTX
Big Data Technologies - Introduction.pptx
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Cloud computing and distributed systems.
NewMind AI Monthly Chronicles - July 2025
KodekX | Application Modernization Development
Mobile App Security Testing_ A Comprehensive Guide.pdf
Network Security Unit 5.pdf for BCA BBA.
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
20250228 LYD VKU AI Blended-Learning.pptx
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Machine learning based COVID-19 study performance prediction
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
[발표본] 너의 과제는 클라우드에 있어_KTDS_김동현_20250524.pdf
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
MYSQL Presentation for SQL database connectivity
Per capita expenditure prediction using model stacking based on satellite ima...
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Big Data Technologies - Introduction.pptx
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Spectral efficient network and resource selection model in 5G networks
Cloud computing and distributed systems.

Akka persistence == event sourcing in 30 minutes