actor model pattern for concurrency
DESCRIPTION
Actor model is a pattern to simplify writing efficient concurrent applicationsTRANSCRIPT
![Page 1: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/1.jpg)
Actor Model
![Page 2: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/2.jpg)
Google thinks this is an Actor Model
![Page 3: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/3.jpg)
Actor model is a pattern to simplify writing efficient concurrent applications
![Page 4: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/4.jpg)
Concurrency: Writing applications where different parts could run in
parallel
![Page 5: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/5.jpg)
Traditional approach to concurrency
Multiple threads and Shared Objects
![Page 6: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/6.jpg)
void Session::onConnectionRequest(conn) { anvil.validateToken(conn.token); this.addConnection(conn);}
![Page 7: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/7.jpg)
void Session::onConnectionRequest(conn) { anvil.validateToken(conn.token); this.addConnection(conn);}
void Session::onDisconnectionRequest(conn) { this.removeConnection(conn);}
![Page 8: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/8.jpg)
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;}
![Page 9: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/9.jpg)
Traditional concurrency
It is difficult to build efficient applications while maintaining consistent state
![Page 10: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/10.jpg)
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).
![Page 11: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/11.jpg)
Solution 1: ad-hoc solutions and fix bugs forever
![Page 12: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/12.jpg)
Solution 2: rendition
![Page 13: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/13.jpg)
Solution 3: Actor Model
![Page 14: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/14.jpg)
Actor Model concurrency approach
Asynchronous communication between objects
Object state is only modified from one thread at a specific time
![Page 15: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/15.jpg)
Multiple threads and Shared Objects
![Page 16: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/16.jpg)
Actor Model
![Page 17: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/17.jpg)
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
}
![Page 18: Actor Model pattern for concurrency](https://reader034.vdocuments.us/reader034/viewer/2022042714/554a0e80b4c9055c598b48e5/html5/thumbnails/18.jpg)
Bonus Track
supervisionpersistencydistribution