SlideShare a Scribd company logo
1 of 42
Download to read offline
Easy Scalability with Akka
Distribute your domain
Who?
● BoldRadius Solutions
○ boldradius.com
○ Typesafe Partner
○ Scala, Akka and Play specialists
○ Ottawa, Saskatoon, San Francisco, Boston, Chicago, Montreal, New
York, Toronto
● Michael Nash, VP Capabilities
○ @MichaelPNash
○ michael.nash@boldradius.com
What?
What will I know in the next 45 minutes?
● Distributed Domain-Driven Design
○ What is it, and how does it apply to project?
○ What is CQRS and ES, and how to they relate?
● Akka
○ How to do DDDD and CQRS/ES with Akka
○ What is different in a DDDD Akka project, and why?
○ How does this kind of project scaled compared to a
“normal” project, even with Akka?
Scalability
● Scalability is not performance
○ Performance increasing reduces response time
○ Scalability increasing improves capacity in relation to
added resources
● Scalability can be...
○ Vertical (Scaling “up”): Bigger box (or boxes)
○ Horizontal (Scaling “out”): More boxes
● The Actor model for the JVM
○ A share-nothing distributed message-
driven compute model
○ Scala and Java APIs
● Like Erlang/Elixir processes, only better
○ Distributed by design, local is an optimization
CQRS and ES
● Command Query Responsibility Segregation
○ Separate the read and write paths of the problem
● Event-Sourcing
○ State is built from a journal of events
● One doesn’t need the other, but they can be
combined very effectively
Event Sourcing
CQRS
Domain
● Your application’s domain is the part that
relates to the problem
● The rest of your application is infrastructure,
basically
● If you have a Payroll app, then Employees,
Benefits, Pay Stubs are in your domain
DDDD
● Domain-Driven Design (DDD) is not only for
Object-Oriented Systems
● Object-Oriented and Functional are not an
either-or choice, or at odds with each other
● Distributed Domain Driven Design is a
natural fit with the actor model
Traditional Domain Instances
Non-Distributed Domain
● Basic CRUD (Create, Read, Update, Delete)
● Writes and reads to same database
○ Always consistent
● Scaled via multiple identical replicas
○ and load balancing on HTTP
● Bottlenecks on contention
○ reads and writes interfere with each other
When we scale the traditional model…
● We add multiple servers
○ so there’s more than one copy of each domain
instance (potentially)
● Each must read state every time
○ from the shared resource (the database)
● Each must write (fully) to the same shared
resource to avoid conflict
● Scalability is limited
With Akka and DDDD
● Wouldn’t it be great if you could just keep
your domain instances in memory?
● But how to recover from its volatile nature:
an event journal!
But I have too many instances!
● Only active domain instances are in memory
● Instances activate and passivate as needed
Activation and Passivation
Ingredients
● Akka - Scala API
○ with Clustering and Persistence modules
● Cassandra
○ And the DataStax driver
● Typesafe Activator
○ For our template
What’s Different?
● Domain object instances are transient, and
memory-resident when in use
● Reads and writes don’t contend for
resources
● Cluster can be grown until domain instances
per node = 1
What do you get?
● Scalability
○ Add nodes to handle higher load on the fly
● Failover
○ No single point of failure or contention
○ Instances can be created anywhere as needed
● Simplicity
○ Build your app without having to worry about scalability
later
Consider your own domain
● Consider writes independently from reads
○ Are they really the same even now?
● Deployment structure is critical to get all
benefits safely
Example Applications
Online Auctions: Two implementations
● Users place bids for online auctions
● Most code shared
● Identical APIs
● Identical deploy structure, same machines,
same number of nodes
● One CRUD, One CQRS/DDDD
CRUD Actor
● Uses Akka
● Receives request
● Writes to datastore directly
CRUD Actor
CQRS/DDDD Actor
● In-memory state
● Recovers state from journal on startup
● Uses become to change states
● Passivates on timeout
Test Setup
3 Cassandra Nodes (Clustered)
3 Akka processing Nodes (Clustered)
1 Front-end (Part of the Akka cluster)
All Small AWS Instances
100 simultaneous users
100 auctions
Two minutes of bidding
Simulation
Response Time Distribution
CRUD CQRS
Scale is different!
Response Time Percentiles: CRUD
Response Time Percentiles: CQRS
Note that the scale is different!
Requests per Second: CRUD
Requests per Second: CQRS
Scale is different!
Total Requests/Responses in 2 mins
CRUD: 75,991
CQRS: 199,357
Adding more nodes...
● CRUD version
○ Contention increases
○ Diminishing benefit to adding more nodes
○ Tuning doesn’t help much
● CQRS version
○ No contention
○ Near-linear benefit until number of nodes = number
of auctions
○ Tuning is very important (type of nodes too…)
Activator Template
https://github.com/boldradius/akka-dddd-template
Add your own domain!
Q & A
michael.nash@boldradius.com
Further Reading

