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

What's hot (20)

PDF
HBase HUG Presentation: Avoiding Full GCs with MemStore-Local Allocation Buffers
Cloudera, Inc.
 
PPTX
React hooks
Ramy ElBasyouni
 
PDF
C* Summit 2013: The World's Next Top Data Model by Patrick McFadin
DataStax Academy
 
PPTX
Apache Kafka - Patterns anti-patterns
Florent Ramiere
 
PPTX
Mongo DB 성능최적화 전략
Jin wook
 
PPSX
Spring - Part 1 - IoC, Di and Beans
Hitesh-Java
 
PPTX
MongoDB
nikhil2807
 
PDF
Kubernetes in Docker
Docker, Inc.
 
PDF
Producer Performance Tuning for Apache Kafka
Jiangjie Qin
 
ODP
Introduction to MongoDB
Dineesha Suraweera
 
PPTX
Spring Boot+Kafka: the New Enterprise Platform
VMware Tanzu
 
PDF
A Visual Introduction to Event Sourcing and CQRS by Lorenzo Nicora
OpenCredo
 
PDF
Introduction to MongoDB
Mike Dirolf
 
PPTX
Kafka Tutorial - Introduction to Apache Kafka (Part 1)
Jean-Paul Azar
 
PDF
ksqlDB: A Stream-Relational Database System
confluent
 
PDF
Apache Kafka in the Airline, Aviation and Travel Industry
Kai Wähner
 
PDF
Spark, ou comment traiter des données à la vitesse de l'éclair
Alexis Seigneurin
 
PDF
Deep Dive into Stateful Stream Processing in Structured Streaming with Tathag...
Databricks
 
PPTX
Netflix Data Pipeline With Kafka
Allen (Xiaozhong) Wang
 
PDF
Kafka Streams State Stores Being Persistent
confluent
 
HBase HUG Presentation: Avoiding Full GCs with MemStore-Local Allocation Buffers
Cloudera, Inc.
 
React hooks
Ramy ElBasyouni
 
C* Summit 2013: The World's Next Top Data Model by Patrick McFadin
DataStax Academy
 
Apache Kafka - Patterns anti-patterns
Florent Ramiere
 
Mongo DB 성능최적화 전략
Jin wook
 
Spring - Part 1 - IoC, Di and Beans
Hitesh-Java
 
MongoDB
nikhil2807
 
Kubernetes in Docker
Docker, Inc.
 
Producer Performance Tuning for Apache Kafka
Jiangjie Qin
 
Introduction to MongoDB
Dineesha Suraweera
 
Spring Boot+Kafka: the New Enterprise Platform
VMware Tanzu
 
A Visual Introduction to Event Sourcing and CQRS by Lorenzo Nicora
OpenCredo
 
Introduction to MongoDB
Mike Dirolf
 
Kafka Tutorial - Introduction to Apache Kafka (Part 1)
Jean-Paul Azar
 
ksqlDB: A Stream-Relational Database System
confluent
 
Apache Kafka in the Airline, Aviation and Travel Industry
Kai Wähner
 
Spark, ou comment traiter des données à la vitesse de l'éclair
Alexis Seigneurin
 
Deep Dive into Stateful Stream Processing in Structured Streaming with Tathag...
Databricks
 
Netflix Data Pipeline With Kafka
Allen (Xiaozhong) Wang
 
Kafka Streams State Stores Being Persistent
confluent
 

Viewers also liked (8)

PPTX
CQRS Evolved - CQRS + Akka.NET
David Hoerster
 
PDF
Event-sourced architectures with Akka
Sander Mak (@Sander_Mak)
 
PDF
Event Sourcing in less than 20 minutes - With Akka and Java 8
J On The Beach
 
PPTX
Moving Beyond Lambda Architectures with Apache Kudu
Cloudera, Inc.
 
ODP
Event sourcing with Eventuate
Knoldus Inc.
 
