SlideShare una empresa de Scribd logo
1 de 59
Descargar para leer sin conexión
Programación reactiva con Vert.xProgramación reactiva con Vert.x
¿Quién soy?¿Quién soy?
{
"name":"Fran García",
"email":"fgarciarico@gmail.com",
"twitter":"@frangarcia",
"linkedin":"https://www.linkedin.com/in/frangarcia/",
"position":"Ingeniero de Software Senior en Wayin",
"description":"Desde 2014 con Vert.x"
}
Contexto actualContexto actual
Fuente: https://www.ericsson.com
SoluciónSolución
Aprovechemos mejor los recursos.
Programación reactivaProgramación reactiva
¿Qué es la programación reactiva?¿Qué es la programación reactiva?
Se refiere a un paradigma de programación enfocado
al tratamiento de flujos de datos de forma asíncrona
tal y como se recoge en el Reactive Manifesto
http://www.reactivemanifesto.org
Principios del Reactive ManifestoPrincipios del Reactive Manifesto
Responsivos
Resilientes
Elásticos
Orientados a Mensajes
ResponsivosResponsivos
Responder de manera oportuna
Detectar problemas rápidamente
Tiempos de respuesta rápidos
ResilientesResilientes
Responder correctamente a fallos
Replicación
Aislamiento
ElásticosElásticos
Siempre responsivo ante diferentes niveles de
carga
Reaccionar a los cambios
Evitar cuellos de botella
Orientados a MensajesOrientados a Mensajes
Intercambio de mensajes asíncronos
Bajo acoplamiento
Aislamiento
Arquitectura del Manifiesto de SistemasArquitectura del Manifiesto de Sistemas
ReactivosReactivos
Responsive
Resilient
Message Driven
Elastic
Fuente: http://www.reactivemanifesto.org
Hollywood PrincipleHollywood Principle
Fuente: https://dzone.com/articles/the-hollywood-
principle
¿Qué es Vert.x?¿Qué es Vert.x?
Eclipse Vert.x ( ) es un conjunto de
utilidades (no un framework) basado en 2 conceptos
Diseño dirigido por los eventos
Es NO bloqueante
http://vertx.io
Características de Vert.xCaracterísticas de Vert.x
Propósito general
Políglota
Java
Javascript
Groovy
Ruby
Ceylon
Scala
Kotlin
Escalabilidad
No dogmático
Características de Vert.xCaracterísticas de Vert.x
Muy ligero
Rápido
No es un servidor de aplicaciones
Modular
Sencillo pero no simplista
Ideal para microservicios
Buenísima documentación
¿Quién utiliza Vert.x?¿Quién utiliza Vert.x?
Instalación de Vert.xInstalación de Vert.x
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install vertx
Vert.x coreVert.x core
Clientes y servidores TCP
Clientes y servidores HTTP
Websockets
Event bus
Datos compartidos
Acciones periódicas
Desplegar verticles
Clientes DNS
Acceso al sistema de ficheros
Alta disponibilidad
Clustering
IntegraciónIntegración
MySQL
PostgreSQL
Elasticsearch
Redis
Kafka
¿Qué es el event loop?¿Qué es el event loop?
¿Tenemos algún evento que procesar?
Lo proceso y llamo a los handlers necesarios
Y así constantemente
Tantos hilos de event loop como número de
núcleos * 2
Event loopEvent loop
Fuente: http://escoffier.me/vertx-kubernetes/
Event loopEvent loop
Fuente: http://www.vertx.io
¿Igual que Node.js?¿Igual que Node.js?
Node.js utiliza un único event loop mientras que Vert.x
utiliza un event loop por cada core multiplicado por
dos. Esto se conoce como Multi-Reactor Pattern.
La regla de oroLa regla de oro
!!No bloquees el event loop!!
Ejemplos de bloquear el event loopEjemplos de bloquear el event loop
Thread.sleep()
Costosas operaciones con bases de datos
Cálculos complejos que tarden mucho
Ejecutar código bloqueanteEjecutar código bloqueante
vertx.executeBlocking({ future ->
// Llama a métodos bloqueantes
def result = someAPI.blockingMethod("hello")
future.complete(result)
}, { res ->
println("The result is: ${res.result()}")
})
Talk is cheap, show me the codeTalk is cheap, show me the code
Fuente: Recruiting daily
Ejemplo: Hello world!Ejemplo: Hello world!
vertx run s01e01.groovy
import io.vertx.core.http.HttpServer
HttpServer httpServer = vertx.createHttpServer()
//Responder a cada petición con un Hello World!
httpServer.requestHandler({ request ->
// Este handler será llamado con una petición al servidor
request.response().end("hello world!")
})
httpServer.listen(8080)
Ejemplo: Devolviendo JsonEjemplo: Devolviendo Json
vertx run s01e02.groovy
import io.vertx.core.http.HttpServer
HttpServer httpServer = vertx.createHttpServer()
//Responder a cada petición con un Hello World!
httpServer.requestHandler({ request ->
String json = """{"foo":"bar"}"""
request.response()
.putHeader("Content-Type", "application/json")
.putHeader("Content-Length",json.size().toString())
.write(json)
.end()
})
httpServer.listen(8080)
Ejemplo: Ejecuciones periódicasEjemplo: Ejecuciones periódicas
vertx run s01e03.groovy
vertx.setPeriodic(1000, {id ->
println("Temporizador ejecutado! ${id}")
})
Ejemplo: TemporizadoresEjemplo: Temporizadores
vertx run s01e04.groovy
Closure handler
handler = { id ->
println("Temporizador ejecutado! ${id}")
vertx.setTimer(1000*(id+1), handler)
}
vertx.setTimer(1000, handler)
VerticlesVerticles
Suponen el corazón de Vert.x
Aunque no estás obligado a utilizarlos
Una aplicación consiste habitualmente en
muchos verticles ejecutándose simultáneamente
en una instancia de Vert.x
Escribiendo verticlesEscribiendo verticles
En un Groovy script
En una clase Groovy que implementa la interfaz
o extiende la claseVerticle AbstractVerticle
Desplegando verticlesDesplegando verticles
vertx run s01e05.groovy
vertx.deployVerticle("HelloWorldHttpVerticle.groovy")
vertx.deployVerticle("s01e06.groovy")
Desplegando verticles:Desplegando verticles:
HelloWorldHttpVerticle.groovyHelloWorldHttpVerticle.groovy
import io.vertx.core.AbstractVerticle
public class HelloWorldHttpVerticle extends AbstractVerticle {
public void start() {
println("Starting HelloWorldHttpVerticle")
}
public void stop() {
println("Stopping HelloWorldHttpVerticle")
}
}
Desplegando verticles: s01e06.groovyDesplegando verticles: s01e06.groovy
void vertxStart() {
println "starting s01e06"
}
void vertxStop() {
println "stopping s01e06"
}
Desplegando verticles de formaDesplegando verticles de forma
asíncronaasíncrona
vertx run s01e07.groovy
import io.vertx.core.Future
void vertxStart(Future future) {
vertx.deployVerticle("s01e06.groovy", { res ->
if (res.succeeded()) {
println "s01e06 started successfully asynchronously"
future.complete()
} else {
println "error starting s01e06 asynchronously"
future.fail("Error starting s01e06")
}
})
}
void vertxStop(Future future) {
Desplegando verticles de formaDesplegando verticles de forma
asíncronaasíncrona
vertx run HelloWorldHttpVerticleAsync.groovy
import io.vertx.core.AbstractVerticle
import io.vertx.core.Future
public class HelloWorldHttpVerticleAsync extends AbstractVerti
public void start(Future future) {
println "starting"
vertx.deployVerticle("s01e06.groovy", { res ->
if (res.succeeded()) {
println "s01e06 started successfully asynchronously"
future.complete()
} else {
println "s01e06 not started asynchronously due to an e
future.fail()
}
Desplegando verticles con variasDesplegando verticles con varias
instanciasinstancias
vertx run s01e08.groovy
vertx.deployVerticle("HelloWorldHttpVerticle.groovy", [instanc
Tipos de verticlesTipos de verticles
Standard
Worker
Multi-Threaded
Standard verticlesStandard verticles
Se asigna un event loop cuando se crean
Vert.x garantiza que cualquier código de estos
verticles siempre se ejecutará en el mismo event
loop
De esta forma, escribe tu aplicación como si fuera
monohilo que Vert.x ya se encargará de hacerlo
multihilo y de la escalabilidad
Worker verticlesWorker verticles
No utilizan el event loop
Utilizan un thread del pool de threads de Vert.x
Están diseñados para ejecutar código bloqueante
def options = [
worker:true
]
vertx.deployVerticle("MyFirstVerticle", options)
Multi-thread worker verticlesMulti-thread worker verticles
Como un worker verticle pero que puede ser
ejecutado en multiples threads
Event busEvent bus
Es el sistema nervioso de Vert.x
Un unico event bus para cualquier verticle
Es la mejor forma de comunicar verticles en Vert.x
¿Cómo funciona el Event bus?¿Cómo funciona el Event bus?
Mandamos mensaje a una dirección, e.g.
europe.news.feed
Los mensajes son simples cadenas de texto
Los handlers reciben los mensajes, pero antes
habrá que registrarlos
Varios handlers pueden estar suscritos en una
misma dirección
Un mismo handler puede estar suscritos en varias
direcciones
Tipos de subscripciónTipos de subscripción
Publish/Subscribe
Punto a punto
Tipos de subscripción:Tipos de subscripción:
Publish/SubscribePublish/Subscribe
Todos los handlers suscritos a una dirección recibirán
el mensaje.
Tipos de suscripción: Punto a puntoTipos de suscripción: Punto a punto
Vert.x se encargará de que sólo un handler reciba el
mensaje. Se puede especificar incluso un reply
handler.
Tipos de mensajes en el event busTipos de mensajes en el event bus
Normalmente se utiliza Json, aunque no estamos
forzados a ello.
Registrando handlersRegistrando handlers
def eb = vertx.eventBus()
eb.consumer("news.uk.sport", { message ->
println("I have received a message: ${message.body()}")
})
Ejemplo: Publish/SubscribeEjemplo: Publish/Subscribe
vertx run PublishingMessage.groovy
import io.vertx.core.http.HttpServer
def eventBus = vertx.eventBus()
eventBus.consumer("news.uk.sport", { message ->
println("EH1: I have received a message: ${message.body()}")
})
eventBus.consumer("news.uk.sport", { message ->
println("EH2: I have received a message: ${message.body()}")
})
HttpServer httpServer = vertx.createHttpServer()
httpServer.requestHandler({ request ->
Ejemplo: Punto a puntoEjemplo: Punto a punto
vertx run PointToPointExample.groovy
import io.vertx.core.http.HttpServer
def eventBus = vertx.eventBus()
eventBus.consumer("news.uk.sport", { message ->
println("EH1: I have received a message: ${message.body()}")
})
eventBus.consumer("news.uk.sport", { message ->
println("EH2: I have received a message: ${message.body()}")
})
HttpServer httpServer = vertx.createHttpServer()
httpServer.requestHandler({ request ->
Ejemplo: Respondiendo al eventoEjemplo: Respondiendo al evento
vertx run EventReplyExample.groovy
import io.vertx.core.http.HttpServer
def eventBus = vertx.eventBus()
eventBus.consumer("news.uk.sport", { message ->
println("I have received a message: ${message.body()}")
message.reply("Event received, thanks!")
})
HttpServer httpServer = vertx.createHttpServer()
httpServer.requestHandler({ request ->
eventBus.send("news.uk.sport", "Yay! Someone kicked a ball",
if (ar.succeeded()) {
request.response().end("This is what we received: "${ar
} else {
request.response().end("There was an error")
EjercicioEjercicio
Si sólo conocieramos Eclipse Vert.x, ¿como
diseñaríamos la arquitectura de un servicio para
registrar usuarios que necesita mandar un mail de
confirmación a través de un servicio externo y al
mismo tiempo el nuevo usuario debe ser añadido a
otro servicio externo?
Demo: JuegoDemo: Juego
https://bit.ly/2PKs75P
Más informaciónMás información
https://vertx.io/
https://groups.google.com/forum/#!forum/vertx
Fuente: https://velvetyblog.com
¿Preguntas?¿Preguntas?

Más contenido relacionado

La actualidad más candente

Designing APIs and Microservices Using Domain-Driven Design
Designing APIs and Microservices Using Domain-Driven DesignDesigning APIs and Microservices Using Domain-Driven Design
Designing APIs and Microservices Using Domain-Driven DesignLaunchAny
 
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023Sam Brannen
 
Microsoft Azure Data Factory Hands-On Lab Overview Slides
Microsoft Azure Data Factory Hands-On Lab Overview SlidesMicrosoft Azure Data Factory Hands-On Lab Overview Slides
Microsoft Azure Data Factory Hands-On Lab Overview SlidesMark Kromer
 
Oracle zdm Migrate Amazon RDS Oracle to Oracle Autonomous 2021 Kamalesh Ramas...
Oracle zdm Migrate Amazon RDS Oracle to Oracle Autonomous 2021 Kamalesh Ramas...Oracle zdm Migrate Amazon RDS Oracle to Oracle Autonomous 2021 Kamalesh Ramas...
Oracle zdm Migrate Amazon RDS Oracle to Oracle Autonomous 2021 Kamalesh Ramas...Kamalesh Ramasamy
 
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking VN
 
SSO With APEX and ADFS the weblogic way
SSO With APEX and ADFS the weblogic waySSO With APEX and ADFS the weblogic way
SSO With APEX and ADFS the weblogic waymakker_nl
 
Vert.x for Microservices Architecture
Vert.x for Microservices ArchitectureVert.x for Microservices Architecture
Vert.x for Microservices ArchitectureIdan Fridman
 
Introdução ao Spring Framework
Introdução ao Spring FrameworkIntrodução ao Spring Framework
Introdução ao Spring FrameworkNatanael Fonseca
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Chris Richardson
 
High Concurrency Architecture at TIKI
High Concurrency Architecture at TIKIHigh Concurrency Architecture at TIKI
High Concurrency Architecture at TIKINghia Minh
 
InfiniFlux vs influxdb 비교 테스트 결과 2016 12월-v2
InfiniFlux vs influxdb 비교 테스트 결과 2016 12월-v2InfiniFlux vs influxdb 비교 테스트 결과 2016 12월-v2
InfiniFlux vs influxdb 비교 테스트 결과 2016 12월-v2Andrew Sungjin Kim
 
Linux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQLLinux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQLYoshinori Matsunobu
 
ELK stack introduction
ELK stack introduction ELK stack introduction
ELK stack introduction abenyeung1
 
Intro to Elasticsearch
Intro to ElasticsearchIntro to Elasticsearch
Intro to ElasticsearchClifford James
 

La actualidad más candente (20)

Designing APIs and Microservices Using Domain-Driven Design
Designing APIs and Microservices Using Domain-Driven DesignDesigning APIs and Microservices Using Domain-Driven Design
Designing APIs and Microservices Using Domain-Driven Design
 
IBM BPM & ODM
IBM BPM & ODMIBM BPM & ODM
IBM BPM & ODM
 
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
Testing with Spring, AOT, GraalVM, and JUnit 5 - Spring I/O 2023
 
Microsoft Azure Data Factory Hands-On Lab Overview Slides
Microsoft Azure Data Factory Hands-On Lab Overview SlidesMicrosoft Azure Data Factory Hands-On Lab Overview Slides
Microsoft Azure Data Factory Hands-On Lab Overview Slides
 
Oracle zdm Migrate Amazon RDS Oracle to Oracle Autonomous 2021 Kamalesh Ramas...
Oracle zdm Migrate Amazon RDS Oracle to Oracle Autonomous 2021 Kamalesh Ramas...Oracle zdm Migrate Amazon RDS Oracle to Oracle Autonomous 2021 Kamalesh Ramas...
Oracle zdm Migrate Amazon RDS Oracle to Oracle Autonomous 2021 Kamalesh Ramas...
 
Grokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKIGrokking TechTalk #33: High Concurrency Architecture at TIKI
Grokking TechTalk #33: High Concurrency Architecture at TIKI
 
SSO With APEX and ADFS the weblogic way
SSO With APEX and ADFS the weblogic waySSO With APEX and ADFS the weblogic way
SSO With APEX and ADFS the weblogic way
 
Domain Driven Design
Domain Driven Design Domain Driven Design
Domain Driven Design
 
Elk - An introduction
Elk - An introductionElk - An introduction
Elk - An introduction
 
Vert.x for Microservices Architecture
Vert.x for Microservices ArchitectureVert.x for Microservices Architecture
Vert.x for Microservices Architecture
 
Introduction to microservices
Introduction to microservicesIntroduction to microservices
Introduction to microservices
 
Introdução ao Spring Framework
Introdução ao Spring FrameworkIntrodução ao Spring Framework
Introdução ao Spring Framework
 
Data Stores @ Netflix
Data Stores @ NetflixData Stores @ Netflix
Data Stores @ Netflix
 
Masterclass - Redshift
Masterclass - RedshiftMasterclass - Redshift
Masterclass - Redshift
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)
 
High Concurrency Architecture at TIKI
High Concurrency Architecture at TIKIHigh Concurrency Architecture at TIKI
High Concurrency Architecture at TIKI
 
InfiniFlux vs influxdb 비교 테스트 결과 2016 12월-v2
InfiniFlux vs influxdb 비교 테스트 결과 2016 12월-v2InfiniFlux vs influxdb 비교 테스트 결과 2016 12월-v2
InfiniFlux vs influxdb 비교 테스트 결과 2016 12월-v2
 
Linux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQLLinux and H/W optimizations for MySQL
Linux and H/W optimizations for MySQL
 
ELK stack introduction
ELK stack introduction ELK stack introduction
ELK stack introduction
 
Intro to Elasticsearch
Intro to ElasticsearchIntro to Elasticsearch
Intro to Elasticsearch
 

Similar a Programación reactiva con Vert.x

Node.js - un poco de informacion.
Node.js - un poco de informacion.Node.js - un poco de informacion.
Node.js - un poco de informacion.Luis Toscano
 
Creación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y ExpressCreación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y Expressbetabeers
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microserviciosPedro J. Molina
 
Desarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo QuilónDesarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo Quilónbetabeers
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJSBEEVA_es
 
Node Js & 3D Printer
Node Js & 3D PrinterNode Js & 3D Printer
Node Js & 3D Printernanusefue
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchezsamo509
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchezsamo509
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchezsamo509
 
Presentacion #bbmnk
Presentacion #bbmnkPresentacion #bbmnk
Presentacion #bbmnkJuan Miqueo
 
Inyección de dependencias en Node.js con InversifyJS & TypeScript
Inyección de dependencias en Node.js con  InversifyJS & TypeScriptInyección de dependencias en Node.js con  InversifyJS & TypeScript
Inyección de dependencias en Node.js con InversifyJS & TypeScriptRemo Jansen
 

Similar a Programación reactiva con Vert.x (20)

Guía JavaScript
Guía JavaScriptGuía JavaScript
Guía JavaScript
 
Presentacion node
Presentacion nodePresentacion node
Presentacion node
 
Node.js - un poco de informacion.
Node.js - un poco de informacion.Node.js - un poco de informacion.
Node.js - un poco de informacion.
 
Creación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y ExpressCreación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y Express
 
Tecnologías para microservicios
Tecnologías para microserviciosTecnologías para microservicios
Tecnologías para microservicios
 
Desarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo QuilónDesarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo Quilón
 
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
 
Introducción a NodeJS
Introducción a NodeJSIntroducción a NodeJS
Introducción a NodeJS
 
Node Js & 3D Printer
Node Js & 3D PrinterNode Js & 3D Printer
Node Js & 3D Printer
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchez
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchez
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchez
 
Samuel bailon sanchez
Samuel bailon sanchezSamuel bailon sanchez
Samuel bailon sanchez
 
Php!
Php!Php!
Php!
 
JVM Reactive Programming
JVM Reactive ProgrammingJVM Reactive Programming
JVM Reactive Programming
 
Presentacion #bbmnk
Presentacion #bbmnkPresentacion #bbmnk
Presentacion #bbmnk
 
Inyección de dependencias en Node.js con InversifyJS & TypeScript
Inyección de dependencias en Node.js con  InversifyJS & TypeScriptInyección de dependencias en Node.js con  InversifyJS & TypeScript
Inyección de dependencias en Node.js con InversifyJS & TypeScript
 

Último

hitos del desarrollo psicomotor en niños.docx
hitos del desarrollo psicomotor en niños.docxhitos del desarrollo psicomotor en niños.docx
hitos del desarrollo psicomotor en niños.docxMarcelaArancibiaRojo
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxClaudiaPerez86192
 
Unidad 3 Administracion de inventarios.pptx
Unidad 3 Administracion de inventarios.pptxUnidad 3 Administracion de inventarios.pptx
Unidad 3 Administracion de inventarios.pptxEverardoRuiz8
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)ssuser563c56
 
Reporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpacaReporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpacajeremiasnifla
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdfAnthonyTiclia
 
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptaCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptCRISTOFERSERGIOCANAL
 
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIPSEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIPJosLuisFrancoCaldern
 
sistema de construcción Drywall semana 7
sistema de construcción Drywall semana 7sistema de construcción Drywall semana 7
sistema de construcción Drywall semana 7luisanthonycarrascos
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdfevin1703e
 
El proyecto “ITC SE Lambayeque Norte 220 kV con seccionamiento de la LT 220 kV
El proyecto “ITC SE Lambayeque Norte 220 kV con seccionamiento de la LT 220 kVEl proyecto “ITC SE Lambayeque Norte 220 kV con seccionamiento de la LT 220 kV
El proyecto “ITC SE Lambayeque Norte 220 kV con seccionamiento de la LT 220 kVSebastianPaez47
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdffredyflores58
 
Calavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfCalavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfyoseka196
 
Manual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfManual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfedsonzav8
 
presentacion medidas de seguridad riesgo eléctrico
presentacion medidas de seguridad riesgo eléctricopresentacion medidas de seguridad riesgo eléctrico
presentacion medidas de seguridad riesgo eléctricoalexcala5
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfKEVINYOICIAQUINOSORI
 
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASTEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASfranzEmersonMAMANIOC
 
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...RichardRivas28
 
clases de dinamica ejercicios preuniversitarios.pdf
clases de dinamica ejercicios preuniversitarios.pdfclases de dinamica ejercicios preuniversitarios.pdf
clases de dinamica ejercicios preuniversitarios.pdfDanielaVelasquez553560
 
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdfTAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdfAntonioGonzalezIzqui
 

Último (20)

hitos del desarrollo psicomotor en niños.docx
hitos del desarrollo psicomotor en niños.docxhitos del desarrollo psicomotor en niños.docx
hitos del desarrollo psicomotor en niños.docx
 
Comite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptxComite Operativo Ciberseguridad 012020.pptx
Comite Operativo Ciberseguridad 012020.pptx
 
Unidad 3 Administracion de inventarios.pptx
Unidad 3 Administracion de inventarios.pptxUnidad 3 Administracion de inventarios.pptx
Unidad 3 Administracion de inventarios.pptx
 
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)Voladura Controlada  Sobrexcavación (como se lleva a cabo una voladura)
Voladura Controlada Sobrexcavación (como se lleva a cabo una voladura)
 
Reporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpacaReporte de Exportaciones de Fibra de alpaca
Reporte de Exportaciones de Fibra de alpaca
 
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
2. UPN PPT - SEMANA 02 GESTION DE PROYECTOS MG CHERYL QUEZADA(1).pdf
 
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.pptaCARGA y FUERZA UNI 19 marzo 2024-22.ppt
aCARGA y FUERZA UNI 19 marzo 2024-22.ppt
 
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIPSEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
SEGURIDAD EN CONSTRUCCION PPT PARA EL CIP
 
sistema de construcción Drywall semana 7
sistema de construcción Drywall semana 7sistema de construcción Drywall semana 7
sistema de construcción Drywall semana 7
 
Residente de obra y sus funciones que realiza .pdf
Residente de obra y sus funciones que realiza  .pdfResidente de obra y sus funciones que realiza  .pdf
Residente de obra y sus funciones que realiza .pdf
 
El proyecto “ITC SE Lambayeque Norte 220 kV con seccionamiento de la LT 220 kV
El proyecto “ITC SE Lambayeque Norte 220 kV con seccionamiento de la LT 220 kVEl proyecto “ITC SE Lambayeque Norte 220 kV con seccionamiento de la LT 220 kV
El proyecto “ITC SE Lambayeque Norte 220 kV con seccionamiento de la LT 220 kV
 
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdfECONOMIA APLICADA SEMANA 555555555555555555.pdf
ECONOMIA APLICADA SEMANA 555555555555555555.pdf
 
Calavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdfCalavera calculo de estructuras de cimentacion.pdf
Calavera calculo de estructuras de cimentacion.pdf
 
Manual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdfManual_Identificación_Geoformas_140627.pdf
Manual_Identificación_Geoformas_140627.pdf
 
presentacion medidas de seguridad riesgo eléctrico
presentacion medidas de seguridad riesgo eléctricopresentacion medidas de seguridad riesgo eléctrico
presentacion medidas de seguridad riesgo eléctrico
 
Elaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdfElaboración de la estructura del ADN y ARN en papel.pdf
Elaboración de la estructura del ADN y ARN en papel.pdf
 
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIASTEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
TEXTURA Y DETERMINACION DE ROCAS SEDIMENTARIAS
 
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...Rendimiento-de-Maquinaria y precios unitarios  para la construcción de una ma...
Rendimiento-de-Maquinaria y precios unitarios para la construcción de una ma...
 
clases de dinamica ejercicios preuniversitarios.pdf
clases de dinamica ejercicios preuniversitarios.pdfclases de dinamica ejercicios preuniversitarios.pdf
clases de dinamica ejercicios preuniversitarios.pdf
 
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdfTAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
TAREA 8 CORREDOR INTEROCEÁNICO DEL PAÍS.pdf
 

Programación reactiva con Vert.x

  • 1. Programación reactiva con Vert.xProgramación reactiva con Vert.x
  • 2. ¿Quién soy?¿Quién soy? { "name":"Fran García", "email":"fgarciarico@gmail.com", "twitter":"@frangarcia", "linkedin":"https://www.linkedin.com/in/frangarcia/", "position":"Ingeniero de Software Senior en Wayin", "description":"Desde 2014 con Vert.x" }
  • 3. Contexto actualContexto actual Fuente: https://www.ericsson.com
  • 6. ¿Qué es la programación reactiva?¿Qué es la programación reactiva? Se refiere a un paradigma de programación enfocado al tratamiento de flujos de datos de forma asíncrona tal y como se recoge en el Reactive Manifesto http://www.reactivemanifesto.org
  • 7. Principios del Reactive ManifestoPrincipios del Reactive Manifesto Responsivos Resilientes Elásticos Orientados a Mensajes
  • 8. ResponsivosResponsivos Responder de manera oportuna Detectar problemas rápidamente Tiempos de respuesta rápidos
  • 9. ResilientesResilientes Responder correctamente a fallos Replicación Aislamiento
  • 10. ElásticosElásticos Siempre responsivo ante diferentes niveles de carga Reaccionar a los cambios Evitar cuellos de botella
  • 11. Orientados a MensajesOrientados a Mensajes Intercambio de mensajes asíncronos Bajo acoplamiento Aislamiento
  • 12. Arquitectura del Manifiesto de SistemasArquitectura del Manifiesto de Sistemas ReactivosReactivos Responsive Resilient Message Driven Elastic Fuente: http://www.reactivemanifesto.org
  • 13. Hollywood PrincipleHollywood Principle Fuente: https://dzone.com/articles/the-hollywood- principle
  • 14. ¿Qué es Vert.x?¿Qué es Vert.x? Eclipse Vert.x ( ) es un conjunto de utilidades (no un framework) basado en 2 conceptos Diseño dirigido por los eventos Es NO bloqueante http://vertx.io
  • 15. Características de Vert.xCaracterísticas de Vert.x Propósito general Políglota Java Javascript Groovy Ruby Ceylon Scala Kotlin Escalabilidad No dogmático
  • 16. Características de Vert.xCaracterísticas de Vert.x Muy ligero Rápido No es un servidor de aplicaciones Modular Sencillo pero no simplista Ideal para microservicios Buenísima documentación
  • 18. Instalación de Vert.xInstalación de Vert.x curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" sdk install vertx
  • 19. Vert.x coreVert.x core Clientes y servidores TCP Clientes y servidores HTTP Websockets Event bus Datos compartidos Acciones periódicas Desplegar verticles Clientes DNS Acceso al sistema de ficheros Alta disponibilidad Clustering
  • 21. ¿Qué es el event loop?¿Qué es el event loop? ¿Tenemos algún evento que procesar? Lo proceso y llamo a los handlers necesarios Y así constantemente Tantos hilos de event loop como número de núcleos * 2
  • 22. Event loopEvent loop Fuente: http://escoffier.me/vertx-kubernetes/
  • 23. Event loopEvent loop Fuente: http://www.vertx.io
  • 24. ¿Igual que Node.js?¿Igual que Node.js? Node.js utiliza un único event loop mientras que Vert.x utiliza un event loop por cada core multiplicado por dos. Esto se conoce como Multi-Reactor Pattern.
  • 25. La regla de oroLa regla de oro !!No bloquees el event loop!!
  • 26. Ejemplos de bloquear el event loopEjemplos de bloquear el event loop Thread.sleep() Costosas operaciones con bases de datos Cálculos complejos que tarden mucho
  • 27. Ejecutar código bloqueanteEjecutar código bloqueante vertx.executeBlocking({ future -> // Llama a métodos bloqueantes def result = someAPI.blockingMethod("hello") future.complete(result) }, { res -> println("The result is: ${res.result()}") })
  • 28. Talk is cheap, show me the codeTalk is cheap, show me the code Fuente: Recruiting daily
  • 29. Ejemplo: Hello world!Ejemplo: Hello world! vertx run s01e01.groovy import io.vertx.core.http.HttpServer HttpServer httpServer = vertx.createHttpServer() //Responder a cada petición con un Hello World! httpServer.requestHandler({ request -> // Este handler será llamado con una petición al servidor request.response().end("hello world!") }) httpServer.listen(8080)
  • 30. Ejemplo: Devolviendo JsonEjemplo: Devolviendo Json vertx run s01e02.groovy import io.vertx.core.http.HttpServer HttpServer httpServer = vertx.createHttpServer() //Responder a cada petición con un Hello World! httpServer.requestHandler({ request -> String json = """{"foo":"bar"}""" request.response() .putHeader("Content-Type", "application/json") .putHeader("Content-Length",json.size().toString()) .write(json) .end() }) httpServer.listen(8080)
  • 31. Ejemplo: Ejecuciones periódicasEjemplo: Ejecuciones periódicas vertx run s01e03.groovy vertx.setPeriodic(1000, {id -> println("Temporizador ejecutado! ${id}") })
  • 32. Ejemplo: TemporizadoresEjemplo: Temporizadores vertx run s01e04.groovy Closure handler handler = { id -> println("Temporizador ejecutado! ${id}") vertx.setTimer(1000*(id+1), handler) } vertx.setTimer(1000, handler)
  • 33. VerticlesVerticles Suponen el corazón de Vert.x Aunque no estás obligado a utilizarlos Una aplicación consiste habitualmente en muchos verticles ejecutándose simultáneamente en una instancia de Vert.x
  • 34. Escribiendo verticlesEscribiendo verticles En un Groovy script En una clase Groovy que implementa la interfaz o extiende la claseVerticle AbstractVerticle
  • 35. Desplegando verticlesDesplegando verticles vertx run s01e05.groovy vertx.deployVerticle("HelloWorldHttpVerticle.groovy") vertx.deployVerticle("s01e06.groovy")
  • 36. Desplegando verticles:Desplegando verticles: HelloWorldHttpVerticle.groovyHelloWorldHttpVerticle.groovy import io.vertx.core.AbstractVerticle public class HelloWorldHttpVerticle extends AbstractVerticle { public void start() { println("Starting HelloWorldHttpVerticle") } public void stop() { println("Stopping HelloWorldHttpVerticle") } }
  • 37. Desplegando verticles: s01e06.groovyDesplegando verticles: s01e06.groovy void vertxStart() { println "starting s01e06" } void vertxStop() { println "stopping s01e06" }
  • 38. Desplegando verticles de formaDesplegando verticles de forma asíncronaasíncrona vertx run s01e07.groovy import io.vertx.core.Future void vertxStart(Future future) { vertx.deployVerticle("s01e06.groovy", { res -> if (res.succeeded()) { println "s01e06 started successfully asynchronously" future.complete() } else { println "error starting s01e06 asynchronously" future.fail("Error starting s01e06") } }) } void vertxStop(Future future) {
  • 39. Desplegando verticles de formaDesplegando verticles de forma asíncronaasíncrona vertx run HelloWorldHttpVerticleAsync.groovy import io.vertx.core.AbstractVerticle import io.vertx.core.Future public class HelloWorldHttpVerticleAsync extends AbstractVerti public void start(Future future) { println "starting" vertx.deployVerticle("s01e06.groovy", { res -> if (res.succeeded()) { println "s01e06 started successfully asynchronously" future.complete() } else { println "s01e06 not started asynchronously due to an e future.fail() }
  • 40. Desplegando verticles con variasDesplegando verticles con varias instanciasinstancias vertx run s01e08.groovy vertx.deployVerticle("HelloWorldHttpVerticle.groovy", [instanc
  • 41. Tipos de verticlesTipos de verticles Standard Worker Multi-Threaded
  • 42. Standard verticlesStandard verticles Se asigna un event loop cuando se crean Vert.x garantiza que cualquier código de estos verticles siempre se ejecutará en el mismo event loop De esta forma, escribe tu aplicación como si fuera monohilo que Vert.x ya se encargará de hacerlo multihilo y de la escalabilidad
  • 43. Worker verticlesWorker verticles No utilizan el event loop Utilizan un thread del pool de threads de Vert.x Están diseñados para ejecutar código bloqueante def options = [ worker:true ] vertx.deployVerticle("MyFirstVerticle", options)
  • 44. Multi-thread worker verticlesMulti-thread worker verticles Como un worker verticle pero que puede ser ejecutado en multiples threads
  • 45. Event busEvent bus Es el sistema nervioso de Vert.x Un unico event bus para cualquier verticle Es la mejor forma de comunicar verticles en Vert.x
  • 46. ¿Cómo funciona el Event bus?¿Cómo funciona el Event bus? Mandamos mensaje a una dirección, e.g. europe.news.feed Los mensajes son simples cadenas de texto Los handlers reciben los mensajes, pero antes habrá que registrarlos Varios handlers pueden estar suscritos en una misma dirección Un mismo handler puede estar suscritos en varias direcciones
  • 47. Tipos de subscripciónTipos de subscripción Publish/Subscribe Punto a punto
  • 48. Tipos de subscripción:Tipos de subscripción: Publish/SubscribePublish/Subscribe Todos los handlers suscritos a una dirección recibirán el mensaje.
  • 49. Tipos de suscripción: Punto a puntoTipos de suscripción: Punto a punto Vert.x se encargará de que sólo un handler reciba el mensaje. Se puede especificar incluso un reply handler.
  • 50. Tipos de mensajes en el event busTipos de mensajes en el event bus Normalmente se utiliza Json, aunque no estamos forzados a ello.
  • 51. Registrando handlersRegistrando handlers def eb = vertx.eventBus() eb.consumer("news.uk.sport", { message -> println("I have received a message: ${message.body()}") })
  • 52. Ejemplo: Publish/SubscribeEjemplo: Publish/Subscribe vertx run PublishingMessage.groovy import io.vertx.core.http.HttpServer def eventBus = vertx.eventBus() eventBus.consumer("news.uk.sport", { message -> println("EH1: I have received a message: ${message.body()}") }) eventBus.consumer("news.uk.sport", { message -> println("EH2: I have received a message: ${message.body()}") }) HttpServer httpServer = vertx.createHttpServer() httpServer.requestHandler({ request ->
  • 53. Ejemplo: Punto a puntoEjemplo: Punto a punto vertx run PointToPointExample.groovy import io.vertx.core.http.HttpServer def eventBus = vertx.eventBus() eventBus.consumer("news.uk.sport", { message -> println("EH1: I have received a message: ${message.body()}") }) eventBus.consumer("news.uk.sport", { message -> println("EH2: I have received a message: ${message.body()}") }) HttpServer httpServer = vertx.createHttpServer() httpServer.requestHandler({ request ->
  • 54. Ejemplo: Respondiendo al eventoEjemplo: Respondiendo al evento vertx run EventReplyExample.groovy import io.vertx.core.http.HttpServer def eventBus = vertx.eventBus() eventBus.consumer("news.uk.sport", { message -> println("I have received a message: ${message.body()}") message.reply("Event received, thanks!") }) HttpServer httpServer = vertx.createHttpServer() httpServer.requestHandler({ request -> eventBus.send("news.uk.sport", "Yay! Someone kicked a ball", if (ar.succeeded()) { request.response().end("This is what we received: "${ar } else { request.response().end("There was an error")
  • 55. EjercicioEjercicio Si sólo conocieramos Eclipse Vert.x, ¿como diseñaríamos la arquitectura de un servicio para registrar usuarios que necesita mandar un mail de confirmación a través de un servicio externo y al mismo tiempo el nuevo usuario debe ser añadido a otro servicio externo?