SlideShare a Scribd company logo
1 of 52
Download to read offline
JVM Reactive Programming
Mexico City JVM Group
October 2016
domix
domix
coderDog
!Gracias por estar aqui¡
!Ya estamos en vivo¡
bit.ly/jm_live
La idea de ‘Live’
• Reuniones intermedias entre cada meetup
presencial en CDMX
• Para desarrolladores que no pueden asistir
• Para expositores nacionales o internacionales
• Esfuerzo paralelo a las actividades de JVM_MX
• YOLO
Anuncio parroquial
Nuevo libro por
Javeros Mexicanos
Raul Estrada (@BusinessRul)
Isaac Ruiz Guerra (@rugi)
bit.ly/book_smack
Reactive
Programming
Reactive Programming
• “Reactive Programming” es programar con flujos de
datos asíncronos.
• Flujo de datos (Data Stream): Una secuencia de valores
• Modelo de programación basado en el principio de
empujar (push) en lugar de obtener (pull).
• Los valores se “emiten” cuando están listos, no cuando
se solicitan de una forma no-bloqueante (non-blocking)
• Se permite ejecutar operaciones en paralelo en lugar de
forma serial.
Functional
Reactive Programming
• Functional programming
• https://maryrosecook.com/blog/post/a-practical-
introduction-to-functional-programming
• Lleva a Reactive Programming al siguiente nivel.
• Permute aplicar funciones al flujo de datos.
• map, filter, zip, take, etc..
• Integra flujo de tiempo y los eventos de composición en
la programación funcional.
ReactiveX
Reactive eXtensions
• Creado en Microsoft por Erik Meijer
• Colección de funciones útiles para hacer
programación reactiva.
• ReactiveX esta implementado en mas de 10
lenguajes.
• RxJava es la implementación de ReactiveX, fue
escrita por el equipo de Netflix
ReactiveX
• Observable: fuente de flujos de datos (sender).
• Observer: Escucha los valores emitidos (receiver)
• El Observer se suscribe (escucha) al Observable
• Los Observers reaccionan a cualquier elemento o
secuencias de elementos que emita el Observable
• Muchos Observers pueden suscribirse al mismo
Observable.
Observable Observer
Pattern
• Permite operaciones concurrentes: el Observer
no necesita bloquear mientras espera que el
Observable emita valores
• El Observer espera a recibir valores cuando el
Observable esta listo para emitirlos
• Sobre la base de empuje (push) en lugar de
obtener (pull)
RxJava
RxJava
• Proyecto Open Source con Licencia Apache.
• Implementación en Java de ReactiveX de
Microsoft
• El API de Netflix la usa para hacer la capa de
servicio completamente asíncrona.
• El objetivo es la JVM no el lenguaje.
• Existe soporte para Java, Groovy, Clojure, y Scala
RxJava Features
• Composable: Fácilmente se puede encadenar o
combinar
• Flexible: Se puede usar para emitir:
• Un valor escalar (network result)
• Secuencia (elementos en una lista)
• Flujos infinitos (sensores de clima)
• Mitiga el callback hell: Fácilmente se puede transformar
un flujo asíncrono en otro
Usando Iterables
• Antes de reactivo
1. Invocar un método
2. Esperar el resultado
3. Almacenar el resultado en una variable
4. Usar la variable para hacer algo util.
Usando Observables
1. Definir un Observer que especifica que hacer
con cada valor emitido
2. Invocar un método que regrese un Observable
3. Suscribirse el Observer al Observable. Esto le
dice al Observable que tiene un subscriptor
esperando a recibir valores cuando estén
disponibles.
En RxJava
• El método Subscribe conecta un Observer a un
Observable
• Una ves suscrito, no hay necesidad de bloquear
el hilo actual.
• Los valores llegaran al Observer cuando estén
listos y disponibles
Interface rx.Observer
public interface rx.Observer<T> {

void onCompleted();



void onError(Throwable e);



void onNext(T t);



}
void onCompleted();


/**

* Notifies the Observer that the
* {@link Observable} has finished sending
* push-based notifications.

* <p>

* The {@link Observable} will not call
* this method if it calls {@link #onError}.

*/

