Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

34
Akkaships Primeros pasos con Akka: Olvídate de los threads Codemotion Madrid 2015 Juanjo López Martín Miguel Ángel Fernández Díaz

Transcript of Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Page 1: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

AkkashipsPrimeros pasos con Akka:Olvídate de los threads

Codemotion Madrid 2015 Juanjo López MartínMiguel Ángel Fernández Díaz

Page 2: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

ÍndicePresentación

Introducción

Ideas generales

Actores

Entornos distribuidos

Akkaships

Hora de programar

¡A jugar!

Bajando el telón

Page 3: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

PresentaciónJuanjo López Martín

Desarrollador (o algo así) de Big Data en StratioBD: Crossdata team.

Sufridor de Scala.

+ 10 años desarrollando Software.

Akka beginner! (or believer, I’m not sure)

Ingeniero Superior en Informática: UVA

@Orcrsit

Miguel Ángel Fernández Díaz2 años como Arquitecto Big Data en StratioBD: Crossdata team.

2 años de experiencia en el campo del HPC: UAX.

3 años como programador Java: Iberia L.A.E.

Akka beginner!

Ingeniero Superior en Informática: URJC

@miguel_afd

Page 4: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Introducción

Page 5: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Una aplicación cualquieraIngentes cantidades de eventos en poco tiempo

Entornos distribuidos

Alta concurrencia

Paralelización

Llamadas no bloqueantes

Asincronismo

Tolerancia a fallos

Alta disponibilidad

Escalabilidad

Robustez

Page 6: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

¿Qué es Akka?Framework para el paso de mensajes de forma local o remota entre

entidades.

Modelo de actores

Futuros

Asincronismo

Ligero

Arquitectura P2P

Extensible

Modelo ”let it crash”

Scala & Java API

Licencia Apache

Page 7: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

¿Por qué Akka mola?Transacciones en tiempo real: 50 millones de mensajes por segundo /

máquina

Efectivo y ligero para una máquina, potente y robusto para entornos distribuidos

2.5 millones de actores → 1GB de memoria

Out-of-the-box vs Customizable

Paraleliza de forma transparente

Jerarquías de supervisión

Diferentes paradigmas de concurrencia

Asincronía “de gratis” (evita bloqueos)

Escala bajo demanda

Comunidad activa

Page 8: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Casos de usoFrameworks con comunicación distribuida:

Apache Spark

Play Framework

Gatling

Stratio Crossdata

Comercio online:Amazon

Ebay

Medios de comunicación:The guardian

BBC

BancaCredit Suisse

Page 9: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Ideas Generales

Page 10: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Sistema de actoresLos actores son objetos que contienen un estado y un

comportamiento, y se comunican a través de mensajes que se almacenan en sus buzones.

Organización con tareas, que se dividen en subtareas para ser asignadas a las diferentes personas.

Jerarquías para que otras personas actúen en caso de fallo de aquellas personas a las que supervisan.

Es una estructura pesada con 1...N hilos, ¡así que crea sólo uno por aplicación!

Los actores deben tener tareas independientes y dirigidos por eventos.

¡No pases objetos mutables!

Evita llamadas bloqueantes si es posible.

val system = ActorSystem(“HelloSystem”, config)val helloActor = system.actorOf(Props[HelloActor])

Page 11: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Actor Reference & Actor PathUn actorRef representa a un Actor y es una referencia para que otros actores le envíen mensajes y, además, se utiliza para que cada mensaje tenga un sender

helloActor ! Welcome(“Hello”)helloActor ! “Bienvenido”

Page 12: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Actor Selection

La operación actorSelection es la forma de conseguir el ActorRef de un Actor a partir de su ActorPath.

Para ello, hacemos uso del valor context, que es implícito en cada Actor.

val stallone = context.actorSelection(“akka.tcp://[email protected]:4321/user/silvester”)stallone ! Combate(“A muerte”)

Page 13: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Supervisión y Tolerancia a fallos class Odin extends Actor

override val supervisorStrategy = OneForOneStrategy() {

case _: FatalException => Stopcase _: OverheadException =>

Escalatecase _: AccessException => Restartcase _: ReachabilityException =>

Resume}

val thor = context.actorOf(Props[MiHijo])

}

Page 14: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Actores

Page 15: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

¿Qué es un actor?Un actor es un agente que solo sabe hacer 3 cosas:

Crear otros actores

Enviar y recibir mensajes

Actuar ante cada mensaje recibido

Procesamiento atómico

El actor transita de un estado a otro

Contento Triste

Mensaje = “Ya no te quiero para mi película”Sender = Spielberg

Procesamiento atómicoAcción1 = Llamo a mi representanteAcción2 = Encargo comida china

TomCruise TomCruise

class PingPongJugador extends Actor {def receive = {

case "Ping" => sender ! “Pong” case GolpeGanador() => CaraDeDecepcion()

}}

Mirando WhatsApp Mirando WhatsApp

Page 16: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Akka PropsClase proporcionada por Akka

orientada a la creación de actores mediante el paso de opciones que contienen información de configuración.

Es como una receta inmutable para crear actores con información asociada al despliegue del mismo.