More Related Content

More from BoldRadius Solutions

Introduction to the Typesafe Reactive Platform
Introduction to the Typesafe Reactive PlatformIntroduction to the Typesafe Reactive Platform
Introduction to the Typesafe Reactive PlatformBoldRadius Solutions
 
Towards Reliable Lookups - Scala By The Bay
Towards Reliable Lookups - Scala By The BayTowards Reliable Lookups - Scala By The Bay
Towards Reliable Lookups - Scala By The BayBoldRadius Solutions
 
How You Convince Your Manager To Adopt Scala.js in Production
How You Convince Your Manager To Adopt Scala.js in ProductionHow You Convince Your Manager To Adopt Scala.js in Production
How You Convince Your Manager To Adopt Scala.js in ProductionBoldRadius Solutions
 
Why Not Make the Transition from Java to Scala?
Why Not Make the Transition from Java to Scala?Why Not Make the Transition from Java to Scala?
Why Not Make the Transition from Java to Scala?BoldRadius Solutions
 
String Interpolation in Scala | BoldRadius
String Interpolation in Scala | BoldRadiusString Interpolation in Scala | BoldRadius
String Interpolation in Scala | BoldRadiusBoldRadius Solutions
 
Value Classes in Scala | BoldRadius
Value Classes in Scala | BoldRadiusValue Classes in Scala | BoldRadius
Value Classes in Scala | BoldRadiusBoldRadius Solutions
 
Scala Days Highlights | BoldRadius
Scala Days Highlights | BoldRadiusScala Days Highlights | BoldRadius
Scala Days Highlights | BoldRadiusBoldRadius Solutions
 
What Are For Expressions in Scala?
What Are For Expressions in Scala?What Are For Expressions in Scala?
What Are For Expressions in Scala?BoldRadius Solutions
 
Domain Driven Design Through Onion Architecture
Domain Driven Design Through Onion ArchitectureDomain Driven Design Through Onion Architecture
Domain Driven Design Through Onion ArchitectureBoldRadius Solutions
 
Scala Days 2014: Pitching Typesafe
Scala Days 2014: Pitching TypesafeScala Days 2014: Pitching Typesafe
Scala Days 2014: Pitching TypesafeBoldRadius Solutions
 
Demonstrating Case Classes in Scala
Demonstrating Case Classes in ScalaDemonstrating Case Classes in Scala
Demonstrating Case Classes in ScalaBoldRadius Solutions
 
Functional Programming - Worth the Effort
Functional Programming - Worth the EffortFunctional Programming - Worth the Effort
Functional Programming - Worth the EffortBoldRadius Solutions
 

More from BoldRadius Solutions (18)

Introduction to the Typesafe Reactive Platform
Introduction to the Typesafe Reactive PlatformIntroduction to the Typesafe Reactive Platform
Introduction to the Typesafe Reactive Platform
 
Partial Functions in Scala
Partial Functions in ScalaPartial Functions in Scala
Partial Functions in Scala
 
Towards Reliable Lookups - Scala By The Bay
Towards Reliable Lookups - Scala By The BayTowards Reliable Lookups - Scala By The Bay
Towards Reliable Lookups - Scala By The Bay
 