void onCompleted();
void onCompleted();
• El Observable invoca este método después de
que se invocó el método onNext por ultima
ocasión y no encontró ningún error.
• La llamada a onComplete finaliza la
subscripción.
void onError(Throwable e);
/**

* Notifies the Observer that the {@link Observable}
* has experienced an error condition.

* <p>

* If the {@link Observable} calls this method, it
* will not thereafter call {@link #onNext} or

* {@link #onCompleted}.

* 

* @param e

* the exception encountered by the
* Observable

*/

void onError(Throwable e);
void onError(Throwable e);
• El Observable invoca este método para indicar
que ha fallado al obtener la información
esperada o alguno otro problema.
• Esto detiene al Observable y no hará mas
invocaciones.
• Envía la excepción que genero el problema.
void onNext(T t)
/**

* Provides the Observer with a new item to observe.

* <p>

* The {@link Observable} may call this method 0 or
* more times.

* <p>

* The {@code Observable} will not call this method
* again after it calls either {@link #onCompleted}
* or {@link #onError}.

* 

* @param t

* the item emitted by the Observable

*/

void onNext(T t);
void onNext(T t)
• El Observable invoca este método cada vez que
el Observable emite un elemento.
• Este método puede ser invocado cualquier
número de veces (de cero a muchos).
• Siempre seguido por onError o onComplete
(pero no ambos)
Uso sencillo
public Observable<Double>
dollarToCurrencyExchangeRate(String targetCurrencyCode) {

// se crea de alguna manera el Observable

return ...

}
public void foo() {

dollarToCurrencyExchangeRate("MXN")

.subscribe(System.out::println);

}
Composing el Observable
public void foo() {

dollarToCurrencyExchangeRate("MXN")

.throttleWithTimeout(2, TimeUnit.MINUTES)

.distinctUntilChanged()

.filter(value -> value > 0)

.map(Object::toString)

.subscribe(System.out::println);

}

¿Como esta
implementado el Observable?
• ¿Tal vez ejecuta su lógica en el hilo del subscriptor?
• ¿Tal vez delega parte del trabajo a otros hilos?
• ¿Usará NIO?
• ¿Tal vez es un actor?
• ¿Devolverá datos de un cache?
• ¡Al Observer no le importa!
Consumiendo Observables
Modo largo…


rx.Observable.just(1, 2, 3)

.subscribe(new rx.Observer<Integer>() {

@Override

public void onCompleted() {

System.out.println("No más elementos.");

}



@Override

public void onError(Throwable e) {

System.out.println(

String.format("Ocurrio un problema: %s", e.getMessage()));

}



@Override

public void onNext(Integer integer) {

System.out.println(

String.format("Valor recibido: %d", integer));

}

});
Consumiendo Observables
Modo corto Java 8.


rx.Observable.just(1, 2, 3)

.subscribe(

value ->

System.out.println(

String.format("Valor recibido: %d", value)),

throwable ->

System.out.println(

String.format("Ocurrio un problema: %s",

throwable.getMessage())),

() -> System.out.println("No más elementos."));
Operadores doOn*
rx.Observable.just(1, 2, 3, 4, 5)

.doOnNext(value -> {

if (Integer.valueOf(4).equals(value)) {

throw new RuntimeException("El cuatro es feo.");

}

})

.doOnError(throwable -> System.out.println(

String.format("Ocurrio un problema: %s",

throwable.getMessage())))

.doOnCompleted(() ->
System.out.println("No más elementos."))

.subscribe(value ->

System.out.println(

String.format("Valor recibido: %d", value)));
Creando Observable
de forma explicita.
rx.Observable.<Integer>create(subscriber -> {

try {

for (int i = 0; i < 5; i++) {

subscriber.onNext(i);

}

// Si olvidamos invocar onCompleted se

// pueden crear Observables sin fin.

subscriber.onCompleted();

} catch (Throwable cause) {

subscriber.onError(cause);

}

});
Como crear Observables
Manipulando
Observable
Transformando data map
rx.Observable.just(1, 2, 3, 4, 5)

.map(value -> String
.format("Value: %s", value.toString()))

