Advanced akka features

112
@johanjanssen42 #VoxxedBerlin Advanced Akka features Martin Kanters, Info Support Johan Janssen, Info Support, @johanjanssen42

Transcript of Advanced akka features

Page 1: Advanced akka features

@johanjanssen42#VoxxedBerlin

Advanced Akka featuresMartin Kanters, Info Support

Johan Janssen, Info Support, @johanjanssen42

Page 2: Advanced akka features

Content

▪ Introduction

▪ Why Akka?

▪ Local actor

▪ Remote actor

▪ Scheduling

▪ Cluster

▪ Routing

▪ Cluster singleton

▪ Sharding

▪ Persistence

▪ Akka HTTP

▪ Finite State Machines

▪ Conclusion

▪ Questions

Page 3: Advanced akka features

Introduction

Page 4: Advanced akka features
Page 5: Advanced akka features
Page 6: Advanced akka features
Page 7: Advanced akka features

Why Akka?

Page 8: Advanced akka features

Why Akka?

▪ Concurrent

▪ Scalable

▪ Fault tolerant

▪ More natural programming experience when connecting to other systems

▪ Easy to use?

Page 9: Advanced akka features
Page 10: Advanced akka features

Local actor

Page 11: Advanced akka features

Local actor

Actor on JVM 1

Page 12: Advanced akka features

Local actor

Coordinator Actor

Hello conference

Page 13: Advanced akka features

Local actor

Coordinator Actor

println("Hello conference")

Page 14: Advanced akka features

class Worker extends Actor {def receive = {case x =>println(x)

}}

implicit val system = ActorSystem("ExampleActorSystem")

val workerActorRef = system.actorOf(Props[Worker])workerActorRef ! "Hello conference"

Scala

Page 15: Advanced akka features

public class AkkaExampleJava8 extends AbstractActor {

public AkkaExample() {

receive(

match(

String.class, System.out::println

).build()

);

}

}

ActorSystem actorSystem = ActorSystem.create();

ActorRef actorRef =

actorSystem.actorOf(Props.create(AkkaExampleJava8.class));

actorRef.tell("test", ActorRef.noSender());

Java 8

Page 16: Advanced akka features

Remote actor

Page 17: Advanced akka features

Remote actor

Actor on JVM 1

Actor on JVM 2

Page 18: Advanced akka features

val workerActorRef = system.actorOf(Props[Worker])workerActorRef ! "Hello conference"

val workerActorRef = context.actorSelection("akka.tcp://[email protected]:9005/user/workerActor")

workerActorRef ! "Hello conference"

Page 19: Advanced akka features

