SlideShare ist ein Scribd-Unternehmen logo
1 von 132
Downloaden Sie, um offline zu lesen
Building Reactive Applications
with Akka & Java 8
Jonas Bonér
Typesafe
CTO & co-founder
Twitter: @jboner
The rules of the game
have changed
3
Apps in the 60s-90s
were written for
Apps today
are written for
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk Cheap disk
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk Cheap disk
Slow networks
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk Cheap disk
Slow networks Fast networks
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk Cheap disk
Slow networks Fast networks
Few concurrent users
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk Cheap disk
Slow networks Fast networks
Few concurrent users Lots of concurrent users
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk Cheap disk
Slow networks Fast networks
Few concurrent users Lots of concurrent users
Small data sets
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk Cheap disk
Slow networks Fast networks
Few concurrent users Lots of concurrent users
Small data sets Large data sets
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk Cheap disk
Slow networks Fast networks
Few concurrent users Lots of concurrent users
Small data sets Large data sets
Latency in seconds
3
Apps in the 60s-90s
were written for
Apps today
are written for
Single machines Clusters of machines
Single core processors Multicore processors
Expensive RAM Cheap RAM
Expensive disk Cheap disk
Slow networks Fast networks
Few concurrent users Lots of concurrent users
Small data sets Large data sets
Latency in seconds Latency in milliseconds
Cost Gravity is at Work
5
Cost Gravity is at Work
5
Reactive	
  Applications
Reactive applications share four traits
6
Reactive applications react to 

changes in the world around them.
Event-Driven
• Loosely coupled architecture, easier to extend, maintain, evolve
• Asynchronous and non-blocking
• Concurrent by design, immutable state
• Lower latency and higher throughput
8
“Clearly, the goal is to do these operations concurrently and 

non-blocking, so that entire blocks of seats or sections are not locked. 

We’re able to find and allocate seats under load in less than 20ms 

without trying very hard to achieve it.”	
  
