SlideShare una empresa de Scribd logo
1 de 46
Introducción a Akka
David Vallejo
@dvnavarro
Índice
1.Motivación
2.Modelo de Actores
3.Features avanzadas
4.Testing
5.Conclusión
MOTIVACIÓN
Ley de Moore
No es fácil crear procesadores más potentes
Existe una limitación física a la hora de incorporar más transistores a
los procesadores
Se piensa en utilizar varios procesadores en paralelo
A principios de la década pasada aparecen los multicores
Ley de Moore
Concurrencia y Paralelismo
Programar en sistemas multicore implica concurrencia
Condiciones de carrera
Ahora programar es más complicado
MODELO DE ACTORES
¿Qué es un Actor?
Caja negra que reacciona a determinados mensajes
Puede tener (o no) un estado interno
No se puede acceder al estado de un actor desde fuera
Procesa solo un mensaje cada vez
¿Por qué esto funciona?
REGLA FUNDAMENTAL
“Solo se procesa un mensaje a la vez”
Pueden tener estado
sin condiciones de
carrera!!
Los actores son
mutex
¿Cómo definimos un Actor?
- Trait Actor
- Método receive Comportamiento del actor
def receive: Receive = {
case message => doSomething()
}
type Receive = PartialFunction[Any, Unit]
Akka System
Contexto en el que viven los actores
Necesario para poder definir un actor
val system = ActorSystem("my-first-system")
ActorRef
No podemos acceder al interior del actor
Trabajaremos con referencias a actores
Útil, por ejemplo, para pasar actores como un parámetro más
val myActor: ActorRef =
system.actorOf(Props[MyFirstActor],"my-first-actor")
Envío de mensajes
Enviar un mensaje a un actor y olvidarse de él:
Enviar mensajes esperando respuesta:
Devuelve un futuro.
childActor ! "Be careful!"
childActor ? "Be careful!"
Hello World en Akka
class MyFirstActor extends Actor {
def receive = {
case _ => println("Hello World!")
}
}
Hello World en Akka
object HelloWorldBoot extends App {
val system = ActorSystem("my-first-system")
val myActor: ActorRef =
system.actorOf(Props[MyFirstActor],"my-first-actor")
myActor ! "Start!"
system.shutdown()
}
FEATURES AVANZADAS
Envío de mensajes y Sender
Existe una variable implícita que devuelve la referencia del actor que
envió un mensaje. Se llama sender.
Puedo enviar un mensaje a un actor modificando el sender por otro
ActorRef conocido:
De esta manera podemos hacer que un actor conteste a un tercero.
childActor.tell("Be careful!", motherActor)
sender ! "Nice to meet you!"
Estado en actores
Los actores pueden tener “estado”
Mediante valores definidos en el interior del actor
Mediante comportamientos => Máquinas de estado
class StateActor extends Actor {
var state: Int = 0
def receive = ???
}
Estado
mediante
valores
Estado en actores mediante valores
Estamos usando vars!!!!
Pero, recordemos dos cosas:
No se puede acceder desde fuera al estado de un actor
Un actor funciona como un mutex. No hay condiciones de carrera
DON'T PANIC! :)
Estado en actores mediante valores
Usar variables no rompe la pureza si su uso está localizado
Podemos encontrar ejemplos en la librería de Scala:
def isEmpty: Boolean = {
var result = true
breakable {
for (x <- this) {
result = false
break
}
}
result
}
En los actores ocurre lo
mismo. La variable no sale
fuera
Estado en actores
Ejercicio: definir un actor que acumule los números que se le pasen
por mensaje.
Estado en actores
class AdderActor extends Actor {
var accum = 0
def receive = {
case Add(n: Int) => accum = accum + n
case PrintAccum => println(s"Accum: $accum")
}
}
case class Add(n: Int)
case object PrintAccum
Posible solución:
AdderActor
Comportamientos
Un actor puede tener uno o varios comportamientos: behaviours
Cada comportamiento se define como un método receive
Es posible cambiar de comportamientos con el metodo
context.become:
def ping: Receive = {
case _ =>
sender ! "Ping"
context.become(pong)
}
def pong: Receive = {
case _ =>
sender ! "Pong"
context.become(ping)
}
Comportamientos
Ejercicio: definir un actor que, cuando se le pase un entero, cambie de
comportamiento para esperar un segundo, y devolver la suma de
ambos.
Comportamientos
Posible solución: CalculActor.scala
READY WAITING
IWantToSum(1)
Plus(3)
Routing
Permite enviar un mensaje a un conjunto de actores como si fuesen
un único ActorRef
Se puede adoptar cualquier política
val router: ActorRef =
context.actorOf(RoundRobinPool(5).props(Props[HelloWorldActor]), "router")
Scheduler
Planificar envíos de mensajes a un actor.
De forma periódica o puntual
val timerActor = system.actorOf(Props[TimerActor], "timer-actor")
import system.dispatcher
import scala.concurrent.duration._
import scala.language.postfixOps
val timerServiceScheduler =
system.scheduler.schedule(0 milliseconds, 1 seconds, timerActor, GiveMeTime)
Scheduler
Ejercicio: definir un actor que devuelva un String con la fecha, cada
segundo.
Scheduler
Posible solución: TimerActor & PrinterActor
TimerActor
PrinterActor
(println)
GiveMeTime DateScheduler
Ask Pattern
Mediante “?” podemos esperar la respuesta de un actor
Será devuelta como un futuro para permitir asincronía
Hay que tener en cuenta dos aspectos importantes:
Timeout
Mapeo del futuro. Recibimos un Future[Any]
Ask Pattern
implicit val timeout = Timeout(5 seconds) // needed for `?` below
val f: Future[Result] = (actorRef ? AreYouThere).mapTo[String]
Podemos redirigir el mensaje del futuro y enviarlo a otro actor:
f pipeTo otherActor
Ejemplo de Ask-Pattern:
Supervisión
Un actor puede crear actores en su contexto de ejecución
Se establece una jerarquía de actores
class FirstActor extends Actor {
val child = context.actorOf(Props[MyActor], name = "myChild")
// plus some behavior ...
}
Supervisión
Se puede definir una política de recuperación por si uno o varios hijos
sufren un fallo de ejecución.
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
case _: NullPointerException => Restart
case _: IllegalArgumentException => Stop
}
Ask Pattern - Supervision
Ejercicio:
Crear un actor que calcule el factorial de un número. Para ello, un
primer actor recibirá un mensaje con un entero n que será el número al
que hay que calcular el factorial.
Ese actor, creará un hijo al que pedirá el factorial de n-1
El actor que tenga como propósito crear el factorial de 1 devolverá un 1
a su padre.
Posible solución:
FactorialActor
Ask Pattern - Supervision
TESTING
Akka-testkit
Proporciona funcionalidad para probar modelos de actores.
Dos conceptos básicos:
TestActorRef
ProbeActor
TestActorRef
Permite acceder al interior de un actor para hacer comprobaciones de
estado:
val testActorRef = TestActorRef[AdderActor]
val testActor = testActorRef.underlyingActor
testActor.accum should be(0)
TestActorRef
Ejemplo: AdderActorSpec
TestProbe
Permite crear actores muy simples para realizar comprobaciones en
ellos:
val probe1 = TestProbe()
val probe2 = TestProbe()
val actor = system.actorOf(Props[MyDoubleEcho])
actor ! ((probe1.ref, probe2.ref))
actor ! "hello"
probe1.expectMsg(500 millis, "hello")
probe2.expectMsg(500 millis, "hello")
TestProbe
Ejemplo: FactorialActorSpec
CONCLUSIONES
Conclusiones
Paradigma Reactivo
Beneficios de la programación funcional
Útil en problemas distribuidos
Difícil de testear
Conclusiones
Futuros === Asincronía
Flexible y dinámico
“Estado” controlado
MADRID · MAR · 2015
Scala Programming @ Madrid
scalerablog.wordpress.com
@scalerablog

