SlideShare a Scribd company logo
DDDing with Akka Persistence	

!
Konrad 'ktoso' Malawski	

GeeCON 2014 @ Kraków, PL
Konrad `@ktosopl` Malawski
Konrad `@ktosopl` Malawski
hAkker @
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:
https://github.com/krasserm
https://github.com/eligosource/eventsourced
akka-persistence
Dependencies
libraryDependencies ++= Seq(!
"com.typesafe.akka" %% “akka-actor" % "2.3.1",!
"com.typesafe.akka" %% "akka-persistence-experimental" % "2.3.1"!
)
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
Compared to “Good ol’ CRUD Model”
state
“Mutable Record”
state
=
apply(es)
“Series of Events”
Actors
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
crash!
Actor
crash!
Actor
restart
count: 0
!
!
Actor
restart
count: 0
!
!
Actor
restarted
count: 1
!
!
Actor
restarted
count: 1
!
!
wrong!	

expected count == 2!
Actor
restarted
Consistency Boundary
Consistency Boundary
equals
Async Boundary
Boundaries
actor
actor
async
Boundaries
aggregate
aggregate
“eventual”
A.K.A. async
Business rules
aggregate
Any rule that spans AGGREGATES will not be expected to be up-
to-date at all times.Through event processing, batch processing, or
other update mechanisms, other dependencies can be resolved
within some specific time. [Evans, p. 128]
aggregate
consistent
consistent
eventually consistent
Let’s open the toolbox
Processor
Processor
(command sourcing)
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”
!
crash!
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”
!
replay!
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”
!
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)
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: Event =>!
// 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)
Eventsourced Processor
Eventsourced Processor
(event sourcing)
super quick domain modeling!
sealed trait Command!
case class GiveMe(geeCoins: Int) extends Command!
case class TakeMy(geeCoins: Int) extends Command
Commands - what others “tell” us; not persisted
case class Wallet(geeCoins: Int) {!
def updated(diff: Int) = State(geeCoins + diff)!
}
State - reflection of a series of events
sealed trait Event!
case class BalanceChangedBy(geeCoins: Int) extends Event!
Events - reflect effects, past tense; persisted
var state = S0
!
def processorId = “a”
!
EventsourcedProcessor
Command
!
!
Journal
EventsourcedProcessor
var state = S0
!
def processorId = “a”
!
!
!
Journal
Generate
Events
EventsourcedProcessor
var state = S0
!
def processorId = “a”
!
!
!
Journal
Generate
Events
E1
EventsourcedProcessor
ACK
“persisted”
!
!
Journal
E1
var state = S0
!
def processorId = “a”
!
EventsourcedProcessor
“Apply”
event
!
!
Journal
E1
var state = S0
!
def processorId = “a”
!
E1
EventsourcedProcessor
!
!
Journal
E1
var state = S0
!
def processorId = “a”
!
E1
Okey!
EventsourcedProcessor
!
!
Journal
E1
var state = S0
!
def processorId = “a”
!
E1
Okey!
EventsourcedProcessor
!
!
Journal
E1
var state = S0
!
def processorId = “a”
!
E1
Ok, he got my $.
EventsourcedProcessor
class GeeCoinWallet extends EventsourcedProcessor {!
!
var state = Wallet(geeCoins = 0)!
!
def updateState(e: Event): State = {!
case BalanceChangedBy(geeCoins) => state updated geeCoins!
}!
!
// API:!
!
def receiveCommand = ??? // TODO!
!
def receiveRecover = ??? // TODO!
!
}!
EventsourcedProcessor
def receiveCommand = {!
!
case TakeMy(geeCoins) =>!
persist(BalanceChangedBy(geeCoins)) { changed =>!
state = updateState(changed) !
}!
!
!
!
!
!
!
}
async callback
EventsourcedProcessor
def receiveCommand = {!
!
!
!
!
!
!
case GiveMe(geeCoins) if geeCoins <= state.geeCoins =>!
persist(BalanceChangedBy(-geeCoins)) { changed =>!
state = updateState(changed) !
sender() ! TakeMy(-geeCoins)!
}!
}
Safe to access
sender here
async callback
EventsourcedProcessor
def receiveCommand = {!
!
!
!
!
!
!
case GiveMe(geeCoins) if geeCoins <= state.geeCoins =>!
persist(BalanceChangedBy(-geeCoins)) { changed =>!
state = updateState(changed) !
sender() ! TakeMy(-geeCoins)!
}!
}
Is this safe? It’s async! Races?!
Ordering guarantees
!
!
Journal
E1
var state = S0
!
def processorId = “a”
!
C1
C2
C3
Ordering guarantees
!
!
Journal
E1
var state = S0
!
def processorId = “a”
!
C1
C2
C3
Commands get “stashed” until
processing C1’s events are acted upon.
!
!
Journal
Ordering guarantees
var state = S0
!
def processorId = “a”
!
C1
C2
C3 E1
E2
E2E1
events get
applied in-order
C2
!
!
Journal
Ordering guarantees
var state = S0
!
def processorId = “a”
!
C3 E1 E2
E2E1
and the cycle
repeats
Eventsourced, recovery
/** MUST NOT SIDE-EFFECT! */!
def receiveRecover = {!
case replayedEvent: Event => !
updateState(replayedEvent)!
}
exact same code for all events!
Snapshots
Snapshots
(in SnapshotStore)
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?
…sum of states…
Snapshots
!
!
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
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!
replay!
“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
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
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
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”
!
!
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
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
Extra: Channels
Extras: Channel
Features:
• de-duplication
Extras: PersistentChannel
Features:
• “at least once delivery”
Try it now
Try it now() // !
typesafe.com/activator
akka-sample-persistence-scala
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”	

