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.receivedefineix 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 anomenathelloAkkai 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 missatgeGreetamb 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
Greeterenvia 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
