Diseño de sistemas de actores
Aprenda a diseñar e implementar jerarquías de actores, definir comportamientos y enviar y recibir mensajes.
Diseño de sistemas de actores es una lección gratuita de Scala for Backend Engineering & Functional Programming en CoddyKit. Esta es la lección 2 de 3. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Scala for Backend Engineering & Functional Programming, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Scala for Backend Engineering & Functional Programming incluye 3 lecciones en total.
Diseño de sistemas de actores: introducción
¡Bienvenido a la lección 2! En la lección anterior aprendimos los conceptos básicos del modelo de actores de Akka. Ahora profundizaremos en el diseño de sistemas de actores de Akka.
Un sistema de actores bien diseñado es robusto, escalable y fácil de mantener. Exploraremos cómo estructurar los actores, definir sus comportamientos y permitir que se comuniquen eficazmente.
Comprender las jerarquías de actores
Los actores de Akka se organizan en una jerarquía con forma de árbol, como un sistema de archivos. Todos los actores, excepto el actor «root», tienen un padre.
- Relación padre-hijo: el actor que crea a otro actor se convierte en su padre.
- Supervisión: esta jerarquía es fundamental para la tolerancia a fallos de Akka. Los padres son responsables de supervisar a sus hijos (¡lo veremos con más detalle en la siguiente lección!).
- Direccionamiento basado en rutas: cada actor tiene una ruta única que refleja su posición en la jerarquía, como
/user/parentActor/childActor.
Configurar su ActorSystem
ActorSystem es el punto de entrada para todas las aplicaciones Akka. Administra los recursos que necesitan los actores, incluidos los grupos de subprocesos y los planificadores.
Debe crearlo una sola vez por aplicación y usarlo después para crear sus actores de nivel superior. Es como el contenedor de toda su aplicación de actores.
Pruebe a ejecutar este código sencillo para crear un ActorSystem:
import akka.actor.ActorSystem
object AkkaSystemApp {
def main(args: Array[String]): Unit = {
// Create an ActorSystem with a unique name
val system = ActorSystem("MyFirstActorSystem")
println("ActorSystem created: " + system.name)
// Remember to terminate the system when done!
system.terminate()
}
}Definición del comportamiento de los actores
El comportamiento de un actor determina cómo reacciona ante distintos mensajes. En Scala, se define extendiendo el trait Actor e implementando el método receive.
- El método
receivees una función parcial que asocia los mensajes entrantes con acciones específicas. - Cada actor procesa los mensajes de uno en uno, de forma secuencial, lo que garantiza la seguridad de los hilos para su estado interno.
ActorRef: la dirección del actor
No interactúa directamente con las instancias de los actores. En su lugar, envía mensajes a un ActorRef. Piense en ActorRef como la dirección postal de un actor.
- Es un identificador que representa a un actor específico dentro del sistema.
- Los mensajes enviados a un
ActorRefse colocan en el buzón del actor. - Obtiene un
ActorRefcuando crea un actor medianteactorOf.
Envío de mensajes a los actores
La principal forma de comunicación entre actores es el envío de mensajes. La forma más habitual de enviar un mensaje es mediante el método ! (se pronuncia «tell»).
receiverActorRef ! "Your message here"
El método tell es asíncrono y de tipo fire-and-forget. Envía el mensaje sin esperar una respuesta.
Combine ahora la creación de un actor con el envío de mensajes:
import akka.actor.{Actor, ActorRef, Props, ActorSystem}
// 1. Define the actor's behavior
class GreeterActor extends Actor {
def receive = {
case "hello" => println(s"Greeter: Hello from ${self.path.name}!")
case msg: String => println(s"Greeter: Received message: '$msg'")
case _ => println("Greeter: Received something unexpected!")
}
}
object SimpleActorApp {
def main(args: Array[String]): Unit = {
// 2. Create the ActorSystem
val system = ActorSystem("GreeterSystem")
// 3. Create a top-level actor and get its ActorRef
val greeter: ActorRef = system.actorOf(Props[GreeterActor], "myGreeter")
// 4. Send messages to the actor using '!'
greeter ! "hello"
greeter ! "How are you doing today?"
greeter ! 123 // This will match the _ case
// Give actors time to process messages, then terminate
Thread.sleep(1000)
system.terminate()
}
}Creación de actores secundarios
Los actores pueden crear otros actores, formando la jerarquía que hemos descrito. Un actor principal crea sus actores secundarios mediante context.actorOf.
context.actorOf: lo utiliza un actor para crear sus actores secundarios.system.actorOf: lo utiliza la aplicación para crear actores de nivel superior (guardianes).
La creación de actores secundarios ayuda a organizar el sistema, delegar tareas y aislar los fallos.
Comunicación entre actores principales y secundarios
Los actores se comunican enviando mensajes al ActorRef de los demás. Un actor secundario puede obtener el ActorRef de su actor principal mediante context.parent. Para responder al remitente de un mensaje, un actor puede usar sender().
Veamos un ejemplo en el que un actor principal crea un actor secundario, le indica que realice una tarea y este informa cuando termina:
import akka.actor.{Actor, ActorRef, Props, ActorSystem}
import scala.concurrent.ExecutionContext.Implicits.global
// Child Actor Definition: Does work and replies to sender
class ChildActor extends Actor {
def receive = {
case "work" =>
println(s"ChildActor (${self.path.name}): Doing work from ${sender().path.name}")
sender() ! "done" // Reply 'done' to the sender (parent)
}
}
// Parent Actor Definition: Creates child, sends work, receives reply
class ParentActor extends Actor {
// Create a child actor when the parent starts
val child: ActorRef = context.actorOf(Props[ChildActor], "myChild")
def receive = {
case "start" =>
println("ParentActor: Kicking off child's work.")
child ! "work" // Tell the child to do 'work'
case "done" =>
println(s"ParentActor: Child ${sender().path.name} reported 'done'.")
context.stop(child) // Stop the child actor
context.stop(self) // Stop the parent actor
}
}
object HierarchyApp {
def main(args: Array[String]): Unit = {
val system = ActorSystem("HierarchySystem")
val parent: ActorRef = system.actorOf(Props[ParentActor], "parentActor")
parent ! "start" // Start the interaction
// Wait for the system to terminate (actors will stop themselves)
system.whenTerminated.onComplete(_ => println("ActorSystem terminated."))
}
}Detención controlada de actores
Los actores deben detenerse de forma controlada cuando ya no se necesitan, para liberar recursos. Puede detener un actor de varias formas:
context.stop(self): el actor se detiene a sí mismo.context.stop(childRef): un actor principal detiene a uno de sus actores secundarios.system.stop(actorRef): se utiliza para los actores de nivel superior, aunque normalmente se detiene todo el sistema.
Cuando un actor se detiene, procesa todos los mensajes de su buzón antes de finalizar. Sus actores secundarios también se detienen de forma recursiva.
Comprobación rápida: diseño de actores
Considere el siguiente fragmento de código de un actor de Akka. ¿Cuál es la forma correcta de que MyChildActor envíe un mensaje a su actor principal creador, MyParentActor, si MyParentActor fue el remitente del mensaje inicial «request»?
Recapitulación: diseño de sistemas de actores
¡Buen trabajo! En esta lección hemos visto aspectos fundamentales del diseño de sistemas de actores de Akka:
- Los actores se organizan en jerarquías, esenciales para la supervisión y la estructura.
ActorSystemes el punto de entrada de su aplicación a Akka.- El comportamiento de los actores se define mediante el método
receive. ActorRefes la dirección a la que se envían los mensajes.- Los actores se comunican de forma asíncrona mediante el método
!(tell). - Los actores principales crean actores secundarios con
context.actorOf, y estos pueden responder mediantesender(). - Los actores pueden detenerse de forma controlada mediante
context.stop().
A continuación profundizaremos en las potentes estrategias de supervisión de Akka y en cómo gestionar los fallos correctamente.
Preguntas frecuentes
¿La lección «Diseño de sistemas de actores» es gratis?
Sí — el texto completo de «Diseño de sistemas de actores» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Scala for Backend Engineering & Functional Programming, actualiza a CoddyKit PRO. El curso de Scala for Backend Engineering & Functional Programming incluye 3 lecciones en total.
¿Qué aprenderé en «Diseño de sistemas de actores»?
Aprenda a diseñar e implementar jerarquías de actores, definir comportamientos y enviar y recibir mensajes. Practicas Scala for Backend Engineering & Functional Programming con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Scala for Backend Engineering & Functional Programming?
No se requiere experiencia previa. Scala for Backend Engineering & Functional Programming en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 3.
¿Cuánto tiempo toma la lección «Diseño de sistemas de actores»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Scala for Backend Engineering & Functional Programming?
Sí. Cada lección de Scala for Backend Engineering & Functional Programming incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Fundamentos del modelo de actores de Akka
- Diseño de sistemas de actores
- Supervisión y tolerancia a fallos