object TomCruise {def props(edad: Int): Props =

Props(new TomCruise(edad))} class TomCruise(age: Int) extends Actor {def receive = { case _: String =>

sender() ! edad}} class SpielbergMovie extends Actor {context.actorOf(TomCruise.props(53),

"principal")}

Page 17: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Ciclo de vida de un Actor def preStart(): Unit = ()

def postStop(): Unit = () def preRestart(reason: Throwable,

message: Option[Any]): Unit = { context.children foreach { child ⇒

context.unwatch(child) context.stop(child) } postStop()}

def postRestart(reason: Throwable): Unit = { preStart()}

Page 18: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

MailboxesEstructura donde se acumulan los mensajes pendientes de ser

procesados por un actor.

Normalmente, 1 actor = 1 mailbox, pero hay estrategias donde varios instancias del mismo actor pueden compartir el mismo mailbox.

Puedes implementar tu propio mailbox.

Akka ofrece varios tipos de mailbox donde las 2 características más determinantes es si son Unbounded o no y si son Blocking o no.

UnboundedMailboxMailbox por defectoImplementado con

java.util.concurrent.ConcurrentLinkedQueue

Blocking: NoBounded: No

BoundedPriorityMailboxLos mensajes de mayor prioridad tienen preferenciaImplementado con java.util.PriorityQueueBlocking: NoBounded: Si

Page 19: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Ask, Tell & ForwardA la hora de enviar un mensaje a un actor, podemos seguir 3 estrategias:

Ask (?): Send-And-Receive-Future (hay una variante bloqueante)Tell (!): Fire-forgetForward: Es unTell ya que el actor que envía este mensaje actúa como

mediador, dado que para el destinatario de este mensaje, el sender será aquel que envió el mensaje al mediador.

implicit val timeout = Timeout(5 seconds)val futuro = actor ? msg val resultado = Await.result(futuro, timeout.duration)

implicit val timeout = Timeout(5 seconds)val futuro = actor ? msg futuro onSuccess { case “ACK” => println(“¡Bien hecho!”) }futuro onComplete { case Success(resultado) => guardarInfo(resultado)

case Failure(error) => registrarError(error) }futuro onFailure { case e: Exception => println(“Error: ¡Otra vez será!”) }

Tell Forward

Tell

Page 20: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

RoutersUn Router actúa como enrutador de una serie de actores.

El Router contiene el único mailbox y reparte las tareas entre los routees.

Puedes implementar tu propio Router aunque Akka ya proporciona varias implementaciones.

El Router supervisa a sus hijos y puede crear 2 tipos de estructuras:Pool: El Router crea los routees como hijos y los elimina según acaban sus tareas.

Group: Los routees son creados externamente y el Router envía los mensajes a estos routees mediante actorSelection y sin vigilar su terminación.

val emergencias: ActorRef = context.actorOf(RoundRobinPool(5).props(Props[Medico]), "hospital")

val suscriptores = List("/user/suscriptor/cliente1", "/user/suscriptor/cliente2")val periodico: ActorRef = context.actorOf(BroadcastGroup(suscriptores).props(), "LaComunidad")

Page 21: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Entornos distribuidos

Page 22: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Akka ClusterUn cluster está formado por uno o más nodos.

Tiene que haber al menos un nodo semilla.

Para que un nodo se una al cluster, debe conocer el host y el puerto de al menos de una de las semillas (Es aconsejable que se conozca más de una).

Organización descentralizada basada en servicios de suscripción sin único punto de fallo ni único cuello de botella.

Puede haber varios nodos en una misma máquina (hostname:port:uid).

Uno nodo semilla actúa como líder para la convergencia del cluster.

Protocolo Gossip para enviar información sobre el cluster.

Page 23: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Estados de un nodo

Page 24: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Akkaships

Page 25: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

https://github.com/jjlopezmAkkaships-Exercisegit clone https://github.com/jjlopezm/Akkaships-Exercise.git

Page 26: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Hora de programar

Page 27: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Player

Ship Ship Ship

RouterBoard

Statistics Statistics

Server

Discover Server

Autodiscover Board

NewPlayerDiscover Players

Autodiscover Statistics

PlayerPlayer

Router

Statistics

NewPlayer

Inicio del juego

Page 28: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Player

Ship Ship Ship

Router

Board

Statistics

Router

Statistics Statistics

shot

shot shotshot

shot/ship statistics

BoardUpdate

statistics statistics statistics

PlayerPlayer

Disparando

Page 29: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Board

Statistics

Router

Statistics Statistics

Fin de partida

FinishBattleScore

ScoreScoreResult

ScoreResult ¿Todos los barcos hundidos?Player

PlayerPlayer

Fin de la partida

Page 30: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

¡A jugar!

Page 31: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

Bajando el telón

Page 32: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

RecomendacionesCurso

https://www.coursera.org/course/reactive

Libros“Akka in Action” de Raymond Roestenburg y Rob Bakker“Akka Concurrency” de Derek Wyatt“Reactive Design Patterns” de Roland Kuhn y Jamie Allen

Soportehttps://groups.google.com/forum/#!forum/akka-user

http://doc.akka.io/docs/akka/2.4.0/scala.html

http://letitcrash.com/

http://orionsword.no-ip.org/

Page 33: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"
Page 34: Akkaships: "Primeros pasos con Akka: Olvídate de los threads"

¡Gracias!