PDF
CQRS and Event Sourcing for Java Developers
Markus Eisele
 
PPTX
Going Serverless with CQRS on AWS
Anton Udovychenko
 
PDF
codecentric AG: CQRS and Event Sourcing Applications with Cassandra
DataStax Academy
 
CQRS Evolved - CQRS + Akka.NET
David Hoerster
 
Event-sourced architectures with Akka
Sander Mak (@Sander_Mak)
 
Event Sourcing in less than 20 minutes - With Akka and Java 8
J On The Beach
 
Moving Beyond Lambda Architectures with Apache Kudu
Cloudera, Inc.
 
Event sourcing with Eventuate
Knoldus Inc.
 
CQRS and Event Sourcing for Java Developers
Markus Eisele
 
Going Serverless with CQRS on AWS
Anton Udovychenko
 
codecentric AG: CQRS and Event Sourcing Applications with Cassandra
DataStax Academy
 
Ad

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

PDF
DDDing Tools = Akka Persistence
Konrad Malawski
 
PDF
[Tokyo Scala User Group] Akka Streams & Reactive Streams (0.7)
Konrad Malawski
 
PDF
Implementing Server Side Data Synchronization for Mobile Apps
Michele Orselli
 
PDF
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich
SmartLogic
 
PDF
Resilient Applications with Akka Persistence - Scaladays 2014
Björn Antonsson
 
PDF
JVMLS 2016. Coroutines in Kotlin
Andrey Breslav
 
PDF
HBase RowKey design for Akka Persistence
Konrad Malawski
 
PDF
RubyConf Portugal 2014 - Why ruby must go!
Gautam Rege
 
PDF
Go Concurrency
jgrahamc
 
PDF
Event-sourced architectures with Akka - Sander Mak
NLJUG
 
PDF
London Cassandra Meetup 10/23: Apache Cassandra at British Gas Connected Home...
DataStax Academy
 
PPT
Going crazy with Node.JS and CakePHP
Mariano Iglesias
 
PDF
Nodejs Explained with Examples
Gabriele Lana
 
PDF
Nodejsexplained 101116115055-phpapp02
Sunny Gupta
 
PDF
Functional Reactive Programming / Compositional Event Systems
Leonardo Borges
 
PDF
Async – react, don't wait
Johan Andrén
 
KEY
Socket applications
João Moura
 
PPT
JS everywhere 2011
Oleg Podsechin
 
PDF
Reactive Stream Processing with Akka Streams
Konrad Malawski
 
PDF
Trying Continuous Delivery - pyconjp 2012
Toru Furukawa
 
DDDing Tools = Akka Persistence
Konrad Malawski
 
[Tokyo Scala User Group] Akka Streams & Reactive Streams (0.7)
Konrad Malawski
 
Implementing Server Side Data Synchronization for Mobile Apps
Michele Orselli
 
DC |> Elixir Meetup - Going off the Rails into Elixir - Dan Ivovich
SmartLogic
 
Resilient Applications with Akka Persistence - Scaladays 2014
Björn Antonsson
 
JVMLS 2016. Coroutines in Kotlin
Andrey Breslav
 
HBase RowKey design for Akka Persistence
Konrad Malawski
 
RubyConf Portugal 2014 - Why ruby must go!
Gautam Rege
 
Go Concurrency
jgrahamc
 
Event-sourced architectures with Akka - Sander Mak
NLJUG
 
London Cassandra Meetup 10/23: Apache Cassandra at British Gas Connected Home...
DataStax Academy
 
Going crazy with Node.JS and CakePHP
Mariano Iglesias
 
Nodejs Explained with Examples
Gabriele Lana
 
Nodejsexplained 101116115055-phpapp02
Sunny Gupta
 
Functional Reactive Programming / Compositional Event Systems
Leonardo Borges
 
Async – react, don't wait
Johan Andrén
 
Socket applications
João Moura
 
JS everywhere 2011
Oleg Podsechin
 