.subscribe(System.out::println);
Combinando Observables
Filtrando
Limitando elementos
Ejercicio 1
Implementar la kata
FizzBuzz
http://codingdojo.org/cgi-bin/index.pl?KataFizzBuzz
https://en.wikipedia.org/wiki/Fizz_buzz
Hasta el número 20
Backpressure
• ¿Que ocurre si un Observable esta emitiendo elementos más rápido de lo que
el Observer puede procesarlos?
• Cold Observable:
• Emite una secuencia particular de elementos, puede empezar a emitirla
cuando su Observer lo considere conveniente y a la tasa de entrega que el
Observer desee, sin interferir la integridad de la secuencia.
• Hot Observable:
• Es un Observable que empieza a generar elementos inmediatamente
cuando es creado. Los subscriptores pueden empezar a observar la
secuencia de elementos emitidos a la mitad de la secuencia, empezando
con el primer elemento emitido posterior al establecimiento de la
subscripción. Dicho Observable emite elementos a su propio ritmo y es
responsabilidad de los Observers mantener ese mismo ritmo.
Debounce
throttleFirst
throttleWithTimeout
List<Observable<byte[]>> observables =

//obtengo todas las instancias de los servicios

discoveryClient.getInstances("service_id").stream()

//Obtengo su URI remota (host:port)

.map(serviceInstance -> serviceInstance.getUri().toString())

//Genera un Worker que hará el trabajo de pedirle
//a cada instancia del servicio el archivo.
//DownloadCacheWorker implementa java.util.concurrent.Callable

.map(baseUrl -> new DownloadLocalCacheWorker(baseUrl, bucket, key))

//Genero un Future para hacerlo asíncrono

.map(callable ->
((ThreadPoolTaskExecutor) taskExecutor).submit(callable))

//Lo convierto a Observable para facilitar
//el manejo de errores

.map(Observable::from)

//Genero una lista de Observables

.collect(Collectors.toList());


//Genero un solo Observable a partir de todos

Observable.merge(observables)

//Si algo falla al obtener el archivo del
//servicio remoto, simplemente regreso null

.onErrorReturn(throwable -> {

log.warn("No se encontró algo", throwable);

return null;

}).doOnCompleted(() -> {})

//Descarto todos los null

.filter(fileContent -> fileContent != null)

//obtengo el primer resultado exitoso
//(en teoría solo debe existir en un solo servidor)

.firstOrDefault(null)

//hago la llamada bloqueante

.toBlocking()

//aplico la lógica de manejo del archivo

.subscribe(new DownloadLocalCacheObserver(response, key, notFound));

A seguir
• Project Reactor
• https://projectreactor.io/
• Akka
• http://akka.io/
• Reactive Streams
• http://www.reactive-streams.org/

More Related Content

What's hot

.NET Memoria y Rendimiento
.NET Memoria y Rendimiento.NET Memoria y Rendimiento
.NET Memoria y RendimientoEduard Tomàs
 
Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014Andrés Montañez
 
Codemotion 2015 - Akka.NET - EL modelo de actores
Codemotion 2015 - Akka.NET - EL modelo de actoresCodemotion 2015 - Akka.NET - EL modelo de actores
Codemotion 2015 - Akka.NET - EL modelo de actoresJavier García Magna
 
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
 
Keda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessKeda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessEduard Tomàs
 
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...Software Guru
 
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016Fernando Gandia
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxParadigma Digital
 
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de MavenIniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de MavenVíctor Leonel Orozco López
 
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Víctor Leonel Orozco López
 
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Iván López Martín
 
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaCommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaIván López Martín
 
Alta disponibilidad con Replicas de MySQL en AWS
Alta disponibilidad con Replicas de MySQL en AWSAlta disponibilidad con Replicas de MySQL en AWS
Alta disponibilidad con Replicas de MySQL en AWSNicola Strappazzon C.
 
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Víctor Leonel Orozco López
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.Paradigma Digital
 

What's hot (20)

.NET Memoria y Rendimiento
.NET Memoria y Rendimiento.NET Memoria y Rendimiento
.NET Memoria y Rendimiento
 
Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014Magallanes - PHPmvd Meet Up - Mayo 2014
Magallanes - PHPmvd Meet Up - Mayo 2014
 
Codemotion 2015 - Akka.NET - EL modelo de actores
Codemotion 2015 - Akka.NET - EL modelo de actoresCodemotion 2015 - Akka.NET - EL modelo de actores
Codemotion 2015 - Akka.NET - EL modelo de actores
 
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
 
Keda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en ServerlessKeda o como convertir Kubernetess en Serverless
Keda o como convertir Kubernetess en Serverless
 
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
Ciencia de redes con R: Una introducción al universo de paquetes para ciencia...
 
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
Fernando Gandia - Airflow - PyData Mallorca 18-10-2016
 
