above the clouds: introducing akka - goto...

Post on 06-Jul-2020

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Above the Clouds:Introducing Akka

Fredrik EkholdtTypesafe

Email: fredrik.ekholdt@typesafe.comTwitter : @ekhfre

Wednesday, November 23, 11

The problem

It is way too hard to build:1. correct highly concurrent systems

2. truly scalable systems

3. fault-tolerant systems that self-heals

...using “state-of-the-art” tools

Wednesday, November 23, 11

Introducing

Wednesday, November 23, 11

Introducing

Akka (Áhkká):

The name comes from the goddess in the Sami mythology that represented all the wisdom and

beauty in the world.

It is also the name of a beautiful mountain in Laponia in the north part of Sweden

Wednesday, November 23, 11

Introducing

View from the summit

Wednesday, November 23, 11

Vision

Simpler

Concurrency

Scalability

Fault-tolerance

Wednesday, November 23, 11

CORE SERVICES

THE TOOLBOX...

Wednesday, November 23, 11

The Actor...

Wednesday, November 23, 11

Behavior

State

Actor

Wednesday, November 23, 11

Event-driven

Behavior

State

Actor

Wednesday, November 23, 11

Event-driven

Behavior

State

Actor

Wednesday, November 23, 11

Event-driven

Behavior

State

Actor

Wednesday, November 23, 11

Event-driven

Behavior

State

Actor

Wednesday, November 23, 11

Event-driven

Behavior

State

Actor

Wednesday, November 23, 11

Behavior

State

Actor

Wednesday, November 23, 11

Event-driven

Behavior

State

Actor

Wednesday, November 23, 11

Akka ActorsLet the hakking begin!

Text

Wednesday, November 23, 11

•Create an Actor: class AnActor extends Actor•Start an Actor: actorOf[AnActor].start()•Safe

•Encapsulated state•One message at a time

•Asynchronous:•bang (!)

•Reply: •self.reply ( m )•actor ? “message”

Take aways

Wednesday, November 23, 11

Akka Futureswithout blocking

using

Wednesday, November 23, 11

FuturePromise

Future with value

Wednesday, November 23, 11

FuturePromise

Future with value

Wednesday, November 23, 11

FuturePromise

Future with value

Wednesday, November 23, 11

•Use Futures when you need something in the Future without blocking

•Use onComplete•Compose Futures

•for - comprehensions•Check out the Futures utilities (firstCompletedOf

and much, much more)

Take aways

Wednesday, November 23, 11

Remote ActorsAnother snippet of code...

Wednesday, November 23, 11

New Remote Actors

Wednesday, November 23, 11

appContext.actorOf[MyActor](“my-service”)

Name

Bind the actor to a name

Wednesday, November 23, 11

•Actor name is virtual and decoupled from how it is deployed

•If no deployment configuration exists then actor is deployed as local

•The same system can be configured as distributed without code change (even change at runtime)

•Write as local but deploy as distributed in the cloud without code change

•Allows runtime to dynamically and adaptively change topology

Deployment

Wednesday, November 23, 11

akka { actor { deployment { /path/to/my-service { router = "round-robin" nr-of-instances = 3 remote {

nodes = ["wallace:2552", "gromit:2552"] } } } }}

Deployment configuration

Wednesday, November 23, 11

•Decentralized P2P gossip-based cluster membership (dynamo-style w/ vector clocks, hand-off on fail-over etc.)

•Automatic adaptive cluster rebalancing•Automatic cluster-wide deployment•Highly available configuration service•Automatic replication with automatic fail-over upon

node crash•Transparent and user-configurable load-balancing•...and much more

The runtime provides

Wednesday, November 23, 11

Akka Node

Wednesday, November 23, 11

Akka Nodeval ping = actorOf[Ping](“ping”)val pong = actorOf[Pong](“pong”)

pong ! Ball(ping)

Wednesday, November 23, 11

Akka Nodeval ping = actorOf[Ping](“ping”)val pong = actorOf[Pong](“pong”)

pong ! Ball(ping)

Ping Pong

Wednesday, November 23, 11

Akka Node

AkkaCluster Node

Ping Pong

Wednesday, November 23, 11

Akka Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

Ping Pong

Wednesday, November 23, 11

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

Ping Pong

Wednesday, November 23, 11

akka { actor { deployment { /ping {} /pong { router = "round-robin" nr-of-instances = 3 } } }}

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

Ping Pong

Wednesday, November 23, 11

akka { actor { deployment { /ping {} /pong { router = "round-robin" nr-of-instances = 3 } } }}

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

Ping

Pong

Wednesday, November 23, 11

akka { actor { deployment { /ping {} /pong { router = "round-robin" nr-of-instances = 3 } } }}

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

AkkaCluster Node

Ping

Pong

Pong

PongWednesday, November 23, 11

Summingup

Wednesday, November 23, 11

Let it crash fault-tolerance

Wednesday, November 23, 11

...let’s take a standard OO application

Wednesday, November 23, 11

Wednesday, November 23, 11

Which components have critically important state

and explicit error handling?

Wednesday, November 23, 11

Wednesday, November 23, 11

Fault-tolerant onion-layered Error Kernel

Wednesday, November 23, 11

ErrorKernel

Wednesday, November 23, 11

ErrorKernel

Wednesday, November 23, 11

ErrorKernel

Wednesday, November 23, 11

ErrorKernel

Wednesday, November 23, 11

ErrorKernel

Wednesday, November 23, 11

ErrorKernel

Wednesday, November 23, 11

Node 1 Node 2

Wednesday, November 23, 11

// from within an actorcontext.actorOf[MyActor]

transparent and automatic fault handling by design

Parental automatic supervision

Wednesday, November 23, 11

A

B

BarFoo

C

BE

A

D

C

Guardian Actor

Parental automatic supervision

Wednesday, November 23, 11

A

B

BarFoo

C

BE

A

D

C

Guardian Actor

/Foo

Parental automatic supervision

Wednesday, November 23, 11

A

B

BarFoo

C

BE

A

D

C

Guardian Actor

/Foo

/Foo/A

Parental automatic supervision

Wednesday, November 23, 11

A

B

BarFoo

C

BE

A

D

C

Guardian Actor

/Foo

/Foo/A

/Foo/A/B

Parental automatic supervision

Wednesday, November 23, 11

Supervisionclass MySupervisor extends Actor { faultHandler = OneForOneStrategy({ case _: ActorKilledException => Stop case _: ArithmeticException => Resume case _: Exception => Restart case _ => Escalate

   },   maxNrOfRetries = None,   withinTimeRange = None)

def receive = { case NewUser(name) => ... = context.actorOf[User](name) }}

Wednesday, November 23, 11

Supervisionclass MySupervisor extends Actor { faultHandler = OneForOneStrategy({ case _: ActorKilledException => Stop case _: ArithmeticException => Resume case _: Exception => Restart case _ => Escalate

   },   maxNrOfRetries = None,   withinTimeRange = None)

def receive = { case NewUser(name) => ... = context.actorOf[User](name) }}

AllForOneStrategy

Wednesday, November 23, 11

class FaultTolerantService extends Actor { ... override def preRestart( reason: Throwable, message: Option[Any]) = { ... // clean up before restart } override def postRestart(reason: Throwable) = { ... // init after restart }}

Manage failure

Wednesday, November 23, 11

ARCHITECTURE

TYPESAFE STACK

ADD-ONS

Wednesday, November 23, 11

Get it and learn morehttp://akka.io

http://typesafe.com

https://gist.github.com/1388237

Wednesday, November 23, 11

EOFWednesday, November 23, 11

top related