SlideShare une entreprise Scribd logo
1  sur  66
Télécharger pour lire hors ligne
1
Massimiliano Dessì
@desmax74
2
@desmax74
Massimiliano Dessì has more than 13 years of
experience in programming.
He’s a proud father of three, Manager of Google
Developer Group Sardegna, Founder of
SpringFramework IT, co-founder of JugSardegna.
Author of Spring 2.5 AOP.
He works and lives in Cagliari, Italy.
Speaker
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
3
Vert.x
Vert.x is a
lightweight (IoT)
polyglot
application development framework
for the JVM
enabling you
to build
high performance/reactive applications
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
4
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
5
Software requirements nowadays
Highly Responsive
Real Time
Scalable
Resilient
Petabytes
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
6
http://iamdany.com/Famous-Weapons
We need different
weapons
(architectures)
New ProblemsNew ProblemsNew Problems
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
7
Reactive
“readily responsive to a stimulus”
Component active and ready to respond to event
Event Driven
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
8
React to events → Event Driven
React to failure → Resilient
React through a UI → Interactive
React to load → Scalable
Reactive
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
9
Asyncronous and loosely coupled
+
Non blocking
=
lower latency and higher
throughput
React to event - Event driven
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
10
Wear your Seatbelt
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
11
Higher throughput
http://vertxproject.wordpress.com/2012/05/09/vert-x-vs-node-js-simple-http-benchmarks/
http://www.techempower.com/benchmarks/
http://www.techempower.com/blog/2013/04/05/frameworks-round-2/
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
12
Old blocking model
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
13
The “traditional” applications/containers
reserve
one thread
for each I/O resource,
this mean
one thread per connection,
this is a blocking architecture
because rest of incoming connections must await
Blocking apps
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
14
Old blocking model
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
15
“The C10k problem is the problem of optimising network
sockets to handle a large number of clients at the same
time”
New Challenge
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
http://en.wikipedia.org/wiki/C10k_problem
16
C10k solutions on jvm
- No shared mutable state (all solutions derived from this) -
Functional approach [Scala, JDK8]
Actors [Akka]
Reactor/EventLoop [Vertx]
Project Reactor
Jetty
Disruptor
...
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
17
Reactor pattern
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
18
Reactor pattern
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
19
Event Loop
The Reactor pattern
implementation in Vertx
is based on
Netty
EventLoop
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
20
http://500px.com/photo/40357406
Event Loop
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
21
Non blocking – Netty approach
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
22
Non blocking – Netty approach
An eventLoop is powered by exactly one Thread
that never change.
The Events and task are executed in a FIFO order
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
23
Netty thread model internals
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
24
EventLoop Vertx through Netty
public class EventLoopContext extends DefaultContext {
….
public void execute(Runnable task) {
getEventLoop().execute(wrapTask(task));
}
public boolean isOnCorrectWorker(EventLoop worker) {
return getEventLoop() == worker;
}
}
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
25
EventLoop Internals
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
26
protected Runnable wrapTask(final Runnable task) {
return new Runnable() {
public void run() {
Thread currentThread = Thread.currentThread();
String threadName = currentThread.getName();
try {
vertx.setContext(DefaultContext.this);
task.run();
} catch (Throwable t) {
reportException(t);
} finally {
if (!threadName.equals(currentThread.getName())) {
currentThread.setName(threadName);
}
}
if (closed) {
unsetContext();
}
}
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
27
EventLoop Vertx through Netty
The benefit of executing
the task in the event loop is
that you don’t need to worry
about any synchronization or
concurrency problems.
The runnable will get executed
in the same thread as all
other events that are related to the channel.
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
28
When the data arrives from the outside or from inside,
the event loop thread wakes up,
executes any callback function registered for the
specific event type,
and returns to its wait state until a new event occurs
Vertx
creates as many event loop threads as the number of CPU cores
Event Loops
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
29
The unit of execution is a Verticle
which reacts to event messages,
and communicates sending event messages.
Decoupling communication
with event handlers and messages
enables location transparency
Event Loops
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
30
Never block the Event Loop
Never block the Event Loop
Never block the Event Loop
If you need a blocking or long time computation code
use a separate thread for this
Golden Rule
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
31
Vertx provide an abstraction in which write code like a single-
thread, this abstraction is called Verticle.
In classic framework we have to write Controller or Service
Object, with Vertx all communications are async with events
through Verticles.
Direct calls does not exist in Vertx,
all calls are messages on Event Bus
Verticle
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
32
Message to object (roots)
Sending Messages to Objects
all Smalltalk processing is accomplished by sending messages to
objects. An initial problem solving approach in Smalltalk is to try to reuse
the existing objects and message
http://en.wikipedia.org/wiki/Smalltalk
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
33
Event Bus distributed
Vertx
Vertx
Vertx
Eventbus
Eventbus
Eventloops
Multicast
Browsers
Location
transparency
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
34
Verticle
● Each Verticle instance is executed from only one thread
● Each Verticle instance assigned to thread/EventLoop
● Separate classloader for each Verticle
● Polyglot Verticles
● React to event with event handlers
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
35
public class MyVerticle extends Verticle {
@Override
public void start() {
// register handlers
}
@Override
public void stop() {
...
}
}
Verticle
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
36
Polyglot Verticles
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
37
Verticles packaging
(Module)
A module is a collection of verticles and other code and files
that is packaged as a unit,
and then referenced from other Vert.x modules or applications.
The module descriptor is a JSON file called mod.json
{
"main": "MyPersistor.java"
"worker": true //worker verticle
"preserve-cwd":true
...
}
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
38
Deploy module runtime
var container = require('vertx/container');
var config = {
"web_root": ".",
"port": 8080
};
//downloaded form vertx repository
container.deployModule("io.vertx~mod-web-server~2.0.0-final", config);
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
39
Vertx provide Worker verticles
that run on a separate thread
to perform blocking operations
without block the Eventloop
Worker Verticle
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
40
Handlers
EventBus bus = vertx.eventBus();
Handler<Message> handler = new Handler<Message>() {
@Override
public void handle(Message message) {
//doSomething
}
}
bus.registerHandler("com.codemotion.firsthandler", handler);
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
41
Pub Sub
EventBus bus = vertx.eventBus();
bus.publish(“com.codemotion.firsthandler”, “Hello world”);
publish mean broadcast to all subscribers
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
42
P2P
EventBus bus = vertx.eventBus();
bus.send(“39.216667.Nord-9.116667.Est”, “Hello world”);
send mean point to point, only one subscriber
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
43
Sender
bus.send("39.216667.Nord-9.116667.Est", "This is a message !",
new Handler<Message<String>>() {
@Override
public void handle(Message<String> message) {
String received = message.body();
}
});
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
44
Receiver
Handler<Message> handler = new Handler<Message<String>>() {
@Override
public void handle(Message<String message) {
String received = message.body();
message.reply("This is a reply");
}
}
bus.registerHandler("39.216667.Nord-9.116667.Est", handler);
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
45
Message from the UI
<script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script>
<script src='vertxbus.js'></script>
<script>
var eb = new vertx.EventBus('http://localhost:8080/eventbus');
eb.onopen = function() {
eb.registerHandler('some-address', function(message) {
console.log('received a message: ' + JSON.stringify(message);
});
eb.send('some-address', {name: 'tim', age: 587});
}
</script>
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
46
Goodies
● HTTP/HTTPS servers/clients
● WebSockets support
● SockJS support
● Timers
● Buffers
● Streams and Pumps
● Routing
● Async File I/O
● Shared Data
● Embeddable
● Module Repo
(http://modulereg.vertx.io/)
● WebServer
● SessionManager
● Auth manager
● Persistors (Mongo, JDBC)
● Spring
● RxJava
● Many others
● Compile on the fly
(deploy .java verticle)
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
47
Logger logger = container.logger();
getVertx().eventBus().sendWithTimeout("test.address", "This is a
message", 1000, new Handler<AsyncResult<Message<String>>>() {
public void handle(AsyncResult<Message<String>> result) {
if (result.succeeded()) {
Logger.info("I received a reply " + message.body);
} else {
ReplyException ex = (ReplyException)result.cause();
logger.error("Failure type: " + ex.failureType());
logger.error("Failure code: " + ex.failureCode());
logger.error("Failure message: " + ex.message());
// restart dead verticle
}
}
});
Notification of reply failure
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
48
long timerID = vertx.setPeriodic(1000, new
Handler<Long>() {
public void handle(Long timerID) {
log.info("And every second this is printed");
}
});
log.info("First this is printed");
Timers
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
49
Futures are Expensive to Compose
“Futures are straight-forward to use for a single level of
asynchronous execution but they start to add non-trivial
complexity when they're nested. “
RxJava
https://github.com/Netflix/RxJava/wiki
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
50
RxJava
Reactive
Functional reactive offers efficient execution and composition by
providing a collection of operators capable of filtering, selecting,
transforming, combining and composing Observable's.
https://github.com/Netflix/RxJava/wiki
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
51
“The Observable data type can be thought of as a "push"
equivalent to Iterable which is "pull". With an Iterable, the
consumer pulls values from the producer and the thread blocks
until those values arrive.
By contrast with the Observable type, the producer pushes
values to the consumer whenever values are available. This
approach is more flexible, because values can arrive
synchronously or asynchronously.”
RxJava
https://github.com/Netflix/RxJava/wiki
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
52
RxJava
def simpleComposition() {
customObservableNonBlocking()
.skip(10)// skip the first 10
.take(5)// take the next 5
.map({ stringValue -> return stringValue+ "transf"})
.subscribe({ println "onNext => " + it})
}
https://github.com/Netflix/RxJava/wiki
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
53
“The Observable type adds two missing semantics to the Gang
of Four's Observer pattern, which are available in the Iterable
type:
1) The ability for the producer to signal to the consumer that
there is no more data available.
2)The ability for the producer to signal to the consumer that an
error has occurred.”
RxJava
https://github.com/Netflix/RxJava/wiki
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
54
RxJava a library (Java, Groovy, Scala, Clojure, JRuby)
for composing asynchronous and event-based programs by
using observable sequences .
It extends the observer pattern to support sequences of
data/events and adds operators that allow you to compose
sequences together declaratively while abstracting away
concerns about things like low-level threading, synchronization,
thread-safety, concurrent data structures, and non-blocking I/O.
RxJava
https://github.com/Netflix/RxJava/wiki
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
55
RxJava
def Observable<T> getData(int id) {
if(availableInMemory) {// sync
return Observable.create({ observer ->
observer.onNext(valueFromMemory);
observer.onCompleted();
})
} else { //Async
return Observable.create({ observer ->
executor.submit({
try {
T value = getValueFromRemoteService(id);
observer.onNext(value);
observer.onCompleted();
}catch(Exception e) {
observer.onError(e);
}
})
});
}}
No differences from
the client perspective,
an Observable in both cases
http://netflix.github.io/RxJava/javadoc/rx/package-tree.html
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
56
Mod-rxvertx (RxJava in Vertx)
RxEventBus rxEventBus = new RxEventBus(vertx.eventBus());
rxEventBus.<String>registerHandler("foo").subscribe(
new Action1<RxMessage<String>>() {
public void call(RxMessage<String> message) {
message.reply("pong!");// Send a single reply
}
});
Observable<RxMessage<String>> obs = rxEventBus.send("foo", "ping!");
obs.subscribe(
new Action1<RxMessage<String>>() {
public void call(RxMessage<String> message) {
// Handle response
}
},
new Action1<Throwable>() {
public void call(Throwable err) {
// Handle error
}
}
);
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
57
Automatic failover (resilient)
When a module is run with HA, if the Vert.x instance where it is
running fails, it will be re-started automatically on another node of
the cluster, this is module fail-over.
To run a module with HA, add the -ha switch when running it on
the command line:
vertx runmod com.acme~my-mod~2.1 -ha
See details in org.vertx.java.platform.impl.HAManager
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
58
HTTP (Java)
HttpServer server = vertx.createHttpServer();
server.requestHandler(new Handler< HttpServerRequest >() {
public void handle(HttpServerRequest request) {
request.response().write("Hello world").end();
}
});
server.listen(8080, "localhost");
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
59
HTTP (JavaScript)
var vertx = require('vertx');
var server = vertx.createHttpServer();
server.requestHandler(function(request) {
request.response.write("Hello world").end();
});
server.listen(8080, "localhost");
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
60
HTTP (Scala)
vertx.createHttpServer.requestHandler {
req: HttpServerRequest => req.response.end("Hello World!")
}.listen(8080)
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
61
HTTP (Clojure)
(ns demo.verticle
(:require [vertx.http :as http]
[vertx.stream :as stream]))
(defn req-handler [req]
(-> (http/server-response req)
(stream/write "Hello world !")
(http/end)))
(-> (http/server)
(http/on-request req-handler)
(http/listen 8080))
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
62
HTTP (JRuby)
require "vertx"
server = Vertx::HttpServer.new
server.request_handler do |request|
request.response.write("Hello world").end;
end
server.listen(8080, "localhost")
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
63
Vertx on RaspberryPi
public class HardwareVerticle extends Verticle {
public void start() {
final GpioController gpio = GpioFactory.getInstance();
System.out.println("GPIO LOADED");
final GpioPinDigitalInput myButton =
gpio.provisionDigitalInputPin(RaspiPin.GPIO_06, PinPullResistance.PULL_DOWN);
myButton.addListener(new GpioPinListenerDigital() {
@Override
public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event){
System.out.println(new Date() + "Button change");
vertx.eventBus().publish("buttonbus",String.valueOf(event.getState().getValue()));
}
});
}
}
http://szimano.org/how-to-use-vert-x-to-make-your-raspberrypi-talk-to-your-browser/
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
64
● http://www.reactivemanifesto.org/
● http://vertx.io/
● http://netty.io/
● https://github.com/Netflix/RxJava
● http://lampwww.epfl.ch/~imaier/pub/DeprecatingObserversTR2010.pdf
● http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf
● http://www.cs.wustl.edu/~schmidt/PDF/reactor-siemens.pdf
● http://www.cs.bgu.ac.il/~spl051/Personal_material/Practical_sessions/Ps_12/ps12.html
References
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
65
References speaker
http://www.slideshare.net/desmax74
https://twitter.com/desmax74
it.linkedin.com/in/desmax74
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
66
Thanks for your attention !
ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