Reactive Stream Processing with Akka Streams
Konrad Malawski
 
Trying Continuous Delivery - pyconjp 2012
Toru Furukawa
 
Ad

More from Konrad Malawski (20)

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

Recently uploaded (20)

PDF
Arcee AI - building and working with small language models (06/25)
Julien SIMON
 
PDF
CloudStack GPU Integration - Rohit Yadav
ShapeBlue
 
PDF
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
PDF
UiPath on Tour London Community Booth Deck
UiPathCommunity
 
PDF
Upskill to Agentic Automation 2025 - Kickoff Meeting
DianaGray10
 
PPTX
Extensions Framework (XaaS) - Enabling Orchestrate Anything
ShapeBlue
 
PPTX
Simplifying End-to-End Apache CloudStack Deployment with a Web-Based Automati...
ShapeBlue
 
PDF
TrustArc Webinar - Data Privacy Trends 2025: Mid-Year Insights & Program Stra...
TrustArc
 
PDF
How a Code Plagiarism Checker Protects Originality in Programming
Code Quiry
 
PDF
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
PDF
Generative AI in Healthcare: Benefits, Use Cases & Challenges
Lily Clark
 
PDF
Novus Safe Lite- What is Novus Safe Lite.pdf
Novus Hi-Tech
 
PDF
Trading Volume Explained by CIFDAQ- Secret Of Market Trends
CIFDAQ
 
PDF
Rethinking Security Operations - Modern SOC.pdf
Haris Chughtai
 
PDF
The Past, Present & Future of Kenya's Digital Transformation
Moses Kemibaro
 
PPTX
python advanced data structure dictionary with examples python advanced data ...
sprasanna11
 
PDF
Novus-Safe Pro: Brochure-What is Novus Safe Pro?.pdf
Novus Hi-Tech
 
PDF
Lecture A - AI Workflows for Banking.pdf
Dr. LAM Yat-fai (林日辉)
 
PDF
NewMind AI Weekly Chronicles – July’25, Week III
NewMind AI
 
PDF
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 
Arcee AI - building and working with small language models (06/25)
Julien SIMON
 
CloudStack GPU Integration - Rohit Yadav
ShapeBlue
 
Building Resilience with Digital Twins : Lessons from Korea
SANGHEE SHIN
 
UiPath on Tour London Community Booth Deck
UiPathCommunity
 
Upskill to Agentic Automation 2025 - Kickoff Meeting
DianaGray10
 
Extensions Framework (XaaS) - Enabling Orchestrate Anything
ShapeBlue
 
Simplifying End-to-End Apache CloudStack Deployment with a Web-Based Automati...
ShapeBlue
 
TrustArc Webinar - Data Privacy Trends 2025: Mid-Year Insights & Program Stra...
TrustArc
 
How a Code Plagiarism Checker Protects Originality in Programming
Code Quiry
 
State-Dependent Conformal Perception Bounds for Neuro-Symbolic Verification
Ivan Ruchkin
 
Generative AI in Healthcare: Benefits, Use Cases & Challenges
Lily Clark
 
Novus Safe Lite- What is Novus Safe Lite.pdf
Novus Hi-Tech
 
Trading Volume Explained by CIFDAQ- Secret Of Market Trends
CIFDAQ
 
Rethinking Security Operations - Modern SOC.pdf
Haris Chughtai
 
The Past, Present & Future of Kenya's Digital Transformation
Moses Kemibaro
 
python advanced data structure dictionary with examples python advanced data ...
sprasanna11
 
Novus-Safe Pro: Brochure-What is Novus Safe Pro?.pdf
Novus Hi-Tech
 
Lecture A - AI Workflows for Banking.pdf
Dr. LAM Yat-fai (林日辉)
 
NewMind AI Weekly Chronicles – July’25, Week III
NewMind AI
 
NewMind AI Journal - Weekly Chronicles - July'25 Week II
NewMind AI
 

Akka persistence == event sourcing in 30 minutes