Tolerancia a fallas, service mesh y chassis
Tolerancia a fallas, service mesh y chassisTolerancia a fallas, service mesh y chassis
Tolerancia a fallas, service mesh y chassis
 
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptxDocker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
Docker, kubernetes, openshift y openstack, para mi abuela. techfest 2017.pptx
 
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de MavenIniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
Iniciando microservicios reales con JakartaEE/MicroProfile y arquetipos de Maven
 
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
 
Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)Mad scalability (perfomance debugging)
Mad scalability (perfomance debugging)
 
Introducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores JavaIntroducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores Java
 
Rendimiento extremo en php
Rendimiento extremo en phpRendimiento extremo en php
Rendimiento extremo en php
 
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
Codemotion Madrid 2019 - ¡GraalVM y Micronaut: compañeros perfectos!
 
Protocol HTTP
Protocol HTTPProtocol HTTP
Protocol HTTP
 
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfectaCommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
CommitConf 2019 - Micronaut y GraalVm: La combinación perfecta
 
Alta disponibilidad con Replicas de MySQL en AWS
Alta disponibilidad con Replicas de MySQL en AWSAlta disponibilidad con Replicas de MySQL en AWS
Alta disponibilidad con Replicas de MySQL en AWS
 
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
Actualizando aplicaciones empresariales en Java desde Java 8 on premise hasta...
 
Meetup de kubernetes, conceptos básicos.
Meetup  de kubernetes, conceptos básicos.Meetup  de kubernetes, conceptos básicos.
Meetup de kubernetes, conceptos básicos.
 

Similar to JVM Reactive Programming

Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasAgustin Ramos
 
Desarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallasDesarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallasSoftware Guru
 
Sistemas operativos unidad 2
Sistemas operativos unidad 2Sistemas operativos unidad 2
Sistemas operativos unidad 2Luis Cigarroa
 
UNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOSUNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOSSelqit Mgw
 
DefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJavaDefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJavaDanielCorzo12
 
Desarrollo web con JAVA: Introduccion a los Servlets
Desarrollo web con JAVA: Introduccion a los ServletsDesarrollo web con JAVA: Introduccion a los Servlets
Desarrollo web con JAVA: Introduccion a los ServletsJon Vadillo Romero
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
 
Sincronizacion de procesos
Sincronizacion de procesosSincronizacion de procesos
Sincronizacion de procesoskruskaya salazar
 
Introduccion a Programacion Reactiva
Introduccion a Programacion ReactivaIntroduccion a Programacion Reactiva
Introduccion a Programacion ReactivaAndres Almiray
 
programacion concurrente java.pptx
programacion concurrente java.pptxprogramacion concurrente java.pptx
programacion concurrente java.pptxjuan gonzalez
 
Evasión de Técnicas Forenses
Evasión de Técnicas ForensesEvasión de Técnicas Forenses
Evasión de Técnicas ForensesConferencias FIST
 

Similar to JVM Reactive Programming (20)

Concurrencia en Java
Concurrencia en Java Concurrencia en Java
Concurrencia en Java
 
Sistemas Tolerantes a Fallas
Sistemas Tolerantes a FallasSistemas Tolerantes a Fallas
Sistemas Tolerantes a Fallas
 
Desarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallasDesarrollo de sistemas tolerantes a fallas
Desarrollo de sistemas tolerantes a fallas
 
Rx js
Rx jsRx js
Rx js
 
Sistemas operativos unidad 2
Sistemas operativos unidad 2Sistemas operativos unidad 2
Sistemas operativos unidad 2
 
UNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOSUNIDAD II SISTEMAS OPERATIVOS
UNIDAD II SISTEMAS OPERATIVOS
 
DefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJavaDefinicionExplicacionEjemplosdeHilosenJava
DefinicionExplicacionEjemplosdeHilosenJava
 
Desarrollo web con JAVA: Introduccion a los Servlets
Desarrollo web con JAVA: Introduccion a los ServletsDesarrollo web con JAVA: Introduccion a los Servlets
Desarrollo web con JAVA: Introduccion a los Servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
servlets
servlets servlets
servlets
 
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAPARADIGMAS FP  Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONA
 
Sincronizacion de procesos
Sincronizacion de procesosSincronizacion de procesos
Sincronizacion de procesos
 
