From 64974b2701dc3df2b6dd8f17d287305dcf7ffc26 Mon Sep 17 00:00:00 2001 From: Salar Rahmanian Date: Sun, 1 Nov 2020 14:08:40 -0800 Subject: [PATCH] Added Intro to Akka actors --- .../introduction-to-akka-typed-using-scala.md | 132 ++++++++++++++++++ static/img/akka_actor_system_design.png | Bin 0 -> 65155 bytes static/img/akka_logo.svg | 1 + 3 files changed, 133 insertions(+) create mode 100644 content/post/introduction-to-akka-typed-using-scala.md create mode 100644 static/img/akka_actor_system_design.png create mode 100644 static/img/akka_logo.svg diff --git a/content/post/introduction-to-akka-typed-using-scala.md b/content/post/introduction-to-akka-typed-using-scala.md new file mode 100644 index 0000000..ad15a6f --- /dev/null +++ b/content/post/introduction-to-akka-typed-using-scala.md @@ -0,0 +1,132 @@ ++++ +title = "Introduction to Akka Typed Using Scala" +date = 2020-10-24T20:32:41-07:00 +description = "An Introduction to AKKA Typed using Scala with an example" +featured = true +draft = false +toc = true +featureImage = "/img/akka_logo.svg" +thumbnail = "" +shareImage = "" +codeMaxLines = 10 +codeLineNumbers = false +figurePositionShow = false +keywords = ["concurrent", "concurrency", "actor model", "actor", "actors", "threads", "petri net", "coroutines", "distributed", "akka", "erlang", "elixir", "akka.net", "microsoft orleans", "orleans", "zio", "zio-actors"] +tags = ["actor model", "concurrency", "distributed systems", "scala", "akka"] +categories = ["concurrency", "distributed systems", "scala"] ++++ + +In this post I am going to do a quick introduction to using the Akka Typed toolkit that implements the Actor model using Scala. As part of this post I will be developing a simple application using Akka. My goal is to highlight what its like to develop applications using Akka and how to get started with it. I will be following up this post with more posts diving into Akka in more details and exploring more of its features and patterns you can use to solve concurrent and distributed applications. + +Before reading this post it is recommended that you read my earlier post [Introduction to the Actor Model](/post/introduction-to-the-actor-model/) as I have assumed the reader will be familiar with the concepts discussed in that post. + +## Problem to solve ## + +To get start we are going to build a simple mailing list application where a persons name and email address are added to a datastore and we are able to retrieve their details and remove them from the datastore. As the scope of this example is to show how we can use Akka to build applications our data store will be a pretend one. + +The diagram below illustrates the actors that we will need and the message flow between each actor. + +![Akka Actor System Design Example](/img/akka_actor_system_design.png) + +- `Root Actor`: Creates the actor system and spawns all the actors. +- `Validate Email Address Actor`: Validates if the new message received has a valid email address +- `Datastore Actor`: Decides which datastore `Command` (i.e. `Add`, `Get` or `Remove`) we are actioning and calls the relevant actor with the message. +- `Add Action Actor`: Uses the message received to add the received subscriber to the database. +- `Get Subscriber Actor`: Retrieves a subscriber from the database. +- `Remove Subscriber Actor`: Removes a subscriber from the database. + +## Messages and Types ## + +Lets start by defining the types of the messages our actors are going to be passing. + +First our actors are going to be sending on of three types of commands to either add, remove or get a subscriber from the datastore: + +```scala +sealed trait Command +final case object Add extends Command +final case object Remove extends Command +final case object Get extends Command +``` + +The message type to add a subscriber: + +```scala +final case class Customer(firstName: String, lastName: String, emailAddress: String) +``` + +The message type to add a subscriber by the root actor: + +```scala +final case class Message( + firstName: String, + lastName: String, + emailAddress: String, + command: Command, + db: ActorRef[Message], + replyTo: ActorRef[SubscribedMessage] +) { + def isValid: Boolean = EmailValidator.getInstance().isValid(emailAddress) +} +``` + +This type is identical to the `Customer` type except we are including `ActorRef` for the actors to use to save the subscriber and the actor to use to reply to the caller. The `Message` type also has a property that checks to make sure the received message has a valid email address. + +## Validate Email Address Actor ## + +```scala +object Subscriber { + + def apply(): Behavior[Message] = Behaviors.receive { (context, message) => + context.log.info(s"Validating ${message.firstName} ${message.lastName} with email ${message.emailAddress}!") + if (message.isValid) { + message.replyTo ! SubscribedMessage(1L, context.self) + message.db ! message + } else { + context.log.info(s"Received an invalid message $message.emailAddress") + } + Behaviors.same + } +} +``` + +When creating actors we need to define how the actor reacts to messages and how they are processed. Looking at the above code you will see that we are creating a `Behavior` which takes a `Message` type. `Behaviors.receive` provides a `context` and the `message` received (which is of type `Message`). + +This actors behavior is: + +- It uses `context` to log messages +- The Received `message`'s `isValid` property is used to check if the message contains a valid email and if it does then the actors job is done and it sends a message to two other actors, a reply actor confirming the message has been accepted and a message to the storage actor which saves the message in our datastore. Note that the references to the actors it is going to send a message to is included in the message received. If the message is invalid, an appropriate message is logged and no further action is taken. +- Lastly, `Behaviors.same` is called to indicate to the system to reuse the previous actor behavior for the next message. For more information about the different behaviors you can return visit [Behaviors API Docs](https://doc.akka.io/api/akka/current/akka/actor/typed/scaladsl/Behaviors$.html) + +## Datastore Actor ## + +This actor is responsible for adding, removing and fetching a `Customer` from the datastore. + +```scala +object Datastore { + def apply(): Behavior[Message] = Behaviors.receive { (context, message) => + context.log.info(s"Adding ${message.firstName} ${message.lastName} with email ${message.emailAddress}!") + message.command match { + case Add => println(s"Adding message with email: ${message.emailAddress}") // Send message to Add Action Actor + case Remove => println(s"Removing message with email: ${message.emailAddress}") // Send message to Remove Subscriber Actor + case Get => println(s"Getting message with email: ${message.emailAddress}") // Send message to Get Subscriber Actor + } + Behaviors.same + } +} +``` + +The `Message` received contains a `Command`, the behavior defined for this actor is to use pattern matching to determine and `Add` to the datastore, `Remove` from the datastore or to `Get` from the datastore. The appropriate message is sent to the actor that will carry out the action as illustrated in my diagram and code snippet above. + +The resulting behavior for this actor is also `Behaviors.same` as it is not changing in any way and its behavior will be the same all the time. + +## Summary ## + +In this post I have just tried to give you a feel for what its like to use akka, how to think about your application in terms of Actors and message passing and to get started. Akka offers a lot of awesome features so stay tuned and follow my blog as we explore and learn about akka. You can look at the application we discussed in this post [here on GitHub](https://github.com/softinio/pat). + + +## Useful Resources ## + +- [My Sample Application used in this post](https://github.com/softinio/pat) +- [Akka Documentation](https://akka.io/docs/) +- [Conference talk introducing Akka Typed](https://www.youtube.com/watch?v=Qb9Cnii-34c) +- [Typecasting Actors: from Akka to TAkka](http://lampwww.epfl.ch/~hmiller/scala2014/proceedings/p23-he.pdf) diff --git a/static/img/akka_actor_system_design.png b/static/img/akka_actor_system_design.png new file mode 100644 index 0000000000000000000000000000000000000000..faa47f564a1b0e1f4250ccd5e24b455be042b8c8 GIT binary patch literal 65155 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 Dmg%6< literal 0 HcmV?d00001 diff --git a/static/img/akka_logo.svg b/static/img/akka_logo.svg new file mode 100644 index 0000000..239d3ed --- /dev/null +++ b/static/img/akka_logo.svg @@ -0,0 +1 @@ + \ No newline at end of file