Más contenido relacionado

La actualidad más candente (7)

Objeto slqcommand
Objeto slqcommandObjeto slqcommand
Objeto slqcommand
 
Greenfoot 9
Greenfoot 9Greenfoot 9
Greenfoot 9
 
Unidad 5: Excepciones Ejercicio 4
Unidad 5: Excepciones Ejercicio 4Unidad 5: Excepciones Ejercicio 4
Unidad 5: Excepciones Ejercicio 4
 
Javascript
JavascriptJavascript
Javascript
 
Java
JavaJava
Java
 
Unidad 2: Clases y objetos Ejercicio 4
Unidad 2: Clases y objetos Ejercicio 4Unidad 2: Clases y objetos Ejercicio 4
Unidad 2: Clases y objetos Ejercicio 4
 
PRACTICA 13 ALICE
PRACTICA 13 ALICEPRACTICA 13 ALICE
PRACTICA 13 ALICE
 

Destacado

Codemotion 2015 - Akka voló sobre el nido del future
Codemotion 2015 - Akka voló sobre el nido del futureCodemotion 2015 - Akka voló sobre el nido del future
Codemotion 2015 - Akka voló sobre el nido del futurescalerablog
 
Introduction to Asynchronous scala
Introduction to Asynchronous scalaIntroduction to Asynchronous scala
Introduction to Asynchronous scalaStratio
 