Procesos
ProcesosProcesos
Procesos
 
Ajax: introducción
Ajax: introducciónAjax: introducción
Ajax: introducción
 
Introduccion a Programacion Reactiva
Introduccion a Programacion ReactivaIntroduccion a Programacion Reactiva
Introduccion a Programacion Reactiva
 
programacion concurrente java.pptx
programacion concurrente java.pptxprogramacion concurrente java.pptx
programacion concurrente java.pptx
 
Evasión de Técnicas Forenses
Evasión de Técnicas ForensesEvasión de Técnicas Forenses
Evasión de Técnicas Forenses
 

More from Domingo Suarez Torres

Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de KubernetesCloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de KubernetesDomingo Suarez Torres
 
Java Dev Day 2019 No kuberneteen por convivir
Java Dev Day 2019  No kuberneteen por convivirJava Dev Day 2019  No kuberneteen por convivir
Java Dev Day 2019 No kuberneteen por convivirDomingo Suarez Torres
 
Retos en la arquitectura de Microservicios
Retos en la arquitectura de MicroserviciosRetos en la arquitectura de Microservicios
Retos en la arquitectura de MicroserviciosDomingo Suarez Torres
 
DevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
DevFest Lima Corriendo cargas e trabajo seguras en GKE con IstioDevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
DevFest Lima Corriendo cargas e trabajo seguras en GKE con IstioDomingo Suarez Torres
 
Cloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a KubernetesCloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a KubernetesDomingo Suarez Torres
 
Meetup DigitalOcean Cloud Native architecture
Meetup DigitalOcean Cloud Native architectureMeetup DigitalOcean Cloud Native architecture
Meetup DigitalOcean Cloud Native architectureDomingo Suarez Torres
 
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y EnvoyCloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y EnvoyDomingo Suarez Torres
 
Cloud Native Mexico Meetup enero 2018 Observability
Cloud Native Mexico Meetup enero 2018 ObservabilityCloud Native Mexico Meetup enero 2018 Observability
Cloud Native Mexico Meetup enero 2018 ObservabilityDomingo Suarez Torres
 
Orquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNextOrquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNextDomingo Suarez Torres
 
Webinar Arquitectura de Microservicios
Webinar Arquitectura de MicroserviciosWebinar Arquitectura de Microservicios
Webinar Arquitectura de MicroserviciosDomingo Suarez Torres
 
Elasticsearch JVM-MX Meetup April 2016
Elasticsearch JVM-MX Meetup April 2016Elasticsearch JVM-MX Meetup April 2016
Elasticsearch JVM-MX Meetup April 2016Domingo Suarez Torres
 

More from Domingo Suarez Torres (20)

Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de KubernetesCloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
Cloud Native MX Meetup - Asegurando tu Cluster de Kubernetes
 
Java Dev Day 2019 No kuberneteen por convivir
Java Dev Day 2019  No kuberneteen por convivirJava Dev Day 2019  No kuberneteen por convivir
Java Dev Day 2019 No kuberneteen por convivir
 
Contenedores 101 Digital Ocean CDMX
Contenedores 101 Digital Ocean CDMXContenedores 101 Digital Ocean CDMX
Contenedores 101 Digital Ocean CDMX
 
Retos en la arquitectura de Microservicios
Retos en la arquitectura de MicroserviciosRetos en la arquitectura de Microservicios
Retos en la arquitectura de Microservicios
 
Java Cloud Native Hack Nights GDL
Java Cloud Native Hack Nights GDLJava Cloud Native Hack Nights GDL
Java Cloud Native Hack Nights GDL
 
meetup digital ocean kubernetes
meetup digital ocean kubernetesmeetup digital ocean kubernetes
meetup digital ocean kubernetes
 
Peru JUG Micronaut & GraalVM
Peru JUG Micronaut & GraalVMPeru JUG Micronaut & GraalVM
Peru JUG Micronaut & GraalVM
 
DevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
DevFest Lima Corriendo cargas e trabajo seguras en GKE con IstioDevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
DevFest Lima Corriendo cargas e trabajo seguras en GKE con Istio
 
Cloud Native Development in the JVM
Cloud Native Development in the JVMCloud Native Development in the JVM
Cloud Native Development in the JVM
 
Cloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a KubernetesCloud Native Mexico - Introducción a Kubernetes
Cloud Native Mexico - Introducción a Kubernetes
 