Talk:“Acknowledging CAP at the Root”	

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

!
!
ktoso @ typesafe.com
twitter: ktosopl	

github: ktoso	

blog: project13.pl	

team blog: letitcrash.com GeeCON 2014 @ Kraków, PL
!
Dzięki!
Thanks!
ありがとう!
!
!
ping me:
©Typesafe 2014 – All Rights Reserved

More Related Content

PDF
Akka persistence == event sourcing in 30 minutes
PDF
Event-sourced architectures with Akka
PDF
Akka persistence webinar
PDF
Distributed Consensus A.K.A. "What do we eat for lunch?"
PDF
Resilient Applications with Akka Persistence - Scaladays 2014
PDF
HBase RowKey design for Akka Persistence
PDF
Event-sourced architectures with Akka - Sander Mak
PDF
Fresh from the Oven (04.2015): Experimental Akka Typed and Akka Streams
Akka persistence == event sourcing in 30 minutes
Event-sourced architectures with Akka
Akka persistence webinar
Distributed Consensus A.K.A. "What do we eat for lunch?"
Resilient Applications with Akka Persistence - Scaladays 2014
HBase RowKey design for Akka Persistence
Event-sourced architectures with Akka - Sander Mak
Fresh from the Oven (04.2015): Experimental Akka Typed and Akka Streams

What's hot (20)