Destacado (7)

Scala @ Real Life Codemotion 2014
Scala @ Real Life Codemotion 2014Scala @ Real Life Codemotion 2014
Scala @ Real Life Codemotion 2014
 
Codemotion 2014 Scala @real life
Codemotion 2014 Scala @real lifeCodemotion 2014 Scala @real life
Codemotion 2014 Scala @real life
 
Scala@real life
Scala@real lifeScala@real life
Scala@real life
 
Codemotion 2015 - Akka voló sobre el nido del future
Codemotion 2015 - Akka voló sobre el nido del futureCodemotion 2015 - Akka voló sobre el nido del future
Codemotion 2015 - Akka voló sobre el nido del future
 
Scala for dummies
Scala for dummiesScala for dummies
Scala for dummies
 
Introduction to Asynchronous scala
Introduction to Asynchronous scalaIntroduction to Asynchronous scala
Introduction to Asynchronous scala
 
Introducing Akka
Introducing AkkaIntroducing Akka
Introducing Akka
 

Similar a Introducción a akka

Akkaships: "Primeros pasos con Akka: Olvídate de los threads"
Akkaships: "Primeros pasos con Akka: Olvídate de los threads"Akkaships: "Primeros pasos con Akka: Olvídate de los threads"
Akkaships: "Primeros pasos con Akka: Olvídate de los threads"Miguel Angel Fernandez Diaz
 
Jade Agentes inteligentes básico
Jade Agentes inteligentes básicoJade Agentes inteligentes básico
Jade Agentes inteligentes básicoOctavio Abundez
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejerciciostestgrupocomex
 
Programacin mysqlejercicios439-131027071437-phpapp01
Programacin mysqlejercicios439-131027071437-phpapp01Programacin mysqlejercicios439-131027071437-phpapp01
Programacin mysqlejercicios439-131027071437-phpapp01MaraMagdalenaBlancoR
 
Practica 13 de_alice(2)
Practica 13 de_alice(2)Practica 13 de_alice(2)
Practica 13 de_alice(2)ArmandoC42
 
Practica 13 de_alice(2)
Practica 13 de_alice(2)Practica 13 de_alice(2)
Practica 13 de_alice(2)dani t
 
Practica 13 alice
Practica 13 alicePractica 13 alice
Practica 13 aliceAquino1912
 
Lenguaje de Restricciones de Objeto
Lenguaje de Restricciones de ObjetoLenguaje de Restricciones de Objeto
Lenguaje de Restricciones de ObjetoMauro Torres
 
Presentación charla puppet madrid devops 2012
Presentación charla puppet madrid devops 2012Presentación charla puppet madrid devops 2012
Presentación charla puppet madrid devops 2012Jorge Moratilla Porras
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCCarlos Hernando
 
Java struts2 - 03 componentes de la aplicacion
Java   struts2 - 03 componentes de la aplicacionJava   struts2 - 03 componentes de la aplicacion
Java struts2 - 03 componentes de la aplicacionJechu2013
 

Similar a Introducción a akka (20)

Akkaships: "Primeros pasos con Akka: Olvídate de los threads"
Akkaships: "Primeros pasos con Akka: Olvídate de los threads"Akkaships: "Primeros pasos con Akka: Olvídate de los threads"
Akkaships: "Primeros pasos con Akka: Olvídate de los threads"
 
Jade Agentes inteligentes básico
Jade Agentes inteligentes básicoJade Agentes inteligentes básico
Jade Agentes inteligentes básico
 
Programación MySQL-Ejercicios
Programación MySQL-EjerciciosProgramación MySQL-Ejercicios
Programación MySQL-Ejercicios
 
Programacin mysqlejercicios439-131027071437-phpapp01
Programacin mysqlejercicios439-131027071437-phpapp01Programacin mysqlejercicios439-131027071437-phpapp01
Programacin mysqlejercicios439-131027071437-phpapp01
 
Practica 13 de_alice(2)
Practica 13 de_alice(2)Practica 13 de_alice(2)
Practica 13 de_alice(2)
 
Practica 13 de_alice(2)
Practica 13 de_alice(2)Practica 13 de_alice(2)
Practica 13 de_alice(2)
 
Practica 13 alice
Practica 13 alicePractica 13 alice
Practica 13 alice
 