How You Convince Your Manager To Adopt Scala.js in Production
How You Convince Your Manager To Adopt Scala.js in ProductionHow You Convince Your Manager To Adopt Scala.js in Production
How You Convince Your Manager To Adopt Scala.js in Production
 
Why Not Make the Transition from Java to Scala?
Why Not Make the Transition from Java to Scala?Why Not Make the Transition from Java to Scala?
Why Not Make the Transition from Java to Scala?
 
String Interpolation in Scala | BoldRadius
String Interpolation in Scala | BoldRadiusString Interpolation in Scala | BoldRadius
String Interpolation in Scala | BoldRadius
 
Value Classes in Scala | BoldRadius
Value Classes in Scala | BoldRadiusValue Classes in Scala | BoldRadius
Value Classes in Scala | BoldRadius
 
Scala Days Highlights | BoldRadius
Scala Days Highlights | BoldRadiusScala Days Highlights | BoldRadius
Scala Days Highlights | BoldRadius
 
What Are For Expressions in Scala?
What Are For Expressions in Scala?What Are For Expressions in Scala?
What Are For Expressions in Scala?
 
Domain Driven Design Through Onion Architecture
Domain Driven Design Through Onion ArchitectureDomain Driven Design Through Onion Architecture
Domain Driven Design Through Onion Architecture
 
Pattern Matching in Scala
Pattern Matching in ScalaPattern Matching in Scala
Pattern Matching in Scala
 
What are Sealed Classes in Scala?
What are Sealed Classes in Scala?What are Sealed Classes in Scala?
What are Sealed Classes in Scala?
 
Scala: Collections API
Scala: Collections APIScala: Collections API
Scala: Collections API
 
Immutability in Scala
Immutability in ScalaImmutability in Scala
Immutability in Scala
 
Scala Days 2014: Pitching Typesafe
Scala Days 2014: Pitching TypesafeScala Days 2014: Pitching Typesafe
Scala Days 2014: Pitching Typesafe
 
Code Brevity in Scala
Code Brevity in ScalaCode Brevity in Scala
Code Brevity in Scala
 
Demonstrating Case Classes in Scala
Demonstrating Case Classes in ScalaDemonstrating Case Classes in Scala
Demonstrating Case Classes in Scala
 
Functional Programming - Worth the Effort
Functional Programming - Worth the EffortFunctional Programming - Worth the Effort
Functional Programming - Worth the Effort
 

Recently uploaded

Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...chiefasafspells
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburgmasabamasaba
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Bert Jan Schrijver
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfonteinmasabamasaba
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastPapp Krisztián
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyviewmasabamasaba
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in sowetomasabamasaba
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2
 