Andrew Headrick, Platform Architect, Ticketfly
Introducing the Actor Model
10
The Actor Model
10
A computational model that embodies:
The Actor Model
10
A computational model that embodies:
✓ Processing
The Actor Model
10
A computational model that embodies:
✓ Processing
✓ Storage
The Actor Model
10
A computational model that embodies:
✓ Processing
✓ Storage
✓ Communication
The Actor Model
10
A computational model that embodies:
✓ Processing
✓ Storage
✓ Communication
Supports 3 axioms—when an Actor receives a message it can:
The Actor Model
10
A computational model that embodies:
✓ Processing
✓ Storage
✓ Communication
Supports 3 axioms—when an Actor receives a message it can:
1. Create new Actors
The Actor Model
10
A computational model that embodies:
✓ Processing
✓ Storage
✓ Communication
Supports 3 axioms—when an Actor receives a message it can:
1. Create new Actors
2. Send messages to Actors it knows
The Actor Model
10
A computational model that embodies:
✓ Processing
✓ Storage
✓ Communication
Supports 3 axioms—when an Actor receives a message it can:
1. Create new Actors
2. Send messages to Actors it knows
3. Designate how it should handle the next message it receives
The Actor Model
The essence of an actor
from Akka’s perspective
0. DEFINE
1. CREATE
2. SEND
3. BECOME
4. SUPERVISE
11
public class Greeting implements Serializable {
public final String who;
public Greeting(String who) { this.who = who; }
}
!
public class Greeter extends AbstractActor {{
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchAny(unknown -> {
println(“Unknown message " + unknown);
}).build());
}}
0. DEFINE
12
public class Greeting implements Serializable {
public final String who;
public Greeting(String who) { this.who = who; }
}
!
public class Greeter extends AbstractActor {{
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchAny(unknown -> {
println(“Unknown message " + unknown);
}).build());
}}
0. DEFINE
12
Define the message(s) the Actor
should be able to respond to
public class Greeting implements Serializable {
public final String who;
public Greeting(String who) { this.who = who; }
}
!
public class Greeter extends AbstractActor {{
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchAny(unknown -> {
println(“Unknown message " + unknown);
}).build());
}}
0. DEFINE
12
Define the message(s) the Actor
should be able to respond to
Define the Actor class
public class Greeting implements Serializable {
public final String who;
public Greeting(String who) { this.who = who; }
}
!
public class Greeter extends AbstractActor {{
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchAny(unknown -> {
println(“Unknown message " + unknown);
}).build());
}}
0. DEFINE
12
Define the message(s) the Actor
should be able to respond to
Define the Actor class
Define the Actor’s behavior
ActorSystem system = ActorSystem.create("MySystem");
!
ActorRef greeter =
system.actorOf(Props.create(Greeter.class), “greeter");
1. CREATE
ActorSystem system = ActorSystem.create("MySystem");
!
ActorRef greeter =
system.actorOf(Props.create(Greeter.class), “greeter");
1. CREATE
Create an Actor system
ActorSystem system = ActorSystem.create("MySystem");
!
ActorRef greeter =
system.actorOf(Props.create(Greeter.class), “greeter");
1. CREATE
Create an Actor system
Actor configuration
ActorSystem system = ActorSystem.create("MySystem");
!
ActorRef greeter =
system.actorOf(Props.create(Greeter.class), “greeter");
Give it a name
1. CREATE
Create an Actor system
Actor configuration
ActorSystem system = ActorSystem.create("MySystem");
!
ActorRef greeter =
system.actorOf(Props.create(Greeter.class), “greeter");
Give it a name
1. CREATE
Create the Actor
Create an Actor system
Actor configuration
ActorSystem system = ActorSystem.create("MySystem");
!
ActorRef greeter =
system.actorOf(Props.create(Greeter.class), “greeter");
Give it a name
1. CREATE
Create the Actor
You get an ActorRef back
Create an Actor system
Actor configuration
Guardian System Actor
Actors can form hierarchies
Guardian System Actor
system.actorOf(Props.create(Foo.class), “Foo”);
Actors can form hierarchies
Foo
Guardian System Actor
system.actorOf(Props.create(Foo.class), “Foo”);
Actors can form hierarchies
Foo
Guardian System Actor
context().actorOf(Props.create(A.class), “A”);
Actors can form hierarchies
A
Foo
Guardian System Actor
context().actorOf(Props.create(A.class), “A”);
Actors can form hierarchies
A
B
BarFoo
C
B
E
A
D
C
Guardian System Actor
Actors can form hierarchies
A
B
BarFoo
C
B
E
A
D
C
Guardian System Actor
Name resolution—like a file-system
A
B
BarFoo
C
B
E
A
D
C
/Foo
Guardian System Actor
Name resolution—like a file-system
A
B
BarFoo
C
B
E
A
D
C
/Foo
/Foo/A
Guardian System Actor
Name resolution—like a file-system
A
B
BarFoo
C
B
E
A
D
C
/Foo
/Foo/A
/Foo/A/B
Guardian System Actor
Name resolution—like a file-system
A
B
BarFoo
C
B
E
A
D
C
/Foo
/Foo/A
/Foo/A/B
/Foo/A/D
Guardian System Actor
Name resolution—like a file-system
2. SEND
16
greeter.tell(new Greeting("Charlie Parker”), sender);
2. SEND
16
Send the message asynchronously
greeter.tell(new Greeting("Charlie Parker”), sender);
2. SEND
16
Send the message asynchronously
greeter.tell(new Greeting("Charlie Parker”), sender);
Pass in the sender ActorRef
Bring it together
17
public class Greeting implements Serializable {
public final String who;
public Greeting(String who) { this.who = who; }
}
public class Greeter extends AbstractActor {{
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchAny(unknown -> {
println(“Unknown message " + unknown);
}).build());
}
}}
!
ActorSystem system = ActorSystem.create("MySystem");
ActorRef greeter = system.actorOf(Props.create(Greeter.class), “greeter");
greeter.tell(new Greeting(“Charlie Parker”));
3. BECOME
18
public class Greeter extends AbstractActor {
public Greeter {
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchEquals(“stop" -> {
!
!
!
!
}).build();
}
}
3. BECOME
18
public class Greeter extends AbstractActor {
public Greeter {
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchEquals(“stop" -> {
!
!
!
!
}).build();
}
}
context().become(ReceiveBuilder.
3. BECOME
18
public class Greeter extends AbstractActor {
public Greeter {
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchEquals(“stop" -> {
!
!
!
!
}).build();
}
}
Change the behavior
context().become(ReceiveBuilder.
3. BECOME
18
public class Greeter extends AbstractActor {
public Greeter {
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchEquals(“stop" -> {
!
!
!
!
}).build();
}
}
Change the behavior
context().become(ReceiveBuilder.
match(Greeting.class, m -> {
3. BECOME
18
public class Greeter extends AbstractActor {
public Greeter {
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchEquals(“stop" -> {
!
!
!
!
}).build();
}
}
Change the behavior
context().become(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Go Away!”);
3. BECOME
18
public class Greeter extends AbstractActor {
public Greeter {
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchEquals(“stop" -> {
!
!
!
!
}).build();
}
}
Change the behavior
context().become(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Go Away!”);
}).build());
3. BECOME
18
public class Greeter extends AbstractActor {
public Greeter {
receive(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Hello " + m.who);
}).
matchEquals(“stop" -> {
!
!
!
!
}).build();
}
}
Change the behavior
context().become(ReceiveBuilder.
match(Greeting.class, m -> {
println(“Go Away!”);
}).build());
Reactive applications are architected 

to handle failure at all levels.
Resilient
• Failure is embraced as a natural state in the app lifecycle
• Resilience is a first-class construct
• Failure is detected, isolated, and managed
• Applications self heal
20
“The Typesafe Reactive Platform helps us maintain a very 

aggressive development and deployment cycle, all in a fail-forward manner. 

It’s now the default choice for developing all new services.”	
  
Peter Hausel, VP Engineering, Gawker Media
Think Vending Machine
Coffee
Machine
Programmer
Think Vending Machine
Coffee
Machine
Programmer
Inserts coins
Think Vending Machine
Coffee
Machine
Programmer
Inserts coins
Add more coins
Think Vending Machine
Coffee
Machine
Programmer
Inserts coins
Gets coffee
Add more coins
Think Vending Machine
Coffee
Machine
Programmer
Think Vending Machine
Coffee
Machine
Programmer
Inserts coins
Think Vending Machine
Coffee
Machine
Programmer
Inserts coins
Think Vending Machine
Out of coffee beans error
Coffee
Machine
Programmer
Inserts coins
Think Vending Machine
Out of coffee beans error
Wrong
Coffee
Machine
Programmer
Inserts coins
Think Vending Machine
Coffee
Machine
Programmer
Inserts coins
Out of
coffee beans
error
Think Vending Machine
Coffee
Machine
Programmer
Service
Guy
Inserts coins
Out of
coffee beans
error
Think Vending Machine
Coffee
Machine
Programmer
Service
Guy
Inserts coins
Out of
coffee beans
error
Adds
more
beans
Think Vending Machine
Coffee
Machine
Programmer
Service
Guy
Inserts coins
Gets coffee
Out of
coffee beans
error
Adds
more
beans
Think Vending Machine
The Right Way
ServiceClient
The Right Way
ServiceClient
Request
The Right Way
ServiceClient
Request
Response
The Right Way
ServiceClient
Request
Response
Validation Error
The Right Way
ServiceClient
Request
Response
Validation Error
Application
Error
The Right Way
ServiceClient
Supervisor
Request
Response
Validation Error
Application
Error
The Right Way
ServiceClient
Supervisor
Request
Response
Validation Error
Application
Error
Manages
Failure
• Isolate the failure
• Compartmentalize
• Manage failure locally
• Avoid cascading failures
Use Bulkheads
• Isolate the failure
• Compartmentalize
• Manage failure locally
• Avoid cascading failures
Use Bulkheads
Enter Supervision
Enter Supervision
A
B
BarFoo
C
B
E
A
D
C
Automatic and mandatory supervision
Supervisor hierarchies
4. SUPERVISE
28
class Supervisor extends UntypedActor {
private SupervisorStrategy strategy = new OneForOneStrategy(
10, Duration.create(1, TimeUnit.MINUTES),
DeciderBuilder.
match(ArithmeticException.class, e -> resume()).
match(NullPointerException.class, e -> restart()).
matchAny( e -> escalate()).
build());
!
@Override public SupervisorStrategy supervisorStrategy() {
return strategy;
}
Every single actor has a default supervisor strategy.
Which is usually sufficient.
But it can be overridden.
4. SUPERVISE
28
class Supervisor extends UntypedActor {
private SupervisorStrategy strategy = new OneForOneStrategy(
10, Duration.create(1, TimeUnit.MINUTES),
DeciderBuilder.
match(ArithmeticException.class, e -> resume()).
match(NullPointerException.class, e -> restart()).
matchAny( e -> escalate()).
build());
!
@Override public SupervisorStrategy supervisorStrategy() {
return strategy;
}
ActorRef worker = context.actorOf(
Props.create(Worker.class), "worker");
public void onReceive(Object i) throws Exception {
…
}
}
Monitor through Death Watch
29
public class WatchActor extends AbstractActor {
final ActorRef child = context().actorOf(Props.empty(), "child");
!
public WatchActor() {
context().watch(child);
receive(ReceiveBuilder.
match(Terminated.class,
t -> t.actor().equals(child),
t -> {
… // handle termination
}).build()
);
}
}
Monitor through Death Watch
29
public class WatchActor extends AbstractActor {
final ActorRef child = context().actorOf(Props.empty(), "child");
!
public WatchActor() {
context().watch(child);
receive(ReceiveBuilder.
match(Terminated.class,
t -> t.actor().equals(child),
t -> {
… // handle termination
}).build()
);
}
}
Create a child actor
Monitor through Death Watch
29
public class WatchActor extends AbstractActor {
final ActorRef child = context().actorOf(Props.empty(), "child");
!
public WatchActor() {
context().watch(child);
receive(ReceiveBuilder.
match(Terminated.class,
t -> t.actor().equals(child),
t -> {
… // handle termination
}).build()
);
}
}
Create a child actor
Watch it
Monitor through Death Watch
29
public class WatchActor extends AbstractActor {
final ActorRef child = context().actorOf(Props.empty(), "child");
!
public WatchActor() {
context().watch(child);
receive(ReceiveBuilder.
match(Terminated.class,
t -> t.actor().equals(child),
t -> {
… // handle termination
}).build()
);
}
}
Create a child actor
Watch it
Handle termination message
Reactive applications scale up 

and down to meet demand.
Scalable
• Scalability and elasticity to embrace the Cloud
• Leverage all cores via asynchronous programming
• Clustered servers support joining and leaving of nodes
• More cost-efficient utilization of hardware
31
“Our traffic can increase by as much as 100x for 15 minutes each day. 

Until a couple of years ago, noon was a stressful time. 

Nowadays, it’s usually a non-event.”	
  
Eric Bowman, VP Architecture, Gilt Groupe
Define a router
32
ActorRef router = context().actorOf(
new RoundRobinPool(5).props(Props.create(Worker.class)),
“router”)
…or from config
33
akka.actor.deployment {
/service/router {
router = round-robin-pool
resizer {
lower-bound = 12
upper-bound = 15
}
}
}
Turn on clustering
34
akka {
actor {
provider = "akka.cluster.ClusterActorRefProvider"
...
}
  
cluster {
seed-nodes = [
“akka.tcp://ClusterSystem@127.0.0.1:2551",
“akka.tcp://ClusterSystem@127.0.0.1:2552"
]
 
auto-down = off
}
}
Use clustered routers
35
akka.actor.deployment	
  {	
  
	
  	
  /service/master	
  {	
  
	
  	
  	
  	
  router	
  =	
  consistent-­‐hashing-­‐pool	
  
	
  	
  	
  	
  nr-­‐of-­‐instances	
  =	
  100	
  
!
	
  	
  	
  	
  cluster	
  {	
  
	
  	
  	
  	
  	
  	
  enabled	
  =	
  on	
  
	
  	
  	
  	
  	
  	
  max-nr-of-instances-per-node = 3	
  
	
  	
  	
  	
  	
  	
  allow-­‐local-­‐routees	
  =	
  on	
  
	
  	
  	
  	
  	
  	
  use-­‐role	
  =	
  compute	
  
	
  	
  	
  	
  }	
  
	
  	
  }	
  
}
Use clustered routers
35
akka.actor.deployment	
  {	
  
	
  	
  /service/master	
  {	
  
	
  	
  	
  	
  router	
  =	
  consistent-­‐hashing-­‐pool	
  
	
  	
  	
  	
  nr-­‐of-­‐instances	
  =	
  100	
  
!
	
  	
  	
  	
  cluster	
  {	
  
	
  	
  	
  	
  	
  	
  enabled	
  =	
  on	
  
	
  	
  	
  	
  	
  	
  max-nr-of-instances-per-node = 3	
  
	
  	
  	
  	
  	
  	
  allow-­‐local-­‐routees	
  =	
  on	
  
	
  	
  	
  	
  	
  	
  use-­‐role	
  =	
  compute	
  
	
  	
  	
  	
  }	
  
	
  	
  }	
  
}
Or perhaps use an
AdaptiveLoadBalancingPool
• Cluster Membership
• Cluster Pub/Sub
• Cluster Leader
• Clustered Singleton
• Cluster Roles
• Cluster Sharding
36
Other Akka Cluster features
• Supports two different models:
• Command Sourcing — at least once
• Event Sourcing — at most once
• Great for implementing
• durable actors
• replication
• CQRS etc.
• Messages persisted to Journal and replayed on restart
37
Use Akka Persistence
38
Command Sourcing Event Sourcing
38
Command Sourcing Event Sourcing
write-ahead-log
38
Command Sourcing Event Sourcing
write-ahead-log derive events from a command
38
Command Sourcing Event Sourcing
write-ahead-log derive events from a command
same behavior during recovery
as normal operation
38
Command Sourcing Event Sourcing
write-ahead-log derive events from a command
same behavior during recovery
as normal operation
only state-changing behavior
during recovery
38
Command Sourcing Event Sourcing
write-ahead-log derive events from a command
same behavior during recovery
as normal operation
only state-changing behavior
during recovery
persisted before validation
38
Command Sourcing Event Sourcing
write-ahead-log derive events from a command
same behavior during recovery
as normal operation
only state-changing behavior
during recovery
persisted before validation events cannot fail
38
Command Sourcing Event Sourcing
write-ahead-log derive events from a command
same behavior during recovery
as normal operation
only state-changing behavior
during recovery
persisted before validation events cannot fail
allows retroactive changes to
the business logic
38
Command Sourcing Event Sourcing
write-ahead-log derive events from a command
same behavior during recovery
as normal operation
only state-changing behavior
during recovery
persisted before validation events cannot fail
allows retroactive changes to
the business logic
fixing the business logic will not
affect persisted events
38
Command Sourcing Event Sourcing
write-ahead-log derive events from a command
same behavior during recovery
as normal operation
only state-changing behavior
during recovery
persisted before validation events cannot fail
allows retroactive changes to
the business logic
fixing the business logic will not
affect persisted events
naming: represent intent,
imperative
38
Command Sourcing Event Sourcing
write-ahead-log derive events from a command
same behavior during recovery
as normal operation
only state-changing behavior
during recovery
persisted before validation events cannot fail
allows retroactive changes to
the business logic
fixing the business logic will not
affect persisted events
naming: represent intent,
imperative
naming: things that have
completed, verbs in past tense
Akka	
  Persistence	
  Webinar
Life beyond Distributed Transactions:
an Apostate’s Opinion
Position Paper by Pat Helland
“In general, application developers simply do not implement
large scalable applications assuming distributed transactions.”	
  
Pat Helland
http://www-­‐db.cs.wisc.edu/cidr/cidr2007/papers/cidr07p15.pdf
Akka	
  Persistence	
  Webinar
Consistency boundary
• Aggregate Root is the Transactional Boundary
• Strong consistency within an Aggregate
• Eventual consistency between Aggregates
• No limit to scalability
Akka	
  Persistence	
  Webinar
Domain Events
• Things that have completed, facts
• Immutable
• Verbs in past tense
• CustomerRelocated
• CargoShipped
• InvoiceSent
“State transitions are an important part of our problem
space and should be modeled within our domain.”	
  
Greg Young, 2008
Reactive applications enrich the user
experience with low latency response.
Responsive
• Real-time, engaging, rich and collaborative
• Create an open and ongoing dialog with users
• More efficient workflow; inspires a feeling of connectedness
• Fully Reactive enabling push instead of pull
43
“The move to these technologies is already paying off. 

Response times are down for processor intensive code–such as image 

and PDF generation–by around 75%.”	
  
Brian Pugh, VP of Engineering, Lucid Software
http://reactivemanifesto.org
Typesafe Activator
http://typesafe.com/platform/getstarted
Questions?
©Typesafe 2014 – All Rights Reserved

Weitere ähnliche Inhalte

Ähnlich wie Building Reactive Applications with Akka & Java 8 - Bonèr

Deep Dive Xamarin.Android
Deep Dive Xamarin.AndroidDeep Dive Xamarin.Android
Deep Dive Xamarin.AndroidBenjamin Bishop
 
Modern Release Engineering in a Nutshell - Why Researchers should Care!
Modern Release Engineering in a Nutshell - Why Researchers should Care!Modern Release Engineering in a Nutshell - Why Researchers should Care!
Modern Release Engineering in a Nutshell - Why Researchers should Care!Bram Adams
 
Netapp Michael Galpin
Netapp Michael GalpinNetapp Michael Galpin
Netapp Michael Galpinrajivmordani
 
Building High Performance Apps with In-memory Data
Building High Performance Apps with In-memory DataBuilding High Performance Apps with In-memory Data
Building High Performance Apps with In-memory DataAmazon Web Services
 
3 Tips to Deliver Fast Performance Across Mobile Web
3 Tips to Deliver Fast Performance Across Mobile Web3 Tips to Deliver Fast Performance Across Mobile Web
3 Tips to Deliver Fast Performance Across Mobile WebDynatrace
 
Gentle App Engine Intro
Gentle App Engine IntroGentle App Engine Intro
Gentle App Engine Introrobinb123
 
Proxy Deep Dive Voxxed Belgrad 2015
Proxy Deep Dive Voxxed Belgrad 2015Proxy Deep Dive Voxxed Belgrad 2015
Proxy Deep Dive Voxxed Belgrad 2015Sven Ruppert
 
Use Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile AppsUse Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile AppsNathan Smith
 
Develop & Deploy cloud-native apps as resilient Microservices Architectures
Develop & Deploy cloud-native apps as resilient Microservices ArchitecturesDevelop & Deploy cloud-native apps as resilient Microservices Architectures
Develop & Deploy cloud-native apps as resilient Microservices ArchitecturesRed Hat Developers
 
Implementing the Genetic Algorithm in XSLT: PoC
Implementing the Genetic Algorithm in XSLT: PoCImplementing the Genetic Algorithm in XSLT: PoC
Implementing the Genetic Algorithm in XSLT: PoCjimfuller2009
 
Intro to @viewport & other new Responsive Web Design CSS features
Intro to @viewport & other new Responsive Web Design CSS featuresIntro to @viewport & other new Responsive Web Design CSS features
Intro to @viewport & other new Responsive Web Design CSS featuresAndreas Bovens
 
Cassandra & puppet, scaling data at $15 per month
Cassandra & puppet, scaling data at $15 per monthCassandra & puppet, scaling data at $15 per month
Cassandra & puppet, scaling data at $15 per monthdaveconnors
 
Amazon Elastic Container Service for Kubernetes (Amazon EKS)
Amazon Elastic Container Service for Kubernetes (Amazon EKS)Amazon Elastic Container Service for Kubernetes (Amazon EKS)
Amazon Elastic Container Service for Kubernetes (Amazon EKS)Amazon Web Services
 
Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Matthew McCullough
 
Building an Autonomous Data Layer
Building an Autonomous Data LayerBuilding an Autonomous Data Layer
Building an Autonomous Data LayerMartyPitt1
 
mm-ADT: A Virtual Machine/An Economic Machine
mm-ADT: A Virtual Machine/An Economic Machinemm-ADT: A Virtual Machine/An Economic Machine
mm-ADT: A Virtual Machine/An Economic MachineMarko Rodriguez
 
Multithreading and Actors
Multithreading and ActorsMultithreading and Actors
Multithreading and ActorsDiego Pacheco
 
CON318_Interstella 8888 Monolith to Microservices with Amazon ECS
CON318_Interstella 8888 Monolith to Microservices with Amazon ECSCON318_Interstella 8888 Monolith to Microservices with Amazon ECS
CON318_Interstella 8888 Monolith to Microservices with Amazon ECSAmazon Web Services
 
Java fx smart code econ
Java fx smart code econJava fx smart code econ
Java fx smart code econTom Schindl
 

Ähnlich wie Building Reactive Applications with Akka & Java 8 - Bonèr (20)

Deep Dive Xamarin.Android
Deep Dive Xamarin.AndroidDeep Dive Xamarin.Android
Deep Dive Xamarin.Android
 
Modern Release Engineering in a Nutshell - Why Researchers should Care!
Modern Release Engineering in a Nutshell - Why Researchers should Care!Modern Release Engineering in a Nutshell - Why Researchers should Care!
Modern Release Engineering in a Nutshell - Why Researchers should Care!
 
Netapp Michael Galpin
Netapp Michael GalpinNetapp Michael Galpin
Netapp Michael Galpin
 
Building High Performance Apps with In-memory Data
Building High Performance Apps with In-memory DataBuilding High Performance Apps with In-memory Data
Building High Performance Apps with In-memory Data
 
3 Tips to Deliver Fast Performance Across Mobile Web
3 Tips to Deliver Fast Performance Across Mobile Web3 Tips to Deliver Fast Performance Across Mobile Web
3 Tips to Deliver Fast Performance Across Mobile Web
 
Gentle App Engine Intro
Gentle App Engine IntroGentle App Engine Intro
Gentle App Engine Intro
 
Proxy Deep Dive Voxxed Belgrad 2015
Proxy Deep Dive Voxxed Belgrad 2015Proxy Deep Dive Voxxed Belgrad 2015
Proxy Deep Dive Voxxed Belgrad 2015
 
Use Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile AppsUse Web Skills To Build Mobile Apps
Use Web Skills To Build Mobile Apps
 
Develop & Deploy cloud-native apps as resilient Microservices Architectures
Develop & Deploy cloud-native apps as resilient Microservices ArchitecturesDevelop & Deploy cloud-native apps as resilient Microservices Architectures
Develop & Deploy cloud-native apps as resilient Microservices Architectures
 
Implementing the Genetic Algorithm in XSLT: PoC
Implementing the Genetic Algorithm in XSLT: PoCImplementing the Genetic Algorithm in XSLT: PoC
Implementing the Genetic Algorithm in XSLT: PoC
 
Intro to @viewport & other new Responsive Web Design CSS features
Intro to @viewport & other new Responsive Web Design CSS featuresIntro to @viewport & other new Responsive Web Design CSS features
Intro to @viewport & other new Responsive Web Design CSS features
 
Cassandra & puppet, scaling data at $15 per month
Cassandra & puppet, scaling data at $15 per monthCassandra & puppet, scaling data at $15 per month
Cassandra & puppet, scaling data at $15 per month
 
Kubernetes on AWS
Kubernetes on AWSKubernetes on AWS
Kubernetes on AWS
 
Amazon Elastic Container Service for Kubernetes (Amazon EKS)
Amazon Elastic Container Service for Kubernetes (Amazon EKS)Amazon Elastic Container Service for Kubernetes (Amazon EKS)
Amazon Elastic Container Service for Kubernetes (Amazon EKS)
 
Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2Google App Engine for Java v0.0.2
Google App Engine for Java v0.0.2
 
Building an Autonomous Data Layer
Building an Autonomous Data LayerBuilding an Autonomous Data Layer
Building an Autonomous Data Layer
 
mm-ADT: A Virtual Machine/An Economic Machine
mm-ADT: A Virtual Machine/An Economic Machinemm-ADT: A Virtual Machine/An Economic Machine
mm-ADT: A Virtual Machine/An Economic Machine
 
Multithreading and Actors
Multithreading and ActorsMultithreading and Actors
Multithreading and Actors
 
CON318_Interstella 8888 Monolith to Microservices with Amazon ECS
CON318_Interstella 8888 Monolith to Microservices with Amazon ECSCON318_Interstella 8888 Monolith to Microservices with Amazon ECS
CON318_Interstella 8888 Monolith to Microservices with Amazon ECS
 
Java fx smart code econ
Java fx smart code econJava fx smart code econ
Java fx smart code econ
 

Mehr von Codemotion

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Codemotion
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyCodemotion
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaCodemotion
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserCodemotion
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Codemotion
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Codemotion
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Codemotion
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 - Codemotion
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Codemotion
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Codemotion
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Codemotion
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Codemotion
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Codemotion
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Codemotion
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Codemotion
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...Codemotion
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Codemotion
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Codemotion
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Codemotion
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Codemotion
 

Mehr von Codemotion (20)

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storia
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
 

Kürzlich hochgeladen

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Wonjun Hwang
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 

Kürzlich hochgeladen (20)

What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
Bun (KitWorks Team Study 노별마루 발표 2024.4.22)
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 

Building Reactive Applications with Akka & Java 8 - Bonèr

  • 1. Building Reactive Applications with Akka & Java 8 Jonas Bonér Typesafe CTO & co-founder Twitter: @jboner
  • 2. The rules of the game have changed
  • 3. 3 Apps in the 60s-90s were written for Apps today are written for
  • 4. 3 Apps in the 60s-90s were written for Apps today are written for Single machines
  • 5. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines
  • 6. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors
  • 7. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors
  • 8. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM
  • 9. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM
  • 10. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk
  • 11. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk Cheap disk
  • 12. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk Cheap disk Slow networks
  • 13. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk Cheap disk Slow networks Fast networks
  • 14. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk Cheap disk Slow networks Fast networks Few concurrent users
  • 15. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk Cheap disk Slow networks Fast networks Few concurrent users Lots of concurrent users
  • 16. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk Cheap disk Slow networks Fast networks Few concurrent users Lots of concurrent users Small data sets
  • 17. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk Cheap disk Slow networks Fast networks Few concurrent users Lots of concurrent users Small data sets Large data sets
  • 18. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk Cheap disk Slow networks Fast networks Few concurrent users Lots of concurrent users Small data sets Large data sets Latency in seconds
  • 19. 3 Apps in the 60s-90s were written for Apps today are written for Single machines Clusters of machines Single core processors Multicore processors Expensive RAM Cheap RAM Expensive disk Cheap disk Slow networks Fast networks Few concurrent users Lots of concurrent users Small data sets Large data sets Latency in seconds Latency in milliseconds
  • 20.
  • 21. Cost Gravity is at Work 5
  • 22. Cost Gravity is at Work 5
  • 24. Reactive applications react to 
 changes in the world around them.
  • 25. Event-Driven • Loosely coupled architecture, easier to extend, maintain, evolve • Asynchronous and non-blocking • Concurrent by design, immutable state • Lower latency and higher throughput 8 “Clearly, the goal is to do these operations concurrently and 
 non-blocking, so that entire blocks of seats or sections are not locked. 
 We’re able to find and allocate seats under load in less than 20ms 
 without trying very hard to achieve it.”   Andrew Headrick, Platform Architect, Ticketfly
  • 28. 10 A computational model that embodies: The Actor Model
  • 29. 10 A computational model that embodies: ✓ Processing The Actor Model
  • 30. 10 A computational model that embodies: ✓ Processing ✓ Storage The Actor Model
  • 31. 10 A computational model that embodies: ✓ Processing ✓ Storage ✓ Communication The Actor Model
  • 32. 10 A computational model that embodies: ✓ Processing ✓ Storage ✓ Communication Supports 3 axioms—when an Actor receives a message it can: The Actor Model
  • 33. 10 A computational model that embodies: ✓ Processing ✓ Storage ✓ Communication Supports 3 axioms—when an Actor receives a message it can: 1. Create new Actors The Actor Model
  • 34. 10 A computational model that embodies: ✓ Processing ✓ Storage ✓ Communication Supports 3 axioms—when an Actor receives a message it can: 1. Create new Actors 2. Send messages to Actors it knows The Actor Model
  • 35. 10 A computational model that embodies: ✓ Processing ✓ Storage ✓ Communication Supports 3 axioms—when an Actor receives a message it can: 1. Create new Actors 2. Send messages to Actors it knows 3. Designate how it should handle the next message it receives The Actor Model
  • 36. The essence of an actor from Akka’s perspective 0. DEFINE 1. CREATE 2. SEND 3. BECOME 4. SUPERVISE 11
  • 37. public class Greeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } ! public class Greeter extends AbstractActor {{ receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchAny(unknown -> { println(“Unknown message " + unknown); }).build()); }} 0. DEFINE 12
  • 38. public class Greeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } ! public class Greeter extends AbstractActor {{ receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchAny(unknown -> { println(“Unknown message " + unknown); }).build()); }} 0. DEFINE 12 Define the message(s) the Actor should be able to respond to
  • 39. public class Greeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } ! public class Greeter extends AbstractActor {{ receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchAny(unknown -> { println(“Unknown message " + unknown); }).build()); }} 0. DEFINE 12 Define the message(s) the Actor should be able to respond to Define the Actor class
  • 40. public class Greeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } ! public class Greeter extends AbstractActor {{ receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchAny(unknown -> { println(“Unknown message " + unknown); }).build()); }} 0. DEFINE 12 Define the message(s) the Actor should be able to respond to Define the Actor class Define the Actor’s behavior
  • 41. ActorSystem system = ActorSystem.create("MySystem"); ! ActorRef greeter = system.actorOf(Props.create(Greeter.class), “greeter"); 1. CREATE
  • 42. ActorSystem system = ActorSystem.create("MySystem"); ! ActorRef greeter = system.actorOf(Props.create(Greeter.class), “greeter"); 1. CREATE Create an Actor system
  • 43. ActorSystem system = ActorSystem.create("MySystem"); ! ActorRef greeter = system.actorOf(Props.create(Greeter.class), “greeter"); 1. CREATE Create an Actor system Actor configuration
  • 44. ActorSystem system = ActorSystem.create("MySystem"); ! ActorRef greeter = system.actorOf(Props.create(Greeter.class), “greeter"); Give it a name 1. CREATE Create an Actor system Actor configuration
  • 45. ActorSystem system = ActorSystem.create("MySystem"); ! ActorRef greeter = system.actorOf(Props.create(Greeter.class), “greeter"); Give it a name 1. CREATE Create the Actor Create an Actor system Actor configuration
  • 46. ActorSystem system = ActorSystem.create("MySystem"); ! ActorRef greeter = system.actorOf(Props.create(Greeter.class), “greeter"); Give it a name 1. CREATE Create the Actor You get an ActorRef back Create an Actor system Actor configuration
  • 47. Guardian System Actor Actors can form hierarchies
  • 48. Guardian System Actor system.actorOf(Props.create(Foo.class), “Foo”); Actors can form hierarchies
  • 49. Foo Guardian System Actor system.actorOf(Props.create(Foo.class), “Foo”); Actors can form hierarchies
  • 53. A B BarFoo C B E A D C Guardian System Actor Name resolution—like a file-system
  • 59. 2. SEND 16 Send the message asynchronously greeter.tell(new Greeting("Charlie Parker”), sender);
  • 60. 2. SEND 16 Send the message asynchronously greeter.tell(new Greeting("Charlie Parker”), sender); Pass in the sender ActorRef
  • 61. Bring it together 17 public class Greeting implements Serializable { public final String who; public Greeting(String who) { this.who = who; } } public class Greeter extends AbstractActor {{ receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchAny(unknown -> { println(“Unknown message " + unknown); }).build()); } }} ! ActorSystem system = ActorSystem.create("MySystem"); ActorRef greeter = system.actorOf(Props.create(Greeter.class), “greeter"); greeter.tell(new Greeting(“Charlie Parker”));
  • 62. 3. BECOME 18 public class Greeter extends AbstractActor { public Greeter { receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchEquals(“stop" -> { ! ! ! ! }).build(); } }
  • 63. 3. BECOME 18 public class Greeter extends AbstractActor { public Greeter { receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchEquals(“stop" -> { ! ! ! ! }).build(); } } context().become(ReceiveBuilder.
  • 64. 3. BECOME 18 public class Greeter extends AbstractActor { public Greeter { receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchEquals(“stop" -> { ! ! ! ! }).build(); } } Change the behavior context().become(ReceiveBuilder.
  • 65. 3. BECOME 18 public class Greeter extends AbstractActor { public Greeter { receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchEquals(“stop" -> { ! ! ! ! }).build(); } } Change the behavior context().become(ReceiveBuilder. match(Greeting.class, m -> {
  • 66. 3. BECOME 18 public class Greeter extends AbstractActor { public Greeter { receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchEquals(“stop" -> { ! ! ! ! }).build(); } } Change the behavior context().become(ReceiveBuilder. match(Greeting.class, m -> { println(“Go Away!”);
  • 67. 3. BECOME 18 public class Greeter extends AbstractActor { public Greeter { receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchEquals(“stop" -> { ! ! ! ! }).build(); } } Change the behavior context().become(ReceiveBuilder. match(Greeting.class, m -> { println(“Go Away!”); }).build());
  • 68. 3. BECOME 18 public class Greeter extends AbstractActor { public Greeter { receive(ReceiveBuilder. match(Greeting.class, m -> { println(“Hello " + m.who); }). matchEquals(“stop" -> { ! ! ! ! }).build(); } } Change the behavior context().become(ReceiveBuilder. match(Greeting.class, m -> { println(“Go Away!”); }).build());
  • 69. Reactive applications are architected 
 to handle failure at all levels.
  • 70. Resilient • Failure is embraced as a natural state in the app lifecycle • Resilience is a first-class construct • Failure is detected, isolated, and managed • Applications self heal 20 “The Typesafe Reactive Platform helps us maintain a very 
 aggressive development and deployment cycle, all in a fail-forward manner. 
 It’s now the default choice for developing all new services.”   Peter Hausel, VP Engineering, Gawker Media
  • 78. Coffee Machine Programmer Inserts coins Think Vending Machine Out of coffee beans error
  • 79. Coffee Machine Programmer Inserts coins Think Vending Machine Out of coffee beans error Wrong
  • 81. Coffee Machine Programmer Inserts coins Out of coffee beans error Think Vending Machine
  • 83. Coffee Machine Programmer Service Guy Inserts coins Out of coffee beans error Adds more beans Think Vending Machine
  • 84. Coffee Machine Programmer Service Guy Inserts coins Gets coffee Out of coffee beans error Adds more beans Think Vending Machine
  • 92.
  • 93. • Isolate the failure • Compartmentalize • Manage failure locally • Avoid cascading failures Use Bulkheads
  • 94. • Isolate the failure • Compartmentalize • Manage failure locally • Avoid cascading failures Use Bulkheads
  • 97. A B BarFoo C B E A D C Automatic and mandatory supervision Supervisor hierarchies
  • 98. 4. SUPERVISE 28 class Supervisor extends UntypedActor { private SupervisorStrategy strategy = new OneForOneStrategy( 10, Duration.create(1, TimeUnit.MINUTES), DeciderBuilder. match(ArithmeticException.class, e -> resume()). match(NullPointerException.class, e -> restart()). matchAny( e -> escalate()). build()); ! @Override public SupervisorStrategy supervisorStrategy() { return strategy; } Every single actor has a default supervisor strategy. Which is usually sufficient. But it can be overridden.
  • 99. 4. SUPERVISE 28 class Supervisor extends UntypedActor { private SupervisorStrategy strategy = new OneForOneStrategy( 10, Duration.create(1, TimeUnit.MINUTES), DeciderBuilder. match(ArithmeticException.class, e -> resume()). match(NullPointerException.class, e -> restart()). matchAny( e -> escalate()). build()); ! @Override public SupervisorStrategy supervisorStrategy() { return strategy; } ActorRef worker = context.actorOf( Props.create(Worker.class), "worker"); public void onReceive(Object i) throws Exception { … } }
  • 100. Monitor through Death Watch 29 public class WatchActor extends AbstractActor { final ActorRef child = context().actorOf(Props.empty(), "child"); ! public WatchActor() { context().watch(child); receive(ReceiveBuilder. match(Terminated.class, t -> t.actor().equals(child), t -> { … // handle termination }).build() ); } }
  • 101. Monitor through Death Watch 29 public class WatchActor extends AbstractActor { final ActorRef child = context().actorOf(Props.empty(), "child"); ! public WatchActor() { context().watch(child); receive(ReceiveBuilder. match(Terminated.class, t -> t.actor().equals(child), t -> { … // handle termination }).build() ); } } Create a child actor
  • 102. Monitor through Death Watch 29 public class WatchActor extends AbstractActor { final ActorRef child = context().actorOf(Props.empty(), "child"); ! public WatchActor() { context().watch(child); receive(ReceiveBuilder. match(Terminated.class, t -> t.actor().equals(child), t -> { … // handle termination }).build() ); } } Create a child actor Watch it
  • 103. Monitor through Death Watch 29 public class WatchActor extends AbstractActor { final ActorRef child = context().actorOf(Props.empty(), "child"); ! public WatchActor() { context().watch(child); receive(ReceiveBuilder. match(Terminated.class, t -> t.actor().equals(child), t -> { … // handle termination }).build() ); } } Create a child actor Watch it Handle termination message
  • 104. Reactive applications scale up 
 and down to meet demand.
  • 105. Scalable • Scalability and elasticity to embrace the Cloud • Leverage all cores via asynchronous programming • Clustered servers support joining and leaving of nodes • More cost-efficient utilization of hardware 31 “Our traffic can increase by as much as 100x for 15 minutes each day. 
 Until a couple of years ago, noon was a stressful time. 
 Nowadays, it’s usually a non-event.”   Eric Bowman, VP Architecture, Gilt Groupe
  • 106. Define a router 32 ActorRef router = context().actorOf( new RoundRobinPool(5).props(Props.create(Worker.class)), “router”)
  • 107. …or from config 33 akka.actor.deployment { /service/router { router = round-robin-pool resizer { lower-bound = 12 upper-bound = 15 } } }
  • 108. Turn on clustering 34 akka { actor { provider = "akka.cluster.ClusterActorRefProvider" ... }    cluster { seed-nodes = [ “akka.tcp://ClusterSystem@127.0.0.1:2551", “akka.tcp://ClusterSystem@127.0.0.1:2552" ]   auto-down = off } }
  • 109. Use clustered routers 35 akka.actor.deployment  {      /service/master  {          router  =  consistent-­‐hashing-­‐pool          nr-­‐of-­‐instances  =  100   !        cluster  {              enabled  =  on              max-nr-of-instances-per-node = 3              allow-­‐local-­‐routees  =  on              use-­‐role  =  compute          }      }   }
  • 110. Use clustered routers 35 akka.actor.deployment  {      /service/master  {          router  =  consistent-­‐hashing-­‐pool          nr-­‐of-­‐instances  =  100   !        cluster  {              enabled  =  on              max-nr-of-instances-per-node = 3              allow-­‐local-­‐routees  =  on              use-­‐role  =  compute          }      }   } Or perhaps use an AdaptiveLoadBalancingPool
  • 111. • Cluster Membership • Cluster Pub/Sub • Cluster Leader • Clustered Singleton • Cluster Roles • Cluster Sharding 36 Other Akka Cluster features
  • 112. • Supports two different models: • Command Sourcing — at least once • Event Sourcing — at most once • Great for implementing • durable actors • replication • CQRS etc. • Messages persisted to Journal and replayed on restart 37 Use Akka Persistence
  • 114. 38 Command Sourcing Event Sourcing write-ahead-log
  • 115. 38 Command Sourcing Event Sourcing write-ahead-log derive events from a command
  • 116. 38 Command Sourcing Event Sourcing write-ahead-log derive events from a command same behavior during recovery as normal operation
  • 117. 38 Command Sourcing Event Sourcing write-ahead-log derive events from a command same behavior during recovery as normal operation only state-changing behavior during recovery
  • 118. 38 Command Sourcing Event Sourcing write-ahead-log derive events from a command same behavior during recovery as normal operation only state-changing behavior during recovery persisted before validation
  • 119. 38 Command Sourcing Event Sourcing write-ahead-log derive events from a command same behavior during recovery as normal operation only state-changing behavior during recovery persisted before validation events cannot fail
  • 120. 38 Command Sourcing Event Sourcing write-ahead-log derive events from a command same behavior during recovery as normal operation only state-changing behavior during recovery persisted before validation events cannot fail allows retroactive changes to the business logic
  • 121. 38 Command Sourcing Event Sourcing write-ahead-log derive events from a command same behavior during recovery as normal operation only state-changing behavior during recovery persisted before validation events cannot fail allows retroactive changes to the business logic fixing the business logic will not affect persisted events
  • 122. 38 Command Sourcing Event Sourcing write-ahead-log derive events from a command same behavior during recovery as normal operation only state-changing behavior during recovery persisted before validation events cannot fail allows retroactive changes to the business logic fixing the business logic will not affect persisted events naming: represent intent, imperative
  • 123. 38 Command Sourcing Event Sourcing write-ahead-log derive events from a command same behavior during recovery as normal operation only state-changing behavior during recovery persisted before validation events cannot fail allows retroactive changes to the business logic fixing the business logic will not affect persisted events naming: represent intent, imperative naming: things that have completed, verbs in past tense
  • 124. Akka  Persistence  Webinar Life beyond Distributed Transactions: an Apostate’s Opinion Position Paper by Pat Helland “In general, application developers simply do not implement large scalable applications assuming distributed transactions.”   Pat Helland http://www-­‐db.cs.wisc.edu/cidr/cidr2007/papers/cidr07p15.pdf
  • 125. Akka  Persistence  Webinar Consistency boundary • Aggregate Root is the Transactional Boundary • Strong consistency within an Aggregate • Eventual consistency between Aggregates • No limit to scalability
  • 126. Akka  Persistence  Webinar Domain Events • Things that have completed, facts • Immutable • Verbs in past tense • CustomerRelocated • CargoShipped • InvoiceSent “State transitions are an important part of our problem space and should be modeled within our domain.”   Greg Young, 2008
  • 127. Reactive applications enrich the user experience with low latency response.
  • 128. Responsive • Real-time, engaging, rich and collaborative • Create an open and ongoing dialog with users • More efficient workflow; inspires a feeling of connectedness • Fully Reactive enabling push instead of pull 43 “The move to these technologies is already paying off. 
 Response times are down for processor intensive code–such as image 
 and PDF generation–by around 75%.”   Brian Pugh, VP of Engineering, Lucid Software
  • 132. ©Typesafe 2014 – All Rights Reserved