Practica 13
Practica 13Practica 13
Practica 13
 
Lenguaje de Restricciones de Objeto
Lenguaje de Restricciones de ObjetoLenguaje de Restricciones de Objeto
Lenguaje de Restricciones de Objeto
 
Angular Conceptos Practicos 2
Angular Conceptos Practicos 2Angular Conceptos Practicos 2
Angular Conceptos Practicos 2
 
PRACTICA 13
PRACTICA 13PRACTICA 13
PRACTICA 13
 
Presentación charla puppet madrid devops 2012
Presentación charla puppet madrid devops 2012Presentación charla puppet madrid devops 2012
Presentación charla puppet madrid devops 2012
 
Javascript OOP
Javascript OOPJavascript OOP
Javascript OOP
 
Introducción a Akka.Net
Introducción a Akka.NetIntroducción a Akka.Net
Introducción a Akka.Net
 
Java 7- Java Day Guatemala
Java 7- Java Day GuatemalaJava 7- Java Day Guatemala
Java 7- Java Day Guatemala
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
 
9.animaciones
9.animaciones9.animaciones
9.animaciones
 
Java struts2 - 03 componentes de la aplicacion
Java   struts2 - 03 componentes de la aplicacionJava   struts2 - 03 componentes de la aplicacion
Java struts2 - 03 componentes de la aplicacion
 
Functional SE.pdf
Functional SE.pdfFunctional SE.pdf
Functional SE.pdf
 
Practica13
Practica13Practica13
Practica13
 

Último

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfJulian Lamprea
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 

Último (10)

EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 