Meetup DigitalOcean Cloud Native architecture
Meetup DigitalOcean Cloud Native architectureMeetup DigitalOcean Cloud Native architecture
Meetup DigitalOcean Cloud Native architecture
 
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y EnvoyCloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
Cloud Native Mexico Meetup de Marzo 2018 Service Mesh con Istio y Envoy
 
Cloud Native Mexico Meetup enero 2018 Observability
Cloud Native Mexico Meetup enero 2018 ObservabilityCloud Native Mexico Meetup enero 2018 Observability
Cloud Native Mexico Meetup enero 2018 Observability
 
Cloud Native Mexico Presentacion
Cloud Native Mexico PresentacionCloud Native Mexico Presentacion
Cloud Native Mexico Presentacion
 
gRPC: Beyond REST
gRPC: Beyond RESTgRPC: Beyond REST
gRPC: Beyond REST
 
Devops Landscape
Devops LandscapeDevops Landscape
Devops Landscape
 
Orquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNextOrquestación de contenedores con Kubernetes SGNext
Orquestación de contenedores con Kubernetes SGNext
 
SGNext Elasticsearch
SGNext ElasticsearchSGNext Elasticsearch
SGNext Elasticsearch
 
Webinar Arquitectura de Microservicios
Webinar Arquitectura de MicroserviciosWebinar Arquitectura de Microservicios
Webinar Arquitectura de Microservicios
 
Elasticsearch JVM-MX Meetup April 2016
Elasticsearch JVM-MX Meetup April 2016Elasticsearch JVM-MX Meetup April 2016
Elasticsearch JVM-MX Meetup April 2016
 

Recently uploaded

Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...JohnRamos830530
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanamcerpam
 
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
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfvladimiroflores1
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfAnnimoUno1
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxMiguelAtencio10
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estossgonzalezp1
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxAlan779941
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.FlorenciaCattelani
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21mariacbr99
 
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
 

Recently uploaded (11)

Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
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
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
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
 