PDF
Sane Sharding with Akka Cluster
PDF
Reactive Streams / Akka Streams - GeeCON Prague 2014
PDF
A dive into akka streams: from the basics to a real-world scenario
PDF
Streaming all the things with akka streams
PDF
[Tokyo Scala User Group] Akka Streams & Reactive Streams (0.7)
PDF
Reactive stream processing using Akka streams
PDF
Async - react, don't wait - PingConf
PDF
Need for Async: Hot pursuit for scalable applications
PDF
Reactive streams processing using Akka Streams
PDF
Next generation actors with Akka
PDF
Networks and Types - the Future of Akka @ ScalaDays NYC 2018
PDF
Akka streams - Umeå java usergroup
PDF
Asynchronous stream processing with Akka Streams
PDF
CLS & asyncListener: asynchronous observability for Node.js
PDF
Buiilding reactive distributed systems with Akka
PDF
Networks and types - the future of Akka
PDF
The Need for Async @ ScalaWorld
PPTX
Akka Actor presentation
PDF
Reactive Streams: Handling Data-Flow the Reactive Way
PDF
2014 akka-streams-tokyo-japanese
Sane Sharding with Akka Cluster
Reactive Streams / Akka Streams - GeeCON Prague 2014
A dive into akka streams: from the basics to a real-world scenario
Streaming all the things with akka streams
[Tokyo Scala User Group] Akka Streams & Reactive Streams (0.7)
Reactive stream processing using Akka streams
Async - react, don't wait - PingConf
Need for Async: Hot pursuit for scalable applications
Reactive streams processing using Akka Streams
Next generation actors with Akka
Networks and Types - the Future of Akka @ ScalaDays NYC 2018
Akka streams - Umeå java usergroup
Asynchronous stream processing with Akka Streams
CLS & asyncListener: asynchronous observability for Node.js
Buiilding reactive distributed systems with Akka
Networks and types - the future of Akka
The Need for Async @ ScalaWorld
Akka Actor presentation
Reactive Streams: Handling Data-Flow the Reactive Way
2014 akka-streams-tokyo-japanese
Ad

Viewers also liked (20)

PDF
The Cloud-natives are RESTless @ JavaOne
PDF
100th SCKRK Meeting - best software engineering papers of 5 years of SCKRK
PDF
The things we don't see – stories of Software, Scala and Akka
PDF
[Japanese] How Reactive Streams and Akka Streams change the JVM Ecosystem @ R...
PDF
Akka Streams in Action @ ScalaDays Berlin 2016
PDF
How Reactive Streams & Akka Streams change the JVM Ecosystem
PDF
End to End Akka Streams / Reactive Streams - from Business to Socket
PDF
Reactive Streams, j.u.concurrent & Beyond!
PDF
Reactive Stream Processing with Akka Streams
PDF
Zen of Akka
PDF
Reactive integrations with Akka Streams
PDF
Akka-chan's Survival Guide for the Streaming World
KEY
Eventually Consistent Data Structures (from strangeloop12)
PDF
Krakow communities @ 2016
PPTX
Developing an Akka Edge4-5
PDF
scalaphx-akka-http
PPTX
Scala + Akka + ning/async-http-client - Vancouver Scala meetup February 2015
PDF
Codemotion akka persistence, cqrs%2 fes y otras siglas del montón
PDF
Open soucerers - jak zacząć swoją przygodę z open source
PDF
JavaOne 2013: Java 8 - The Good Parts
The Cloud-natives are RESTless @ JavaOne
100th SCKRK Meeting - best software engineering papers of 5 years of SCKRK
The things we don't see – stories of Software, Scala and Akka
[Japanese] How Reactive Streams and Akka Streams change the JVM Ecosystem @ R...
Akka Streams in Action @ ScalaDays Berlin 2016
How Reactive Streams & Akka Streams change the JVM Ecosystem
End to End Akka Streams / Reactive Streams - from Business to Socket
Reactive Streams, j.u.concurrent & Beyond!
Reactive Stream Processing with Akka Streams
Zen of Akka
Reactive integrations with Akka Streams
Akka-chan's Survival Guide for the Streaming World
Eventually Consistent Data Structures (from strangeloop12)
Krakow communities @ 2016
Developing an Akka Edge4-5
scalaphx-akka-http
Scala + Akka + ning/async-http-client - Vancouver Scala meetup February 2015
Codemotion akka persistence, cqrs%2 fes y otras siglas del montón
Open soucerers - jak zacząć swoją przygodę z open source
JavaOne 2013: Java 8 - The Good Parts
Ad

Similar to DDDing Tools = Akka Persistence (20)

