Akka és un conjunt d'eines per construir aplicacions altament concurrents, distribuïdes i tolerants a fallades en la JVM (Java Virtual Machine). Akka proporciona un model d'actors que facilita la gestió de la concurrència i la distribució, permetent als desenvolupadors escriure codi més senzill i mantenible.
Objectius del Tema
- Entendre què és Akka i per què és útil.
- Aprendre els conceptes bàsics del model d'actors.
- Configurar un projecte bàsic amb Akka.
- Crear i gestionar actors en Scala.
- Enviar i rebre missatges entre actors.
Conceptes Clau
Què és Akka?
Akka és una biblioteca per a la construcció d'aplicacions concurrentes, distribuïdes i tolerants a fallades. Utilitza el model d'actors per gestionar la concurrència, on cada actor és una unitat independent de computació que pot enviar i rebre missatges.
Per què utilitzar Akka?
- Concurrència: Simplifica la gestió de la concurrència evitant l'ús de fils i bloquejos.
- Escalabilitat: Facilita la creació d'aplicacions que poden escalar horitzontalment.
- Tolerància a fallades: Proporciona mecanismes per gestionar errors i fallades de manera robusta.
Model d'Actors
- Actors: Són unitats de computació que processen missatges de manera asincrònica.
- Missatges: Són unitats de comunicació entre actors.
- Sistema d'Actors: És el contenidor que gestiona la creació i supervisió dels actors.
Configuració del Projecte
Configuració de l'Entorn
Per començar a utilitzar Akka, necessitem configurar el nostre projecte Scala amb les dependències necessàries.
build.sbt
name := "AkkaIntroduction" version := "0.1" scalaVersion := "2.13.6" libraryDependencies ++= Seq( "com.typesafe.akka" %% "akka-actor-typed" % "2.6.16", "com.typesafe.akka" %% "akka-stream" % "2.6.16" )
Creació del Sistema d'Actors
Exemple Bàsic d'Actor
A continuació, crearem un actor senzill que rebi i processi missatges.
import akka.actor.typed.{ActorSystem, Behavior} import akka.actor.typed.scaladsl.Behaviors object HelloWorldActor { final case class Greet(whom: String) def apply(): Behavior[Greet] = Behaviors.receive { (context, message) => context.log.info("Hello {}!", message.whom) Behaviors.same } } object AkkaQuickstart extends App { val system: ActorSystem[HelloWorldActor.Greet] = ActorSystem(HelloWorldActor(), "helloAkka") system ! HelloWorldActor.Greet("Scala") }
Explicació del Codi
- Definició de l'Actor:
HelloWorldActor
és un objecte que defineix un actor amb un comportament (Behavior
) que processa missatges de tipusGreet
. - Missatge:
Greet
és un cas de classe que representa el missatge que l'actor pot rebre. - Comportament de l'Actor:
Behaviors.receive
defineix com l'actor processa els missatges. En aquest cas, simplement imprimeix un missatge de salutació. - Sistema d'Actors:
ActorSystem
és el contenidor que gestiona l'actor. En aquest exemple, creem un sistema d'actors anomenathelloAkka
i li enviem un missatgeGreet
.
Exercicis Pràctics
Exercici 1: Crear un Actor de Salutació
Crea un actor que rebi un missatge amb un nom i respongui amb un missatge de salutació.
Solució
import akka.actor.typed.{ActorSystem, Behavior} import akka.actor.typed.scaladsl.Behaviors object Greeter { final case class Greet(whom: String, replyTo: akka.actor.typed.ActorRef[Greeting]) final case class Greeting(message: String) def apply(): Behavior[Greet] = Behaviors.receive { (context, message) => val greeting = s"Hello, ${message.whom}!" message.replyTo ! Greeting(greeting) Behaviors.same } } object GreeterMain extends App { val system: ActorSystem[Greeter.Greet] = ActorSystem(Greeter(), "greeterSystem") val replyTo = system.systemActorOf(Behaviors.receiveMessage[Greeter.Greeting] { message => println(message.message) Behaviors.same }, "replyActor") system ! Greeter.Greet("Scala", replyTo) }
Explicació del Codi
- Actor de Salutació:
Greeter
és un actor que rep un missatgeGreet
amb un nom i un actor de resposta (replyTo
). - Missatge de Salutació:
Greeting
és un cas de classe que representa la resposta de salutació. - Resposta: L'actor
Greeter
envia un missatge de salutació a l'actor de resposta (replyTo
).
Resum
En aquesta secció, hem introduït Akka i el model d'actors, hem configurat un projecte bàsic amb Akka i hem creat actors que poden enviar i rebre missatges. Akka facilita la construcció d'aplicacions concurrentes i distribuïdes, proporcionant un model d'actors que simplifica la gestió de la concurrència i la comunicació entre components.
En el següent tema, explorarem conceptes més avançats d'Akka, com la supervisió d'actors i la gestió d'errors.
Curs de Programació en Scala
Mòdul 1: Introducció a Scala
- Introducció a Scala
- Configuració de l'Entorn de Desenvolupament
- Conceptes Bàsics de Scala: Sintaxi i Estructura
- Variables i Tipus de Dades
- Operacions Bàsiques i Expressions
Mòdul 2: Estructures de Control i Funcions
- Declaracions Condicionals
- Bucles i Iteracions
- Funcions i Mètodes
- Funcions d'Ordre Superior
- Funcions Anònimes
Mòdul 3: Col·leccions i Estructures de Dades
- Introducció a les Col·leccions
- Llistes i Arrays
- Conjunts i Mapes
- Tuples i Options
- Coincidència de Patrons
Mòdul 4: Programació Orientada a Objectes en Scala
- Classes i Objectes
- Herència i Traits
- Classes Abstractes i Classes Case
- Objectes Companys
- Objectes Singleton
Mòdul 5: Programació Funcional en Scala
- Immutabilitat i Funcions Pures
- Estructures de Dades Funcionals
- Monads i Functors
- For-Comprehensions
- Gestió d'Errors en la Programació Funcional
Mòdul 6: Conceptes Avançats de Scala
- Conversions i Paràmetres Implícits
- Classes de Tipus i Polimorfisme
- Macros i Reflexió
- Concurrència en Scala
- Introducció a Akka