Contenu connexe

Tendances

2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
Mirantis
 

Tendances (20)

Real World Enterprise Reactive Programming using Vert.x
Real World Enterprise Reactive Programming using Vert.xReal World Enterprise Reactive Programming using Vert.x
Real World Enterprise Reactive Programming using Vert.x
 
Cassandra and Docker Lessons Learned
Cassandra and Docker Lessons LearnedCassandra and Docker Lessons Learned
Cassandra and Docker Lessons Learned
 
Containers, Docker, and Security: State Of The Union (LinuxCon and ContainerC...
Containers, Docker, and Security: State Of The Union (LinuxCon and ContainerC...Containers, Docker, and Security: State Of The Union (LinuxCon and ContainerC...
Containers, Docker, and Security: State Of The Union (LinuxCon and ContainerC...
 
[FOSDEM 2020] Lazy distribution of container images
[FOSDEM 2020] Lazy distribution of container images[FOSDEM 2020] Lazy distribution of container images
[FOSDEM 2020] Lazy distribution of container images
 
Geek Week 2016 - Deep Dive To Openstack
Geek Week 2016 -  Deep Dive To OpenstackGeek Week 2016 -  Deep Dive To Openstack
Geek Week 2016 - Deep Dive To Openstack
 
Scaling and Managing Cassandra with docker, CoreOS and Presto
Scaling and Managing Cassandra with docker, CoreOS and PrestoScaling and Managing Cassandra with docker, CoreOS and Presto
Scaling and Managing Cassandra with docker, CoreOS and Presto
 
Cassandra on Docker
Cassandra on DockerCassandra on Docker
Cassandra on Docker
 
XPDS13 Test-as-a-Service and XenRT - Alex Brett, Citrix
XPDS13 Test-as-a-Service and XenRT - Alex Brett, CitrixXPDS13 Test-as-a-Service and XenRT - Alex Brett, Citrix
XPDS13 Test-as-a-Service and XenRT - Alex Brett, Citrix
 
Vancouver open stack meetup presentation
Vancouver open stack meetup presentationVancouver open stack meetup presentation
Vancouver open stack meetup presentation
 
container crash course
container crash coursecontainer crash course
container crash course
 
Cassandra and docker
Cassandra and dockerCassandra and docker
Cassandra and docker
 
Stateful Containers: Flocker on CoreOS
Stateful Containers: Flocker on CoreOSStateful Containers: Flocker on CoreOS
Stateful Containers: Flocker on CoreOS
 
Kubernetes Architecture and Introduction – Paris Kubernetes Meetup
Kubernetes Architecture and Introduction – Paris Kubernetes MeetupKubernetes Architecture and Introduction – Paris Kubernetes Meetup
Kubernetes Architecture and Introduction – Paris Kubernetes Meetup
 
Ceph and Openstack in a Nutshell
Ceph and Openstack in a NutshellCeph and Openstack in a Nutshell
Ceph and Openstack in a Nutshell
 
Cassandra via-docker
Cassandra via-dockerCassandra via-docker
Cassandra via-docker
 
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
2 Day Bootcamp for OpenStack--Cloud Training by Mirantis (Preview)
 
Netflix Container Scheduling and Execution - QCon New York 2016
Netflix Container Scheduling and Execution - QCon New York 2016Netflix Container Scheduling and Execution - QCon New York 2016
Netflix Container Scheduling and Execution - QCon New York 2016
 
The State of Ceph, Manila, and Containers in OpenStack
The State of Ceph, Manila, and Containers in OpenStackThe State of Ceph, Manila, and Containers in OpenStack
The State of Ceph, Manila, and Containers in OpenStack
 
What is a Ceph (and why do I care). OpenStack storage - Colorado OpenStack Me...
What is a Ceph (and why do I care). OpenStack storage - Colorado OpenStack Me...What is a Ceph (and why do I care). OpenStack storage - Colorado OpenStack Me...
What is a Ceph (and why do I care). OpenStack storage - Colorado OpenStack Me...
 
[KubeCon NA 2020] containerd: Rootless Containers 2020
[KubeCon NA 2020] containerd: Rootless Containers 2020[KubeCon NA 2020] containerd: Rootless Containers 2020
[KubeCon NA 2020] containerd: Rootless Containers 2020
 

Similaire à Vert.X like Node.js but polyglot and reactive on JVM

Docker network Present in VietNam DockerDay 2015
Docker network Present in VietNam DockerDay 2015Docker network Present in VietNam DockerDay 2015
Docker network Present in VietNam DockerDay 2015
Van Phuc
 
Integrating VNC in Weston with the Yocto Project and OpenEmbedded
Integrating VNC in Weston with the Yocto Project and OpenEmbeddedIntegrating VNC in Weston with the Yocto Project and OpenEmbedded
Integrating VNC in Weston with the Yocto Project and OpenEmbedded
Leon Anavi
 

Similaire à Vert.X like Node.js but polyglot and reactive on JVM (20)

Vert.x - Dessì
Vert.x - DessìVert.x - Dessì
Vert.x - Dessì
 
Alessandro Confetti - Learn how to build decentralized and serverless html5 a...
Alessandro Confetti - Learn how to build decentralized and serverless html5 a...Alessandro Confetti - Learn how to build decentralized and serverless html5 a...
Alessandro Confetti - Learn how to build decentralized and serverless html5 a...
 
Docker network Present in VietNam DockerDay 2015
Docker network Present in VietNam DockerDay 2015Docker network Present in VietNam DockerDay 2015
Docker network Present in VietNam DockerDay 2015
 
Learn how to build decentralized and serverless html5 applications with embar...
Learn how to build decentralized and serverless html5 applications with embar...Learn how to build decentralized and serverless html5 applications with embar...
Learn how to build decentralized and serverless html5 applications with embar...
 
Learn how to build decentralized and serverless html5 applications with Embar...
Learn how to build decentralized and serverless html5 applications with Embar...Learn how to build decentralized and serverless html5 applications with Embar...
Learn how to build decentralized and serverless html5 applications with Embar...
 
Mining Component Repositories for Installability Issues
Mining Component Repositories for Installability IssuesMining Component Repositories for Installability Issues
Mining Component Repositories for Installability Issues
 
Build your reactive web application with Vert.x
Build your reactive web application with Vert.xBuild your reactive web application with Vert.x
Build your reactive web application with Vert.x
 
Building and deploying a distributed application with Docker, Mesos and Marathon
Building and deploying a distributed application with Docker, Mesos and MarathonBuilding and deploying a distributed application with Docker, Mesos and Marathon
Building and deploying a distributed application with Docker, Mesos and Marathon
 
Learn how to build decentralized and serverless html5 applications with Embar...
Learn how to build decentralized and serverless html5 applications with Embar...Learn how to build decentralized and serverless html5 applications with Embar...
Learn how to build decentralized and serverless html5 applications with Embar...
 
Learn how to build decentralized and serverless html5 applications with embar...
Learn how to build decentralized and serverless html5 applications with embar...Learn how to build decentralized and serverless html5 applications with embar...
Learn how to build decentralized and serverless html5 applications with embar...
 
eZ publish 5[-alpha1] Introduction & Architecture
eZ publish 5[-alpha1] Introduction & ArchitectureeZ publish 5[-alpha1] Introduction & Architecture
eZ publish 5[-alpha1] Introduction & Architecture
 
EC2 Storage for Docker 150526b
EC2 Storage for Docker   150526bEC2 Storage for Docker   150526b
EC2 Storage for Docker 150526b
 
Integrating VNC in Weston with the Yocto Project and OpenEmbedded
Integrating VNC in Weston with the Yocto Project and OpenEmbeddedIntegrating VNC in Weston with the Yocto Project and OpenEmbedded
Integrating VNC in Weston with the Yocto Project and OpenEmbedded
 
Unleash software architecture leveraging on docker
Unleash software architecture leveraging on dockerUnleash software architecture leveraging on docker
Unleash software architecture leveraging on docker
 
Lukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with Uciprov
Lukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with UciprovLukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with Uciprov
Lukas Macura - Employing Zabbix to monitor OpenWrt (Beesip) devices with Uciprov
 
Deep inside the Cloud Managements Platforms: the OpenStack case study
Deep inside the Cloud Managements Platforms: the OpenStack case studyDeep inside the Cloud Managements Platforms: the OpenStack case study
Deep inside the Cloud Managements Platforms: the OpenStack case study
 
Docker on Mesos With OpenVNet (eng)
Docker on Mesos With OpenVNet (eng)Docker on Mesos With OpenVNet (eng)
Docker on Mesos With OpenVNet (eng)
 
Vert.x based microservices with vxms
Vert.x based microservices with vxmsVert.x based microservices with vxms
Vert.x based microservices with vxms
 
Docker containers : introduction
Docker containers : introductionDocker containers : introduction
Docker containers : introduction
 
18 ° Nexa Lunch Seminar - Lo stato dell'arte dei Linked Open Data italiani
18 ° Nexa Lunch Seminar - Lo stato dell'arte dei Linked Open Data italiani18 ° Nexa Lunch Seminar - Lo stato dell'arte dei Linked Open Data italiani
18 ° Nexa Lunch Seminar - Lo stato dell'arte dei Linked Open Data italiani
 

Plus de Massimiliano Dessì

Plus de Massimiliano Dessì (20)

Code One 2018 maven
Code One 2018   mavenCode One 2018   maven
Code One 2018 maven
 
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
When Old Meets New: Turning Maven into a High Scalable, Resource Efficient, C...
 
Hacking Maven Linux day 2017
Hacking Maven Linux day 2017Hacking Maven Linux day 2017
Hacking Maven Linux day 2017
 
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
Microservices in Go_Dessi_Massimiliano_Codemotion_2017_Rome
 
Dessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloudDessi docker kubernetes paas cloud
Dessi docker kubernetes paas cloud
 
Docker dDessi november 2015
Docker dDessi november 2015Docker dDessi november 2015
Docker dDessi november 2015
 
Docker linuxday 2015
Docker linuxday 2015Docker linuxday 2015
Docker linuxday 2015
 
Openshift linuxday 2014
Openshift linuxday 2014Openshift linuxday 2014
Openshift linuxday 2014
 
Web Marketing Training 2014 Community Online
Web Marketing Training 2014 Community OnlineWeb Marketing Training 2014 Community Online
Web Marketing Training 2014 Community Online
 
Reactive applications Linux Day 2013
Reactive applications Linux Day 2013Reactive applications Linux Day 2013
Reactive applications Linux Day 2013
 
Scala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVCScala Italy 2013 extended Scalatra vs Spring MVC
Scala Italy 2013 extended Scalatra vs Spring MVC
 
Codemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_sprayCodemotion 2013 scalatra_play_spray
Codemotion 2013 scalatra_play_spray
 
Why we cannot ignore functional programming
Why we cannot ignore functional programmingWhy we cannot ignore functional programming
Why we cannot ignore functional programming
 
Scala linux day 2012
Scala linux day 2012 Scala linux day 2012
Scala linux day 2012
 
Three languages in thirty minutes
Three languages in thirty minutesThree languages in thirty minutes
Three languages in thirty minutes
 
MongoDB dessi-codemotion
MongoDB dessi-codemotionMongoDB dessi-codemotion
MongoDB dessi-codemotion
 
MongoDB Webtech conference 2010
MongoDB Webtech conference 2010MongoDB Webtech conference 2010
MongoDB Webtech conference 2010
 
RESTEasy
RESTEasyRESTEasy
RESTEasy
 
Spring Roo Internals Javaday IV
Spring Roo Internals Javaday IVSpring Roo Internals Javaday IV
Spring Roo Internals Javaday IV
 
Spring Roo JaxItalia09
Spring Roo JaxItalia09Spring Roo JaxItalia09
Spring Roo JaxItalia09
 

Dernier

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Dernier (20)

Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Real Time Object Detection Using Open CV
Real Time Object Detection Using Open CVReal Time Object Detection Using Open CV
Real Time Object Detection Using Open CV
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
HTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation StrategiesHTML Injection Attacks: Impact and Mitigation Strategies
HTML Injection Attacks: Impact and Mitigation Strategies
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live StreamsTop 5 Benefits OF Using Muvi Live Paywall For Live Streams
Top 5 Benefits OF Using Muvi Live Paywall For Live Streams
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
Deploy with confidence: VMware Cloud Foundation 5.1 on next gen Dell PowerEdg...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 

Vert.X like Node.js but polyglot and reactive on JVM

  • 2. 2 @desmax74 Massimiliano Dessì has more than 13 years of experience in programming. He’s a proud father of three, Manager of Google Developer Group Sardegna, Founder of SpringFramework IT, co-founder of JugSardegna. Author of Spring 2.5 AOP. He works and lives in Cagliari, Italy. Speaker ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 3. 3 Vert.x Vert.x is a lightweight (IoT) polyglot application development framework for the JVM enabling you to build high performance/reactive applications ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 4. 4 ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 5. 5 Software requirements nowadays Highly Responsive Real Time Scalable Resilient Petabytes ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 6. 6 http://iamdany.com/Famous-Weapons We need different weapons (architectures) New ProblemsNew ProblemsNew Problems ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 7. 7 Reactive “readily responsive to a stimulus” Component active and ready to respond to event Event Driven ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 8. 8 React to events → Event Driven React to failure → Resilient React through a UI → Interactive React to load → Scalable Reactive ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 9. 9 Asyncronous and loosely coupled + Non blocking = lower latency and higher throughput React to event - Event driven ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 10. 10 Wear your Seatbelt ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 12. 12 Old blocking model ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 13. 13 The “traditional” applications/containers reserve one thread for each I/O resource, this mean one thread per connection, this is a blocking architecture because rest of incoming connections must await Blocking apps ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 14. 14 Old blocking model ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 15. 15 “The C10k problem is the problem of optimising network sockets to handle a large number of clients at the same time” New Challenge ROME 11-12 april 2014 – Massimiliano Dessì - Vertx http://en.wikipedia.org/wiki/C10k_problem
  • 16. 16 C10k solutions on jvm - No shared mutable state (all solutions derived from this) - Functional approach [Scala, JDK8] Actors [Akka] Reactor/EventLoop [Vertx] Project Reactor Jetty Disruptor ... ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 17. 17 Reactor pattern ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 18. 18 Reactor pattern ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 19. 19 Event Loop The Reactor pattern implementation in Vertx is based on Netty EventLoop ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 20. 20 http://500px.com/photo/40357406 Event Loop ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 21. 21 Non blocking – Netty approach ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 22. 22 Non blocking – Netty approach An eventLoop is powered by exactly one Thread that never change. The Events and task are executed in a FIFO order ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 23. 23 Netty thread model internals ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 24. 24 EventLoop Vertx through Netty public class EventLoopContext extends DefaultContext { …. public void execute(Runnable task) { getEventLoop().execute(wrapTask(task)); } public boolean isOnCorrectWorker(EventLoop worker) { return getEventLoop() == worker; } } ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 25. 25 EventLoop Internals ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 26. 26 protected Runnable wrapTask(final Runnable task) { return new Runnable() { public void run() { Thread currentThread = Thread.currentThread(); String threadName = currentThread.getName(); try { vertx.setContext(DefaultContext.this); task.run(); } catch (Throwable t) { reportException(t); } finally { if (!threadName.equals(currentThread.getName())) { currentThread.setName(threadName); } } if (closed) { unsetContext(); } } ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 27. 27 EventLoop Vertx through Netty The benefit of executing the task in the event loop is that you don’t need to worry about any synchronization or concurrency problems. The runnable will get executed in the same thread as all other events that are related to the channel. ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 28. 28 When the data arrives from the outside or from inside, the event loop thread wakes up, executes any callback function registered for the specific event type, and returns to its wait state until a new event occurs Vertx creates as many event loop threads as the number of CPU cores Event Loops ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 29. 29 The unit of execution is a Verticle which reacts to event messages, and communicates sending event messages. Decoupling communication with event handlers and messages enables location transparency Event Loops ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 30. 30 Never block the Event Loop Never block the Event Loop Never block the Event Loop If you need a blocking or long time computation code use a separate thread for this Golden Rule ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 31. 31 Vertx provide an abstraction in which write code like a single- thread, this abstraction is called Verticle. In classic framework we have to write Controller or Service Object, with Vertx all communications are async with events through Verticles. Direct calls does not exist in Vertx, all calls are messages on Event Bus Verticle ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 32. 32 Message to object (roots) Sending Messages to Objects all Smalltalk processing is accomplished by sending messages to objects. An initial problem solving approach in Smalltalk is to try to reuse the existing objects and message http://en.wikipedia.org/wiki/Smalltalk ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 34. 34 Verticle ● Each Verticle instance is executed from only one thread ● Each Verticle instance assigned to thread/EventLoop ● Separate classloader for each Verticle ● Polyglot Verticles ● React to event with event handlers ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 35. 35 public class MyVerticle extends Verticle { @Override public void start() { // register handlers } @Override public void stop() { ... } } Verticle ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 36. 36 Polyglot Verticles ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 37. 37 Verticles packaging (Module) A module is a collection of verticles and other code and files that is packaged as a unit, and then referenced from other Vert.x modules or applications. The module descriptor is a JSON file called mod.json { "main": "MyPersistor.java" "worker": true //worker verticle "preserve-cwd":true ... } ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 38. 38 Deploy module runtime var container = require('vertx/container'); var config = { "web_root": ".", "port": 8080 }; //downloaded form vertx repository container.deployModule("io.vertx~mod-web-server~2.0.0-final", config); ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 39. 39 Vertx provide Worker verticles that run on a separate thread to perform blocking operations without block the Eventloop Worker Verticle ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 40. 40 Handlers EventBus bus = vertx.eventBus(); Handler<Message> handler = new Handler<Message>() { @Override public void handle(Message message) { //doSomething } } bus.registerHandler("com.codemotion.firsthandler", handler); ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 41. 41 Pub Sub EventBus bus = vertx.eventBus(); bus.publish(“com.codemotion.firsthandler”, “Hello world”); publish mean broadcast to all subscribers ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 42. 42 P2P EventBus bus = vertx.eventBus(); bus.send(“39.216667.Nord-9.116667.Est”, “Hello world”); send mean point to point, only one subscriber ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 43. 43 Sender bus.send("39.216667.Nord-9.116667.Est", "This is a message !", new Handler<Message<String>>() { @Override public void handle(Message<String> message) { String received = message.body(); } }); ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 44. 44 Receiver Handler<Message> handler = new Handler<Message<String>>() { @Override public void handle(Message<String message) { String received = message.body(); message.reply("This is a reply"); } } bus.registerHandler("39.216667.Nord-9.116667.Est", handler); ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 45. 45 Message from the UI <script src="http://cdn.sockjs.org/sockjs-0.3.4.min.js"></script> <script src='vertxbus.js'></script> <script> var eb = new vertx.EventBus('http://localhost:8080/eventbus'); eb.onopen = function() { eb.registerHandler('some-address', function(message) { console.log('received a message: ' + JSON.stringify(message); }); eb.send('some-address', {name: 'tim', age: 587}); } </script> ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 46. 46 Goodies ● HTTP/HTTPS servers/clients ● WebSockets support ● SockJS support ● Timers ● Buffers ● Streams and Pumps ● Routing ● Async File I/O ● Shared Data ● Embeddable ● Module Repo (http://modulereg.vertx.io/) ● WebServer ● SessionManager ● Auth manager ● Persistors (Mongo, JDBC) ● Spring ● RxJava ● Many others ● Compile on the fly (deploy .java verticle) ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 47. 47 Logger logger = container.logger(); getVertx().eventBus().sendWithTimeout("test.address", "This is a message", 1000, new Handler<AsyncResult<Message<String>>>() { public void handle(AsyncResult<Message<String>> result) { if (result.succeeded()) { Logger.info("I received a reply " + message.body); } else { ReplyException ex = (ReplyException)result.cause(); logger.error("Failure type: " + ex.failureType()); logger.error("Failure code: " + ex.failureCode()); logger.error("Failure message: " + ex.message()); // restart dead verticle } } }); Notification of reply failure ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 48. 48 long timerID = vertx.setPeriodic(1000, new Handler<Long>() { public void handle(Long timerID) { log.info("And every second this is printed"); } }); log.info("First this is printed"); Timers ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 49. 49 Futures are Expensive to Compose “Futures are straight-forward to use for a single level of asynchronous execution but they start to add non-trivial complexity when they're nested. “ RxJava https://github.com/Netflix/RxJava/wiki ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 50. 50 RxJava Reactive Functional reactive offers efficient execution and composition by providing a collection of operators capable of filtering, selecting, transforming, combining and composing Observable's. https://github.com/Netflix/RxJava/wiki ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 51. 51 “The Observable data type can be thought of as a "push" equivalent to Iterable which is "pull". With an Iterable, the consumer pulls values from the producer and the thread blocks until those values arrive. By contrast with the Observable type, the producer pushes values to the consumer whenever values are available. This approach is more flexible, because values can arrive synchronously or asynchronously.” RxJava https://github.com/Netflix/RxJava/wiki ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 52. 52 RxJava def simpleComposition() { customObservableNonBlocking() .skip(10)// skip the first 10 .take(5)// take the next 5 .map({ stringValue -> return stringValue+ "transf"}) .subscribe({ println "onNext => " + it}) } https://github.com/Netflix/RxJava/wiki ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 53. 53 “The Observable type adds two missing semantics to the Gang of Four's Observer pattern, which are available in the Iterable type: 1) The ability for the producer to signal to the consumer that there is no more data available. 2)The ability for the producer to signal to the consumer that an error has occurred.” RxJava https://github.com/Netflix/RxJava/wiki ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 54. 54 RxJava a library (Java, Groovy, Scala, Clojure, JRuby) for composing asynchronous and event-based programs by using observable sequences . It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away concerns about things like low-level threading, synchronization, thread-safety, concurrent data structures, and non-blocking I/O. RxJava https://github.com/Netflix/RxJava/wiki ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 55. 55 RxJava def Observable<T> getData(int id) { if(availableInMemory) {// sync return Observable.create({ observer -> observer.onNext(valueFromMemory); observer.onCompleted(); }) } else { //Async return Observable.create({ observer -> executor.submit({ try { T value = getValueFromRemoteService(id); observer.onNext(value); observer.onCompleted(); }catch(Exception e) { observer.onError(e); } }) }); }} No differences from the client perspective, an Observable in both cases http://netflix.github.io/RxJava/javadoc/rx/package-tree.html ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 56. 56 Mod-rxvertx (RxJava in Vertx) RxEventBus rxEventBus = new RxEventBus(vertx.eventBus()); rxEventBus.<String>registerHandler("foo").subscribe( new Action1<RxMessage<String>>() { public void call(RxMessage<String> message) { message.reply("pong!");// Send a single reply } }); Observable<RxMessage<String>> obs = rxEventBus.send("foo", "ping!"); obs.subscribe( new Action1<RxMessage<String>>() { public void call(RxMessage<String> message) { // Handle response } }, new Action1<Throwable>() { public void call(Throwable err) { // Handle error } } ); ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 57. 57 Automatic failover (resilient) When a module is run with HA, if the Vert.x instance where it is running fails, it will be re-started automatically on another node of the cluster, this is module fail-over. To run a module with HA, add the -ha switch when running it on the command line: vertx runmod com.acme~my-mod~2.1 -ha See details in org.vertx.java.platform.impl.HAManager ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 58. 58 HTTP (Java) HttpServer server = vertx.createHttpServer(); server.requestHandler(new Handler< HttpServerRequest >() { public void handle(HttpServerRequest request) { request.response().write("Hello world").end(); } }); server.listen(8080, "localhost"); ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 59. 59 HTTP (JavaScript) var vertx = require('vertx'); var server = vertx.createHttpServer(); server.requestHandler(function(request) { request.response.write("Hello world").end(); }); server.listen(8080, "localhost"); ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 60. 60 HTTP (Scala) vertx.createHttpServer.requestHandler { req: HttpServerRequest => req.response.end("Hello World!") }.listen(8080) ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 61. 61 HTTP (Clojure) (ns demo.verticle (:require [vertx.http :as http] [vertx.stream :as stream])) (defn req-handler [req] (-> (http/server-response req) (stream/write "Hello world !") (http/end))) (-> (http/server) (http/on-request req-handler) (http/listen 8080)) ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 62. 62 HTTP (JRuby) require "vertx" server = Vertx::HttpServer.new server.request_handler do |request| request.response.write("Hello world").end; end server.listen(8080, "localhost") ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 63. 63 Vertx on RaspberryPi public class HardwareVerticle extends Verticle { public void start() { final GpioController gpio = GpioFactory.getInstance(); System.out.println("GPIO LOADED"); final GpioPinDigitalInput myButton = gpio.provisionDigitalInputPin(RaspiPin.GPIO_06, PinPullResistance.PULL_DOWN); myButton.addListener(new GpioPinListenerDigital() { @Override public void handleGpioPinDigitalStateChangeEvent(GpioPinDigitalStateChangeEvent event){ System.out.println(new Date() + "Button change"); vertx.eventBus().publish("buttonbus",String.valueOf(event.getState().getValue())); } }); } } http://szimano.org/how-to-use-vert-x-to-make-your-raspberrypi-talk-to-your-browser/ ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 64. 64 ● http://www.reactivemanifesto.org/ ● http://vertx.io/ ● http://netty.io/ ● https://github.com/Netflix/RxJava ● http://lampwww.epfl.ch/~imaier/pub/DeprecatingObserversTR2010.pdf ● http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf ● http://www.cs.wustl.edu/~schmidt/PDF/reactor-siemens.pdf ● http://www.cs.bgu.ac.il/~spl051/Personal_material/Practical_sessions/Ps_12/ps12.html References ROME 11-12 april 2014 – Massimiliano Dessì - Vertx
  • 66. 66 Thanks for your attention ! ROME 11-12 april 2014 – Massimiliano Dessì - Vertx