PDF
Using Akka Persistence to build a configuration datastore
PDF
Event Sourcing - what could possibly go wrong?
PDF
Andrzej Ludwikowski - Event Sourcing - what could possibly go wrong? - Codemo...
PDF
Andrzej Ludwikowski - Event Sourcing - co może pójść nie tak?
PDF
Cassandra as an event sourced journal for big data analytics Cassandra Summit...
PDF
Cassandra as event sourced journal for big data analytics
PDF
Cake Solutions: Cassandra as event sourced journal for big data analytics
PDF
High-Performance event-sourced clustered Microservices with Play! & Akka @ Sc...
PDF
Scaling modern JVM applications with Akka toolkit
PDF
Building Stateful Microservices With Akka
PDF
Akka with Scala
PDF
Avoiding the Pit of Despair - Event Sourcing with Akka and Cassandra
PPTX
CQRS + ES with Scala and Akka
PDF
Event Sourcing using Akka on AWS
PPTX
Backends of the Future
PDF
Data in Motion: Streaming Static Data Efficiently 2
PPTX
Concurrency Constructs Overview
PDF
Lightbend Lagom: Microservices Just Right (Scala Days 2016 Berlin)
PPTX
Actors, akka, streams
PPT
Stefano Rocco, Roberto Bentivoglio - Scala in increasingly demanding environm...
Using Akka Persistence to build a configuration datastore
Event Sourcing - what could possibly go wrong?
Andrzej Ludwikowski - Event Sourcing - what could possibly go wrong? - Codemo...
Andrzej Ludwikowski - Event Sourcing - co może pójść nie tak?
Cassandra as an event sourced journal for big data analytics Cassandra Summit...
Cassandra as event sourced journal for big data analytics
Cake Solutions: Cassandra as event sourced journal for big data analytics
High-Performance event-sourced clustered Microservices with Play! & Akka @ Sc...
Scaling modern JVM applications with Akka toolkit
Building Stateful Microservices With Akka
Akka with Scala
Avoiding the Pit of Despair - Event Sourcing with Akka and Cassandra
CQRS + ES with Scala and Akka
Event Sourcing using Akka on AWS
Backends of the Future
Data in Motion: Streaming Static Data Efficiently 2
Concurrency Constructs Overview
Lightbend Lagom: Microservices Just Right (Scala Days 2016 Berlin)
Actors, akka, streams
Stefano Rocco, Roberto Bentivoglio - Scala in increasingly demanding environm...

More from Konrad Malawski (6)

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
Not Only Streams for Akademia JLabs
PDF
Scalding - the not-so-basics @ ScalaDays 2014
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
Not Only Streams for Akademia JLabs
Scalding - the not-so-basics @ ScalaDays 2014

Recently uploaded (20)

PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
[발표본] 너의 과제는 클라우드에 있어_KTDS_김동현_20250524.pdf
PDF
Advanced Soft Computing BINUS July 2025.pdf
PPT
Teaching material agriculture food technology
PPTX
MYSQL Presentation for SQL database connectivity
PDF
GamePlan Trading System Review: Professional Trader's Honest Take
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Approach and Philosophy of On baking technology
PPTX
Big Data Technologies - Introduction.pptx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
cuic standard and advanced reporting.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
[발표본] 너의 과제는 클라우드에 있어_KTDS_김동현_20250524.pdf
Advanced Soft Computing BINUS July 2025.pdf
Teaching material agriculture food technology
MYSQL Presentation for SQL database connectivity
GamePlan Trading System Review: Professional Trader's Honest Take
NewMind AI Weekly Chronicles - August'25 Week I
breach-and-attack-simulation-cybersecurity-india-chennai-defenderrabbit-2025....
Chapter 3 Spatial Domain Image Processing.pdf
Approach and Philosophy of On baking technology
Big Data Technologies - Introduction.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
solutions_manual_-_materials___processing_in_manufacturing__demargo_.pdf
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
NewMind AI Monthly Chronicles - July 2025
The Rise and Fall of 3GPP – Time for a Sabbatical?
cuic standard and advanced reporting.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Bridging biosciences and deep learning for revolutionary discoveries: a compr...

DDDing Tools = Akka Persistence