Recently uploaded (20)

Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
Love witchcraft +27768521739 Binding love spell in Sandy Springs, GA |psychic...
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
WSO2CON 2024 - Cloud Native Middleware: Domain-Driven Design, Cell-Based Arch...
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
Abortion Pill Prices Tembisa [(+27832195400*)] 🏥 Women's Abortion Clinic in T...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
Abortion Pills In Pretoria ](+27832195400*)[ 🏥 Women's Abortion Clinic In Pre...
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 

Easy Scalability with Akka - Scala Days 2015

  • 1. Easy Scalability with Akka Distribute your domain
  • 2. Who? ● BoldRadius Solutions ○ boldradius.com ○ Typesafe Partner ○ Scala, Akka and Play specialists ○ Ottawa, Saskatoon, San Francisco, Boston, Chicago, Montreal, New York, Toronto ● Michael Nash, VP Capabilities ○ @MichaelPNash ○ michael.nash@boldradius.com
  • 3. What? What will I know in the next 45 minutes? ● Distributed Domain-Driven Design ○ What is it, and how does it apply to project? ○ What is CQRS and ES, and how to they relate? ● Akka ○ How to do DDDD and CQRS/ES with Akka ○ What is different in a DDDD Akka project, and why? ○ How does this kind of project scaled compared to a “normal” project, even with Akka?
  • 4. Scalability ● Scalability is not performance ○ Performance increasing reduces response time ○ Scalability increasing improves capacity in relation to added resources ● Scalability can be... ○ Vertical (Scaling “up”): Bigger box (or boxes) ○ Horizontal (Scaling “out”): More boxes
  • 5. ● The Actor model for the JVM ○ A share-nothing distributed message- driven compute model ○ Scala and Java APIs ● Like Erlang/Elixir processes, only better ○ Distributed by design, local is an optimization
  • 6. CQRS and ES ● Command Query Responsibility Segregation ○ Separate the read and write paths of the problem ● Event-Sourcing ○ State is built from a journal of events ● One doesn’t need the other, but they can be combined very effectively
  • 9. Domain ● Your application’s domain is the part that relates to the problem ● The rest of your application is infrastructure, basically ● If you have a Payroll app, then Employees, Benefits, Pay Stubs are in your domain
  • 10. DDDD ● Domain-Driven Design (DDD) is not only for Object-Oriented Systems ● Object-Oriented and Functional are not an either-or choice, or at odds with each other ● Distributed Domain Driven Design is a natural fit with the actor model
  • 12. Non-Distributed Domain ● Basic CRUD (Create, Read, Update, Delete) ● Writes and reads to same database ○ Always consistent ● Scaled via multiple identical replicas ○ and load balancing on HTTP ● Bottlenecks on contention ○ reads and writes interfere with each other
  • 13. When we scale the traditional model… ● We add multiple servers ○ so there’s more than one copy of each domain instance (potentially) ● Each must read state every time ○ from the shared resource (the database) ● Each must write (fully) to the same shared resource to avoid conflict ● Scalability is limited
  • 14.
  • 15. With Akka and DDDD ● Wouldn’t it be great if you could just keep your domain instances in memory? ● But how to recover from its volatile nature: an event journal!
  • 16.
  • 17. But I have too many instances! ● Only active domain instances are in memory ● Instances activate and passivate as needed
  • 19. Ingredients ● Akka - Scala API ○ with Clustering and Persistence modules ● Cassandra ○ And the DataStax driver ● Typesafe Activator ○ For our template
  • 20. What’s Different? ● Domain object instances are transient, and memory-resident when in use ● Reads and writes don’t contend for resources ● Cluster can be grown until domain instances per node = 1
  • 21. What do you get? ● Scalability ○ Add nodes to handle higher load on the fly ● Failover ○ No single point of failure or contention ○ Instances can be created anywhere as needed ● Simplicity ○ Build your app without having to worry about scalability later
  • 22. Consider your own domain ● Consider writes independently from reads ○ Are they really the same even now? ● Deployment structure is critical to get all benefits safely
  • 23. Example Applications Online Auctions: Two implementations ● Users place bids for online auctions ● Most code shared ● Identical APIs ● Identical deploy structure, same machines, same number of nodes ● One CRUD, One CQRS/DDDD
  • 24. CRUD Actor ● Uses Akka ● Receives request ● Writes to datastore directly
  • 26. CQRS/DDDD Actor ● In-memory state ● Recovers state from journal on startup ● Uses become to change states ● Passivates on timeout
  • 27.
  • 28.
  • 29.
  • 30. Test Setup 3 Cassandra Nodes (Clustered) 3 Akka processing Nodes (Clustered) 1 Front-end (Part of the Akka cluster) All Small AWS Instances 100 simultaneous users 100 auctions Two minutes of bidding
  • 32. Response Time Distribution CRUD CQRS Scale is different!
  • 34. Response Time Percentiles: CQRS Note that the scale is different!
  • 36. Requests per Second: CQRS Scale is different!
  • 37. Total Requests/Responses in 2 mins CRUD: 75,991 CQRS: 199,357
  • 38. Adding more nodes... ● CRUD version ○ Contention increases ○ Diminishing benefit to adding more nodes ○ Tuning doesn’t help much ● CQRS version ○ No contention ○ Near-linear benefit until number of nodes = number of auctions ○ Tuning is very important (type of nodes too…)
  • 39.