Akka es un toolkit que facilita la creación de aplicaciones distribuidas y concurrentes utilizando el modelo de actores, donde cada "actor" es una entidad pequeña que tiene su propio estado y comportamiento, y se comunica con otros actores mediante el paso de mensajes. Este enfoque es ideal para manejar sistemas altamente escalables y tolerantes a fallos.
Los actores en Akka son independientes y aislados, lo que significa que no comparten estado y, por lo tanto, evitan problemas relacionados con el acceso concurrente a datos.
Para empezar a usar Akka, necesitas incluir la dependencia en tu proyecto. Si estás usando SBT, añade la siguiente línea a tu archivo build.sbt
:
libraryDependencies += "com.typesafe.akka" %% "akka-actor-typed" % "2.6.20"
En Akka, se definen actores como clases que extienden AbstractBehavior
. Aquí tienes un ejemplo de un actor simple que responde a un mensaje de saludo.
import akka.actor.typed.{ActorRef, Behavior}
import akka.actor.typed.scaladsl.Behaviors
// Definir el protocolo de mensajes que el actor acepta
object Saludador {
final case class Saludo(nombre: String, respondTo: ActorRef[Respuesta])
final case class Respuesta(mensaje: String)
def apply(): Behavior[Saludo] = Behaviors.receive { (context, message) =>
val saludo = s"Hola, ${message.nombre}!"
message.respondTo ! Respuesta(saludo)
Behaviors.same
}
}
Para interactuar con el actor, necesitas crear un sistema de actores y un actor supervisor.
import akka.actor.typed.ActorSystem
object SistemaSaludador extends App {
val sistema: ActorSystem[Saludador.Saludo] = ActorSystem(Saludador(), "SistemaDeSaludo")
val respuestaActor = sistema.systemActorOf(Behaviors.receiveMessage[Saludador.Respuesta] { message =>
println(message.mensaje)
Behaviors.same
}, "RespuestaActor")
sistema ! Saludador.Saludo("Scala", respuestaActor)
}
En este ejemplo, se crea un actor Saludador
que responde con un mensaje personalizado y se envía un mensaje para saludar a "Scala". El resultado se imprime en la consola.
Akka permite que varios actores trabajen juntos en un sistema distribuido. Los actores pueden comunicarse entre ellos enviándose mensajes.
object Coordinador {
final case class Tarea(mensaje: String, respondTo: ActorRef[Resultado])
final case class Resultado(respuesta: String)
def apply(): Behavior[Tarea] = Behaviors.receive { (context, message) =>
context.log.info("Procesando tarea: " + message.mensaje)
message.respondTo ! Resultado("Tarea completada: " + message.mensaje)
Behaviors.same
}
}
Los actores pueden distribuir tareas y coordinarse para manejar cargas de trabajo grandes o paralelizar operaciones.
Akka también incluye características como el balanceo de carga y la supervisión, donde los actores supervisores pueden reiniciar o detener actores fallidos, asegurando que el sistema sea robusto ante errores.
Para más información sobre Akka y cómo usarlo en Scala, consulta la documentación oficial de Akka.
Jorge García
Fullstack developer