akka {actor {provider =

"akka.remote.RemoteActorRefProvider"}remote {enabled-transports =

["akka.remote.netty.tcp"]netty.tcp {hostname = "127.0.0.1"port = 9002

Page 20: Advanced akka features

Remote actor

Coordinator actor

Worker actor

StartMessage

Hello conference

Page 21: Advanced akka features

Remote actor

Coordinator actor

Worker actor

WorkerMessage

Greetings from the coordinator:

Hello Conference

Page 22: Advanced akka features

Remote actor

Coordinator actor

Worker actor

WorkerResponseMessage

Item processed successfully

Page 23: Advanced akka features

Shared protocol

Page 24: Advanced akka features

Actor on JVM 1

Actor on JVM 2

Messages

Page 25: Advanced akka features

CoordinatorActor on

laptop

WorkerActor on

Raspberry PiWorkerMessage

Page 26: Advanced akka features

CoordinatorActor on laptop

WorkerActor on

Raspberry Pi

MessageProtocol

Page 27: Advanced akka features

SharedMessages

object SharedMessages {case class WorkerResponseMessage(body: String)case class WorkerMessage(body: String)

}

Page 28: Advanced akka features

Message used by application

val workerActorRef = context.actorSelection("akka.tcp://[email protected]:9005/user/workerActor")

workerActorRef ! SharedMessages.WorkerMessage("Greetings from the coordinator: " + body)

Page 29: Advanced akka features

Scheduling

Page 30: Advanced akka features

Scheduling

Actor

Scheduled once after 1 second

Tick

Scheduled every 5 seconds

Tock

Page 31: Advanced akka features

Scheduling

▪ Does not work for fixed point in time like 17:00– Use Quartz

Page 32: Advanced akka features

Cluster

Page 33: Advanced akka features

Cluster

ActorSystemon JVM 1

ActorSystemon JVM 3

ActorSystemon JVM 2

ActorSystemon JVM 4

Page 34: Advanced akka features

Seed nodes

▪ Contact points for automatically joining a cluster

Page 35: Advanced akka features

akka {

cluster {

seed-nodes = [

"akka.tcp://[email protected]:2551",

"akka.tcp://[email protected]:2552"

]

}

}

Page 36: Advanced akka features

Cluster Worker Node

Port 2551

Association failed with [akka.tcp://[email protected]:2552

Page 37: Advanced akka features

Cluster Worker Node

Port 2551

Worker Node

Port 2552

Member Up with IP: 127.0.0.1 and port: 2551Member Up with IP: 127.0.0.1 and port: 2552

Member Up with IP: 127.0.0.1 and port: 2551Member Up with IP: 127.0.0.1 and port: 2552

Page 38: Advanced akka features

Cluster Worker Node

Port 2551

Worker Node

Port 2552

Member Up with IP: 127.0.0.1 and port: 2550

Member Up with IP: 127.0.0.1 and port: 2550

CoordinatorNode

Port 2550

Page 39: Advanced akka features

Cluster Worker Node

Port 2551

Worker Node

Port 2552

CoordinatorNode

Port 2550

RegisterWorker

RegisterWorker

Page 40: Advanced akka features

Cluster Worker Node

Port 2551

Worker Node

Port 2552

CoordinatorNode

Port 2550

Worker registered with IP: 127.0.0.1 and port: 2551Worker registered with IP: 127.0.0.1 and port: 2552

Page 41: Advanced akka features

Routing

Page 42: Advanced akka features

Routing

Actor on JVM 1

Actor on JVM 3

Actor on JVM 4

Actor on JVM 2

Loadbalancer

Page 43: Advanced akka features

akka {actor {provider = "akka.cluster.ClusterActorRefProvider"

deployment {/coordinator/router {router = round-robin-poolnr-of-instances = 10routees.paths = ["/user/emptystringactor"]cluster {enabled = onallow-local-routees = off

}}

}}

}

Page 44: Advanced akka features

Routing

CoordinatorActor on

JVM 1

EmptyStringActor on

JVM 3

EmptyStringActor on

JVM 4

EmptyStringActor on

JVM 2""

Page 45: Advanced akka features

Routing

CoordinatorActor on

JVM 1

EmptyStringActor on

JVM 3

EmptyStringActor on

JVM 4

EmptyStringActor on

JVM 2""

HashMap[hostname, counter]

Page 46: Advanced akka features

Routing

CoordinatorActor on

JVM 1

EmptyStringActor on

JVM 3

EmptyStringActor on

JVM 4

EmptyStringActor on

JVM 2

""

Page 47: Advanced akka features

Routing

CoordinatorActor on

JVM 1

EmptyStringActor on

JVM 3

EmptyStringActor on

JVM 4

EmptyStringActor on

JVM 2

""

Page 48: Advanced akka features

Cluster singleton

Page 49: Advanced akka features

Cluster singleton

▪ Only one instance of the actor in the cluster

▪ (Re)created on the oldest node

▪ Can be used for instance for scheduling/caching

Page 50: Advanced akka features

Cluster singleton

Actor on JVM 1

Other actors on

JVM 3

Other actors on

JVM 4

Singleton actor and

other actors on JVM 2

Page 51: Advanced akka features

Cluster singleton

CoordinatorEmptyString

Actor on JVM 3

EmptyStringActor on

JVM 4

EmptyStringActor on

JVM 2""

Page 52: Advanced akka features

Cluster singleton

CoordinatorEmptyString

Actor on JVM 3

EmptyStringActor on

JVM 4

EmptyStringActor on

JVM 2""

HashMap[hostname, counter]

Page 53: Advanced akka features

Cluster singleton

CoordinatorEmptyString

Actor on JVM 3

EmptyStringActor on

JVM 4

EmptyStringActor on

JVM 2""

Page 54: Advanced akka features

Cluster singleton

CoordinatorEmptyString

Actor on JVM 3

EmptyStringActor on

JVM 4

EmptyStringActor on

JVM 2""

HashMap[hostname, counter]

Page 55: Advanced akka features

Cluster singleton

CoordinatorEmptyString

Actor on JVM 3

EmptyStringActor on

JVM 4

EmptyStringActor on

JVM 2Crash

Page 56: Advanced akka features

Cluster singleton

CoordinatorEmptyString

Actor on JVM 3

EmptyStringActor on

JVM 4

""

Page 57: Advanced akka features

Cluster singleton

CoordinatorEmptyString

Actor on JVM 3

EmptyStringActor on

JVM 4

""

HashMap[hostname, counter]

Page 58: Advanced akka features

Cluster singleton

CoordinatorEmptyString

Actor on JVM 3

EmptyStringActor on

JVM 4

""

Page 59: Advanced akka features

Cluster singleton

CoordinatorEmptyString

Actor on JVM 3

EmptyStringActor on

JVM 4

""

HashMap[hostname, counter]

Page 60: Advanced akka features

Sharding

Page 61: Advanced akka features

Sharding

▪ Dividing a set of actors over a cluster

▪ Actors will be divided into groups called shards

▪ It will divide based on a logical identifier

Page 62: Advanced akka features

Sharding

Actor on JVM 1

oddShard on

JVM 3

evenShard on

JVM 2

0, 2, 4, 6, 8

1, 3, 5, 7, 9

Page 63: Advanced akka features

Sharding method: ShardResolver

def shardResolver(numberOfShards: Int): ExtractShardId = {case i: Int => (i % numberOfShards).toString

}

Page 64: Advanced akka features

Sharding method: IdExtractor

def idExtractor: ExtractEntityId = {case i: Int => (i.toString, “New message: “ + i)

}

Actual message

Page 65: Advanced akka features

Persistence

Page 66: Advanced akka features

Persistence

▪ Store actor information

▪ Recover after crash

▪ Possibility to take snapshots

Page 67: Advanced akka features

Example without persistence

Actor

Cobol

Page 68: Advanced akka features

Example without persistence

Actor

Cobol

Page 69: Advanced akka features

Example without persistence

Cobol

Actor

Page 70: Advanced akka features

Example without persistence

Actor

Java Cobol

Page 71: Advanced akka features

Example without persistence

CobolJava

ActorCrash

Restart

Page 72: Advanced akka features

Example without persistence

Actor

Page 73: Advanced akka features

Example without persistence

Actor

Scala

Page 74: Advanced akka features

Example without persistence

Scala

Actor

Page 75: Advanced akka features

Persistence

PersistentActor

Cobol

Command

Journal

Page 76: Advanced akka features

Persistence

Journal

CobolEvent

PersistentActor

Page 77: Advanced akka features

Persistence

Journal

ACKPersistentActor

CobolEvent

Page 78: Advanced akka features

Persistence

Cobol

Journal

CobolEvent

PersistentActor

Page 79: Advanced akka features

Persistence

Cobol

Journal

CobolEvent

PersistentActor

JavaEvent

Page 80: Advanced akka features

Persistence

CobolJava

Journal

CobolEvent

PersistentActorCrash

Restart JavaEvent

Page 81: Advanced akka features

Persistence

Journal

CobolEvent

PersistentActor

JavaEvent

Page 82: Advanced akka features

Persistence

CobolJava

Journal

CobolEvent

PersistentActor

JavaEvent

Scala

Page 83: Advanced akka features

Persistence

CobolJavaScala

Journal

CobolEvent

PersistentActor

JavaEvent

Page 84: Advanced akka features

Snapshots

JournalPersistentActor

Snapshot store

State until Event C++

C++

Cobol

Page 85: Advanced akka features

Snapshots

JournalPersistentActor

Snapshot store

State until Event C++

C++

Cobol

Page 86: Advanced akka features

Snapshots

JournalPersistentActor

Snapshot store

State until Event C++ C++

Cobol

Page 87: Advanced akka features

Snapshots

JournalPersistentActor

Snapshot store

State until Event C++

JavaC++

Cobol

Page 88: Advanced akka features

Snapshots

JournalPersistentActor

Snapshot store

State until Event C++

Crash

Restart

C++

Cobol

Java

Page 89: Advanced akka features

Snapshots

JournalPersistentActor

Snapshot store

State until Event C++ C++

Cobol

Java

Page 90: Advanced akka features

Snapshots

CobolC++

JournalPersistentActor

Snapshot store

State until Event C++ C++

Cobol

Java

Page 91: Advanced akka features

Snapshots

CobolC++Java

JournalPersistentActor

Snapshot store

State until Event C++ C++

Cobol

Java

Page 92: Advanced akka features

Snapshots

CobolC++JavaScala

JournalPersistentActor

Snapshot store

State until Event C++ C++

Cobol

Java

Page 93: Advanced akka features

Command Query Responsibility Segregation (CQRS)

Page 94: Advanced akka features

CQRS in Akka

Journal

CobolEvent

Cobol

PersistentActor

Persistence Query

Page 95: Advanced akka features

Akka HTTP

Page 96: Advanced akka features

Akka HTTP

Actor on JVM 1

Actor on JVM 2

Page 97: Advanced akka features

Finite State Machine

Page 98: Advanced akka features
Page 99: Advanced akka features

Finite State Machine

▪ State

▪ Event

Page 100: Advanced akka features

Finite State Machines (FSM)

InprogressProject

CrappyProject

NewProject

Progress, iterationProgress, iteration

Progress, iteration

NoProgressProgress, 2

Page 101: Advanced akka features

Finite State Machines (FSM)

InprogressProject

CrappyProject

NewProject

Work harder

Iteration: 0

Page 102: Advanced akka features

Finite State Machines (FSM)

InprogressProject

CrappyProject

NewProject

Good job!

Iteration: 0

Page 103: Advanced akka features

Finite State Machines (FSM)

InprogressProject

CrappyProject

NewProject

Wrong direction

Iteration: 0

Page 104: Advanced akka features

Finite State Machines (FSM)

InprogressProject

CrappyProject

NewProject

Use Akka

Iteration: 0

Page 105: Advanced akka features

Finite State Machines (FSM)

InprogressProject

CrappyProject

NewProject

Good job!

Iteration: 1

Page 106: Advanced akka features

Finite State Machines (FSM)

InprogressProject

CrappyProject

NewProject

Wrong direction

Iteration: 1

Page 107: Advanced akka features

Finite State Machines (FSM)

InprogressProject

CrappyProject

NewProject

Use Akka

Iteration: 1

Page 108: Advanced akka features

Finite State Machines (FSM)

InprogressProject

CrappyProject

NewProject Get another job!

Iteration: 2

Page 109: Advanced akka features

Finite State Machines (FSM)

▪ Two types of events– Progress

– NoProgress

▪ All events should be handled!

▪ Integer used to count the number of iterations

▪ After two iterations a message is shown

Page 110: Advanced akka features

Conclusion

Page 111: Advanced akka features

Conclusion

▪ Akka can be used with Scala or Java

▪ There is even a .NET version of Akka

▪ Akka is really powerful

▪ Akka is quite easy to use

▪ Some features are still experimental

Page 112: Advanced akka features

Questions

Martin Kanters and Johan Janssen @johanjanssen42GitHub: https://github.com/johanjanssen/Akka-examples