Desarrollando aplicaciones reactivas con Akka y Scala

33
ldo Taladriz @utaladriz utaladriz@e

Transcript of Desarrollando aplicaciones reactivas con Akka y Scala

Page 1: Desarrollando aplicaciones reactivas con Akka y Scala

Ubaldo Taladriz @utaladriz [email protected]

Page 2: Desarrollando aplicaciones reactivas con Akka y Scala
Page 3: Desarrollando aplicaciones reactivas con Akka y Scala
Page 4: Desarrollando aplicaciones reactivas con Akka y Scala

El modelo de actores• Modelo matemático de computación concurrente• Su primitiva es el Actor• Unidad fundamental de computación o cómputo• Basado en comunicaciones asíncronas• “La motivación era la posibilidad de realizar procesamiento paralelo

masivo en docenas, cientos o miles de microprocesadores, cada uno con su memoria local y procesador de comunicaciones, capaces de comunicarse a través de una red de alta velocidad”

Page 5: Desarrollando aplicaciones reactivas con Akka y Scala

El modelo de actores• Su filosofía, todo es un actor.• Un actor

• Procesa• Almacena• Comunica

• Un actor actúa frente al estímulo de un mensaje. Axiomas:• Crear nuevos actores• Enviar mensajes a actores conocidos• Cambiar su comportamiento para el siguiente mensaje

• Desacoplar el mensajero del receptor, fue el avance fundamental del modelo• Todo comunicación es asíncrona• El receptor es identificado a través de una dirección

Page 6: Desarrollando aplicaciones reactivas con Akka y Scala

El modelo de actor• Erlang adopta el modelo de actores• Un actor es una abstracción de concurrencia

• Threads• Locks• Un mensaje a la vez

• Una solución para el desafío de la programación multicore• Comunicación asíncrona a través de mensajes• Como la comunicación es asíncrona, poseen un mailbox para recibir mensajes• Pattern Matching de mensajes• Un actor mantiene su estado de manera interna

• Estado cambiable (Mutable state) es privado• Estado compartido no puede ser cambiado (immutable shared state)• Puede cambiar su estado a través de mensajes

Page 7: Desarrollando aplicaciones reactivas con Akka y Scala

Scala es un lenguaje de programación multi-paradigma, diseñado para expresar patrones comunes de programación en forma concisa, elegante y con tipos seguros. Integra características de lenguajes funcionales y orientados a objetos. Corre sobre la JVM y es compatible con las aplicaciones JAVA.

2003

object HolaMundo { def main(args: Array[String]) = println("Hola mundo") }

Page 8: Desarrollando aplicaciones reactivas con Akka y Scala

2006

Page 9: Desarrollando aplicaciones reactivas con Akka y Scala

Manifiesto Reactivo

Page 10: Desarrollando aplicaciones reactivas con Akka y Scala

Jonas Bonér, creador del proyecto AKKA, que cumplió 5 años, el 12 de Julio de 2014

Nace como un intento de portar Erlang OTP a Scala

Page 11: Desarrollando aplicaciones reactivas con Akka y Scala

AKKA• Diosa de la fertilidad, de la fuerza, de la sexualidad

femenina y de las cosechas en la mitología finlandesa y lapona• Casada con Ukko • Se decía que cuando copulaba con su marido se

provocaba la lluvia en la tierra. • Se le invocaba también para ritos de magia y canalización.• Era también el nombre que se utilizaba para cualquier

espíritu femenino tanto en la mitología finlandesa como la lapona.

Page 12: Desarrollando aplicaciones reactivas con Akka y Scala

Akka es un framekork y un ambiente de ejecución, para desarrollar aplicaciones con alta concurrencia, distribuidas, resilientes y basadas en mensajes, en la JVM

Page 13: Desarrollando aplicaciones reactivas con Akka y Scala

Mi primer Actor (Showtime)

Page 14: Desarrollando aplicaciones reactivas con Akka y Scala

Como funciona un actor

ActorSystem ActorRef

MessageDispatcher

Mailbox ActorMessageQueueInvocaRecupera

el mensaje

Ejecuta

Publica el mensaje

Despacha

Crea

Page 15: Desarrollando aplicaciones reactivas con Akka y Scala

Jerarquía/

User System

HelloWorldActor

Los actores se ordenan de manera jerárquica similar a un sistema de archivos

Page 16: Desarrollando aplicaciones reactivas con Akka y Scala

Consideraciones• No bloquear, no bloquear, no bloquear• Usar Futures para código bloqueante• Aísla el problema de la concurrencia, para escalar crear instancias

múltiples• Recordar es un mensaje a la vez• Deben seguir el principio de responsabilidad única• Son a prueba de fallas• Supervisores (Más adelante)

Page 17: Desarrollando aplicaciones reactivas con Akka y Scala

Rápido y Furioso 50 millones de msj/seg en una máquina

Bajísimo uso de memoria; ~2.5 millones de actores por cada GB de heap

1000 nodos en cluster < 4 minutos en GCP. Pruebas sobre 2400 nodos.