JVM Reactive Programming

  • 1. JVM Reactive Programming Mexico City JVM Group October 2016 domix domix coderDog
  • 3. !Ya estamos en vivo¡
  • 5. La idea de ‘Live’ • Reuniones intermedias entre cada meetup presencial en CDMX • Para desarrolladores que no pueden asistir • Para expositores nacionales o internacionales • Esfuerzo paralelo a las actividades de JVM_MX • YOLO
  • 8. Raul Estrada (@BusinessRul) Isaac Ruiz Guerra (@rugi)
  • 9.
  • 12. Reactive Programming • “Reactive Programming” es programar con flujos de datos asíncronos. • Flujo de datos (Data Stream): Una secuencia de valores • Modelo de programación basado en el principio de empujar (push) en lugar de obtener (pull). • Los valores se “emiten” cuando están listos, no cuando se solicitan de una forma no-bloqueante (non-blocking) • Se permite ejecutar operaciones en paralelo en lugar de forma serial.
  • 13. Functional Reactive Programming • Functional programming • https://maryrosecook.com/blog/post/a-practical- introduction-to-functional-programming • Lleva a Reactive Programming al siguiente nivel. • Permute aplicar funciones al flujo de datos. • map, filter, zip, take, etc.. • Integra flujo de tiempo y los eventos de composición en la programación funcional.
  • 14. ReactiveX Reactive eXtensions • Creado en Microsoft por Erik Meijer • Colección de funciones útiles para hacer programación reactiva. • ReactiveX esta implementado en mas de 10 lenguajes. • RxJava es la implementación de ReactiveX, fue escrita por el equipo de Netflix
  • 15. ReactiveX • Observable: fuente de flujos de datos (sender). • Observer: Escucha los valores emitidos (receiver) • El Observer se suscribe (escucha) al Observable • Los Observers reaccionan a cualquier elemento o secuencias de elementos que emita el Observable • Muchos Observers pueden suscribirse al mismo Observable.
  • 16. Observable Observer Pattern • Permite operaciones concurrentes: el Observer no necesita bloquear mientras espera que el Observable emita valores • El Observer espera a recibir valores cuando el Observable esta listo para emitirlos • Sobre la base de empuje (push) en lugar de obtener (pull)
  • 18. RxJava • Proyecto Open Source con Licencia Apache. • Implementación en Java de ReactiveX de Microsoft • El API de Netflix la usa para hacer la capa de servicio completamente asíncrona. • El objetivo es la JVM no el lenguaje. • Existe soporte para Java, Groovy, Clojure, y Scala
  • 19. RxJava Features • Composable: Fácilmente se puede encadenar o combinar • Flexible: Se puede usar para emitir: • Un valor escalar (network result) • Secuencia (elementos en una lista) • Flujos infinitos (sensores de clima) • Mitiga el callback hell: Fácilmente se puede transformar un flujo asíncrono en otro
  • 20. Usando Iterables • Antes de reactivo 1. Invocar un método 2. Esperar el resultado 3. Almacenar el resultado en una variable 4. Usar la variable para hacer algo util.
  • 21. Usando Observables 1. Definir un Observer que especifica que hacer con cada valor emitido 2. Invocar un método que regrese un Observable 3. Suscribirse el Observer al Observable. Esto le dice al Observable que tiene un subscriptor esperando a recibir valores cuando estén disponibles.
  • 22. En RxJava • El método Subscribe conecta un Observer a un Observable • Una ves suscrito, no hay necesidad de bloquear el hilo actual. • Los valores llegaran al Observer cuando estén listos y disponibles
  • 23. Interface rx.Observer public interface rx.Observer<T> {
 void onCompleted();
 
 void onError(Throwable e);
 
 void onNext(T t);
 
 }
  • 24. void onCompleted(); 
 /**
 * Notifies the Observer that the * {@link Observable} has finished sending * push-based notifications.
 * <p>
 * The {@link Observable} will not call * this method if it calls {@link #onError}.
 */
 void onCompleted();
  • 25. void onCompleted(); • El Observable invoca este método después de que se invocó el método onNext por ultima ocasión y no encontró ningún error. • La llamada a onComplete finaliza la subscripción.
  • 26. void onError(Throwable e); /**
 * Notifies the Observer that the {@link Observable} * has experienced an error condition.
 * <p>
 * If the {@link Observable} calls this method, it * will not thereafter call {@link #onNext} or
 * {@link #onCompleted}.
 * 
 * @param e
 * the exception encountered by the * Observable
 */
 void onError(Throwable e);
  • 27. void onError(Throwable e); • El Observable invoca este método para indicar que ha fallado al obtener la información esperada o alguno otro problema. • Esto detiene al Observable y no hará mas invocaciones. • Envía la excepción que genero el problema.
  • 28. void onNext(T t) /**
 * Provides the Observer with a new item to observe.
 * <p>
 * The {@link Observable} may call this method 0 or * more times.
 * <p>
 * The {@code Observable} will not call this method * again after it calls either {@link #onCompleted} * or {@link #onError}.
 * 
 * @param t
 * the item emitted by the Observable
 */
 void onNext(T t);
  • 29. void onNext(T t) • El Observable invoca este método cada vez que el Observable emite un elemento. • Este método puede ser invocado cualquier número de veces (de cero a muchos). • Siempre seguido por onError o onComplete (pero no ambos)
  • 30. Uso sencillo public Observable<Double> dollarToCurrencyExchangeRate(String targetCurrencyCode) {
 // se crea de alguna manera el Observable
 return ...
 } public void foo() {
 dollarToCurrencyExchangeRate("MXN")
 .subscribe(System.out::println);
 }
  • 31. Composing el Observable public void foo() {
 dollarToCurrencyExchangeRate("MXN")
 .throttleWithTimeout(2, TimeUnit.MINUTES)
 .distinctUntilChanged()
 .filter(value -> value > 0)
 .map(Object::toString)
 .subscribe(System.out::println);
 }

  • 32. ¿Como esta implementado el Observable? • ¿Tal vez ejecuta su lógica en el hilo del subscriptor? • ¿Tal vez delega parte del trabajo a otros hilos? • ¿Usará NIO? • ¿Tal vez es un actor? • ¿Devolverá datos de un cache? • ¡Al Observer no le importa!
  • 33. Consumiendo Observables Modo largo… 
 rx.Observable.just(1, 2, 3)
 .subscribe(new rx.Observer<Integer>() {
 @Override
 public void onCompleted() {
 System.out.println("No más elementos.");
 }
 
 @Override
 public void onError(Throwable e) {
 System.out.println(
 String.format("Ocurrio un problema: %s", e.getMessage()));
 }
 
 @Override
 public void onNext(Integer integer) {
 System.out.println(
 String.format("Valor recibido: %d", integer));
 }
 });
  • 34. Consumiendo Observables Modo corto Java 8. 
 rx.Observable.just(1, 2, 3)
 .subscribe(
 value ->
 System.out.println(
 String.format("Valor recibido: %d", value)),
 throwable ->
 System.out.println(
 String.format("Ocurrio un problema: %s",
 throwable.getMessage())),
 () -> System.out.println("No más elementos."));
  • 35. Operadores doOn* rx.Observable.just(1, 2, 3, 4, 5)
 .doOnNext(value -> {
 if (Integer.valueOf(4).equals(value)) {
 throw new RuntimeException("El cuatro es feo.");
 }
 })
 .doOnError(throwable -> System.out.println(
 String.format("Ocurrio un problema: %s",
 throwable.getMessage())))
 .doOnCompleted(() -> System.out.println("No más elementos."))
 .subscribe(value ->
 System.out.println(
 String.format("Valor recibido: %d", value)));
  • 36.
  • 37. Creando Observable de forma explicita. rx.Observable.<Integer>create(subscriber -> {
 try {
 for (int i = 0; i < 5; i++) {
 subscriber.onNext(i);
 }
 // Si olvidamos invocar onCompleted se
 // pueden crear Observables sin fin.
 subscriber.onCompleted();
 } catch (Throwable cause) {
 subscriber.onError(cause);
 }
 });
  • 38.
  • 41. Transformando data map rx.Observable.just(1, 2, 3, 4, 5)
 .map(value -> String .format("Value: %s", value.toString()))
 .subscribe(System.out::println);
  • 45. Ejercicio 1 Implementar la kata FizzBuzz http://codingdojo.org/cgi-bin/index.pl?KataFizzBuzz https://en.wikipedia.org/wiki/Fizz_buzz Hasta el número 20
  • 46. Backpressure • ¿Que ocurre si un Observable esta emitiendo elementos más rápido de lo que el Observer puede procesarlos? • Cold Observable: • Emite una secuencia particular de elementos, puede empezar a emitirla cuando su Observer lo considere conveniente y a la tasa de entrega que el Observer desee, sin interferir la integridad de la secuencia. • Hot Observable: • Es un Observable que empieza a generar elementos inmediatamente cuando es creado. Los subscriptores pueden empezar a observar la secuencia de elementos emitidos a la mitad de la secuencia, empezando con el primer elemento emitido posterior al establecimiento de la subscripción. Dicho Observable emite elementos a su propio ritmo y es responsabilidad de los Observers mantener ese mismo ritmo.
  • 50. List<Observable<byte[]>> observables =
 //obtengo todas las instancias de los servicios
 discoveryClient.getInstances("service_id").stream()
 //Obtengo su URI remota (host:port)
 .map(serviceInstance -> serviceInstance.getUri().toString())
 //Genera un Worker que hará el trabajo de pedirle //a cada instancia del servicio el archivo. //DownloadCacheWorker implementa java.util.concurrent.Callable
 .map(baseUrl -> new DownloadLocalCacheWorker(baseUrl, bucket, key))
 //Genero un Future para hacerlo asíncrono
 .map(callable -> ((ThreadPoolTaskExecutor) taskExecutor).submit(callable))
 //Lo convierto a Observable para facilitar //el manejo de errores
 .map(Observable::from)
 //Genero una lista de Observables
 .collect(Collectors.toList());
  • 51. 
 //Genero un solo Observable a partir de todos
 Observable.merge(observables)
 //Si algo falla al obtener el archivo del //servicio remoto, simplemente regreso null
 .onErrorReturn(throwable -> {
 log.warn("No se encontró algo", throwable);
 return null;
 }).doOnCompleted(() -> {})
 //Descarto todos los null
 .filter(fileContent -> fileContent != null)
 //obtengo el primer resultado exitoso //(en teoría solo debe existir en un solo servidor)
 .firstOrDefault(null)
 //hago la llamada bloqueante
 .toBlocking()
 //aplico la lógica de manejo del archivo
 .subscribe(new DownloadLocalCacheObserver(response, key, notFound));

  • 52. A seguir • Project Reactor • https://projectreactor.io/ • Akka • http://akka.io/ • Reactive Streams • http://www.reactive-streams.org/