Actor Model pattern for concurrency

Post on 06-May-2015

504 views 2 download

Tags:

description

Actor model is a pattern to simplify writing efficient concurrent applications

Transcript of Actor Model pattern for concurrency

Actor Model

Google thinks this is an Actor Model

Actor model is a pattern to simplify writing efficient concurrent applications

Concurrency: Writing applications where different parts could run in

parallel

Traditional approach to concurrency

Multiple threads and Shared Objects

void Session::onConnectionRequest(conn) { anvil.validateToken(conn.token); this.addConnection(conn);}

void Session::onConnectionRequest(conn) { anvil.validateToken(conn.token); this.addConnection(conn);}

void Session::onDisconnectionRequest(conn) { this.removeConnection(conn);}

Publisher::onDisconnect() { scoped_lock lock; if (subscriber != NULL) { subscriber.setPublisher(NULL); }}

Publisher::setSubscriber() { scoped_lock lock; subscriber = NULL;}

Subscriber::onDisconnect() { scoped_lock lock; if (publisher != NULL) { publisher.setSubscriber(NULL); }}

Subscriber::setPublisher() { scoped_lock lock; publisher = NULL;}

Traditional concurrency

It is difficult to build efficient applications while maintaining consistent state

Fundamentally, the biggest challenge that SendGrid faces in development is concurrent programming. While what we do isn’t rocket science, doing it at a scale of over 500 million messages per day is extremely challenging (I’ve done rocket science, this is way harder).

Solution 1: ad-hoc solutions and fix bugs forever

Solution 2: rendition

Solution 3: Actor Model

Actor Model concurrency approach

Asynchronous communication between objects

Object state is only modified from one thread at a specific time

Multiple threads and Shared Objects

Actor Model

Examplesealed trait SessionMessage

case object ConnectMessage extends SessionMessage

case object DisconnectMessage extends SessionMessage

class Session extends Actor with ActorLogging {

def receive = {

case ConnectMessage => log.info("Connecting")

case DisconnectMessage => log.info("Disconnecting")

}

}

object Demo extends App {

val system = ActorSystem("MySystem")

val session = system.actorOf(Props[Session], name="session1")

session ! ConnectMessage

session ! DisconnectMessage

}

Bonus Track

supervisionpersistencydistribution