Page 18: Desarrollando aplicaciones reactivas con Akka y Scala

Actor Remoto (Showtime)

Page 19: Desarrollando aplicaciones reactivas con Akka y Scala

Tipos de aplicaciones

• Domain Driven/

Cliente 1 Cliente 2

Cuenta Corriente Tarjeta de CréditoCrédito Hipotecario Cuenta Corriente

Page 20: Desarrollando aplicaciones reactivas con Akka y Scala

Tipos de aplicaciones• Trabajo distribuido• Típicamente los actores son sin estado• El uso de routers, permite distribuir la carga entre distintas

instancias de actores y el enrutamiento• Groups y Pools (Ver clusters)

Page 21: Desarrollando aplicaciones reactivas con Akka y Scala

RandomPadre

Router

1 2 3 4 5

Page 22: Desarrollando aplicaciones reactivas con Akka y Scala

Round RobinPadre

Router

1 2 3 4 5

Page 23: Desarrollando aplicaciones reactivas con Akka y Scala

Smallest mailboxPadre

Router

1 2 3 4 5

Page 24: Desarrollando aplicaciones reactivas con Akka y Scala

BroadcastPadre

Router

1 2 3 4 5

Page 25: Desarrollando aplicaciones reactivas con Akka y Scala

Routers• ScatterGatherFirstCompletedOf• Se envía el mensaje a todas las instancias, pero solo la primera respuesta

es recibida, el resto se descarta.

• Consistent hash routing• Permite seleccionar la instancia de acuerdo a un hash.• Por ejemplo permite enviar a un actor cercano y así evitar latencia.

• BalancingDispatcher• Obsoleto !!!!

Page 26: Desarrollando aplicaciones reactivas con Akka y Scala

Event Bus

“Actor”Productor

“Actor”Tópico

“Actor”Suscriptor

“Actor”Suscriptor

“Actor”Suscriptor

1

1

1

Mensajes no eventos

Eventos son “hechos” que se publican en un tópico

Los sistemas basados en eventos, se focalizan en fuentes de eventos direccionables.

Un mensaje siempre tiene un receptor específico, puede ser un actor, un tópico o alguna otra cosa

Un mensaje puede tener como contenido, un evento (payload).

Los sistemas basados en mensajes, se focalizan en receptores direccionables.

2

Page 27: Desarrollando aplicaciones reactivas con Akka y Scala

Supervisor• Es el mecanismo para resiliencia o tolerancia a fallas• Basado en excepciones• Un supervisor puede:

• Escalar (Scalate)• Continuar (Resume)• Reiniciar (Restart)• Detener (Stop)

• … un actor• Y un supervisor es…, un actor

Page 28: Desarrollando aplicaciones reactivas con Akka y Scala

Supervisor• Existen una estrategia por omisión• Escalar se usa si la estrategia definida no maneja la excepción• Cuando no existe una estrategia para el supervisor las siguientes

excepciones son controladas por omisión:• ActorInitializationException detiene el actor hijo fallido• ActorKilledException detiene el actor hijo fallido• Exception reinicializa el hijo actor fallido.• Otro tipo de excepciones descendientes de Throwable son propagadass

al actor padre hasta llegar a la raíz, donde sino existen otras estrategias se ocupa la por omisión.

Page 29: Desarrollando aplicaciones reactivas con Akka y Scala

Cluster Miembro

Miembro

Líder

Semilla

Miembro

Semilla

Miembro

Miembro

Page 30: Desarrollando aplicaciones reactivas con Akka y Scala

Cluster• Nodo (Member Node)

• Un miembro lógico del cluster• Varios nodos por máquina• Definido por hostname:port:uid

• Membresía (Membership). Un conjunto de nodos agrupados a través del servicio de membresía.• Líder. Nodo único que actúa como líder, administra la convergencia del cluster y las

transiciones de estados de membresía.• Semilla (Seed Node). Las semillas son los puntos de contacto para los nuevos nodos

que se unen al cluster. • Gossip. La membresía del cluster está basada en Dynamo / Ryak. La membresía es

comunicada utilizado un protocolo Gossip (“Copuchento”), donde el estado es diseminado de manera aleatoria, con preferencia a los miembros que no han visto la última versión

Page 31: Desarrollando aplicaciones reactivas con Akka y Scala

Become• “Cambiar su comportamiento para el siguiente mensaje”

class Bipolar extends Actor {import context._

def enojado: Receive = {case "foo" => sender() ! ”Ya estoy enojado :-|"case "bar" => become(feliz)case _ => unbecome()

def feliz: Receive = {case "bar" => sender() ! ”Ya esto feliz :-)"case "foo" => become(enojado)case _ => unbecome()

def receive = {case "foo" => become(enojado)case "bar" => become(feliz)

}}

Page 32: Desarrollando aplicaciones reactivas con Akka y Scala

Algunos Módulos• akka-persistence• akka-stream• akka-http• akka-camel• fsm

Page 33: Desarrollando aplicaciones reactivas con Akka y Scala