Introducción a akka

  • 1. Introducción a Akka David Vallejo @dvnavarro
  • 2. Índice 1.Motivación 2.Modelo de Actores 3.Features avanzadas 4.Testing 5.Conclusión
  • 4. Ley de Moore No es fácil crear procesadores más potentes Existe una limitación física a la hora de incorporar más transistores a los procesadores Se piensa en utilizar varios procesadores en paralelo A principios de la década pasada aparecen los multicores
  • 6. Concurrencia y Paralelismo Programar en sistemas multicore implica concurrencia Condiciones de carrera Ahora programar es más complicado
  • 8. ¿Qué es un Actor? Caja negra que reacciona a determinados mensajes Puede tener (o no) un estado interno No se puede acceder al estado de un actor desde fuera Procesa solo un mensaje cada vez
  • 9. ¿Por qué esto funciona? REGLA FUNDAMENTAL “Solo se procesa un mensaje a la vez” Pueden tener estado sin condiciones de carrera!! Los actores son mutex
  • 10. ¿Cómo definimos un Actor? - Trait Actor - Método receive Comportamiento del actor def receive: Receive = { case message => doSomething() } type Receive = PartialFunction[Any, Unit]
  • 11. Akka System Contexto en el que viven los actores Necesario para poder definir un actor val system = ActorSystem("my-first-system")
  • 12. ActorRef No podemos acceder al interior del actor Trabajaremos con referencias a actores Útil, por ejemplo, para pasar actores como un parámetro más val myActor: ActorRef = system.actorOf(Props[MyFirstActor],"my-first-actor")
  • 13. Envío de mensajes Enviar un mensaje a un actor y olvidarse de él: Enviar mensajes esperando respuesta: Devuelve un futuro. childActor ! "Be careful!" childActor ? "Be careful!"
  • 14. Hello World en Akka class MyFirstActor extends Actor { def receive = { case _ => println("Hello World!") } }
  • 15. Hello World en Akka object HelloWorldBoot extends App { val system = ActorSystem("my-first-system") val myActor: ActorRef = system.actorOf(Props[MyFirstActor],"my-first-actor") myActor ! "Start!" system.shutdown() }
  • 17. Envío de mensajes y Sender Existe una variable implícita que devuelve la referencia del actor que envió un mensaje. Se llama sender. Puedo enviar un mensaje a un actor modificando el sender por otro ActorRef conocido: De esta manera podemos hacer que un actor conteste a un tercero. childActor.tell("Be careful!", motherActor) sender ! "Nice to meet you!"
  • 18. Estado en actores Los actores pueden tener “estado” Mediante valores definidos en el interior del actor Mediante comportamientos => Máquinas de estado class StateActor extends Actor { var state: Int = 0 def receive = ??? } Estado mediante valores
  • 19. Estado en actores mediante valores Estamos usando vars!!!! Pero, recordemos dos cosas: No se puede acceder desde fuera al estado de un actor Un actor funciona como un mutex. No hay condiciones de carrera DON'T PANIC! :)
  • 20. Estado en actores mediante valores Usar variables no rompe la pureza si su uso está localizado Podemos encontrar ejemplos en la librería de Scala: def isEmpty: Boolean = { var result = true breakable { for (x <- this) { result = false break } } result } En los actores ocurre lo mismo. La variable no sale fuera
  • 21. Estado en actores Ejercicio: definir un actor que acumule los números que se le pasen por mensaje.
  • 22. Estado en actores class AdderActor extends Actor { var accum = 0 def receive = { case Add(n: Int) => accum = accum + n case PrintAccum => println(s"Accum: $accum") } } case class Add(n: Int) case object PrintAccum Posible solución: AdderActor
  • 23. Comportamientos Un actor puede tener uno o varios comportamientos: behaviours Cada comportamiento se define como un método receive Es posible cambiar de comportamientos con el metodo context.become: def ping: Receive = { case _ => sender ! "Ping" context.become(pong) } def pong: Receive = { case _ => sender ! "Pong" context.become(ping) }
  • 24. Comportamientos Ejercicio: definir un actor que, cuando se le pase un entero, cambie de comportamiento para esperar un segundo, y devolver la suma de ambos.
  • 26. Routing Permite enviar un mensaje a un conjunto de actores como si fuesen un único ActorRef Se puede adoptar cualquier política val router: ActorRef = context.actorOf(RoundRobinPool(5).props(Props[HelloWorldActor]), "router")
  • 27. Scheduler Planificar envíos de mensajes a un actor. De forma periódica o puntual val timerActor = system.actorOf(Props[TimerActor], "timer-actor") import system.dispatcher import scala.concurrent.duration._ import scala.language.postfixOps val timerServiceScheduler = system.scheduler.schedule(0 milliseconds, 1 seconds, timerActor, GiveMeTime)
  • 28. Scheduler Ejercicio: definir un actor que devuelva un String con la fecha, cada segundo.
  • 29. Scheduler Posible solución: TimerActor & PrinterActor TimerActor PrinterActor (println) GiveMeTime DateScheduler
  • 30. Ask Pattern Mediante “?” podemos esperar la respuesta de un actor Será devuelta como un futuro para permitir asincronía Hay que tener en cuenta dos aspectos importantes: Timeout Mapeo del futuro. Recibimos un Future[Any]
  • 31. Ask Pattern implicit val timeout = Timeout(5 seconds) // needed for `?` below val f: Future[Result] = (actorRef ? AreYouThere).mapTo[String] Podemos redirigir el mensaje del futuro y enviarlo a otro actor: f pipeTo otherActor Ejemplo de Ask-Pattern:
  • 32. Supervisión Un actor puede crear actores en su contexto de ejecución Se establece una jerarquía de actores class FirstActor extends Actor { val child = context.actorOf(Props[MyActor], name = "myChild") // plus some behavior ... }
  • 33. Supervisión Se puede definir una política de recuperación por si uno o varios hijos sufren un fallo de ejecución. override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) { case _: NullPointerException => Restart case _: IllegalArgumentException => Stop }
  • 34. Ask Pattern - Supervision Ejercicio: Crear un actor que calcule el factorial de un número. Para ello, un primer actor recibirá un mensaje con un entero n que será el número al que hay que calcular el factorial. Ese actor, creará un hijo al que pedirá el factorial de n-1 El actor que tenga como propósito crear el factorial de 1 devolverá un 1 a su padre.
  • 37. Akka-testkit Proporciona funcionalidad para probar modelos de actores. Dos conceptos básicos: TestActorRef ProbeActor
  • 38. TestActorRef Permite acceder al interior de un actor para hacer comprobaciones de estado: val testActorRef = TestActorRef[AdderActor] val testActor = testActorRef.underlyingActor testActor.accum should be(0)
  • 40. TestProbe Permite crear actores muy simples para realizar comprobaciones en ellos: val probe1 = TestProbe() val probe2 = TestProbe() val actor = system.actorOf(Props[MyDoubleEcho]) actor ! ((probe1.ref, probe2.ref)) actor ! "hello" probe1.expectMsg(500 millis, "hello") probe2.expectMsg(500 millis, "hello")
  • 43. Conclusiones Paradigma Reactivo Beneficios de la programación funcional Útil en problemas distribuidos Difícil de testear
  • 44. Conclusiones Futuros === Asincronía Flexible y dinámico “Estado” controlado
  • 45.
  • 46. MADRID · MAR · 2015 Scala Programming @ Madrid scalerablog.wordpress.com @scalerablog