+ All Categories
Home > Technology > Vert.X like Node.js but polyglot and reactive on JVM

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

Date post: 08-May-2015
Category:
Upload: massimiliano-dessi
View: 3,822 times
Download: 3 times
Share this document with a friend
Description:
Vert.X like Node.js but polyglot and reactive on JVM. Reactive application, Scalable, Resilient, Responsive, RxJava, Netty, Scala.
67
1 Massimiliano Dessì @desmax74
Transcript
Page 1: Vert.X like Node.js but polyglot and reactive on JVM

1

Massimiliano Dessì

@desmax74

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

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

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

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

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

4

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

5

Software requirements nowadays

Highly Responsive

Real Time

Scalable

Resilient

Petabytes

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

6

http://iamdany.com/Famous-Weapons

We need different weapons

(architectures)

New ProblemsNew ProblemsNew Problems

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

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

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

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

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

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

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

10

Wear your Seatbelt

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

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

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

12

Old blocking model

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

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

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

14

Old blocking model

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

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

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

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

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

17

Reactor pattern

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

18

Reactor pattern

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

19

Event Loop

The Reactor pattern

implementation in Vertx

is based on

Netty

EventLoop

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

20

http://500px.com/photo/40357406

Event Loop

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

21

Non blocking – Netty approach

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

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

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

23

Netty thread model internals

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

24

EventLoop Vertx through Nettypublic 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

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

25

EventLoop Internals

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

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

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

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

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

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

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

29

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

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

30

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

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

31

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

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

32

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

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

33

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

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

34

Event Bus distributed

Vertx

Vertx

Vertx

Ev

en

tb

us

Ev

en

tb

us

Ev

en

t

l

oo

ps

Multicast

Browsers

Location

transparency

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

35

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

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

36

public class MyVerticle extends Verticle {

@Override

public void start() {

// register handlers

}

@Override

public void stop() {

...

}

}

Verticle

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

37

Polyglot Verticles

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

38

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

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

39

Deploy module runtime

var container = require('vertx/container');

var config = { "web_root": ".", "port": 8080};

//downloaded form vertx repositorycontainer.deployModule("io.vertx~mod-web-server~2.0.0-final", config);

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

40

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

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

41

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

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

42

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

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

43

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

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

44

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

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

45

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

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

46

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

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

47

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

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

48

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

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

49

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

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

50

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

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

51

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

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

52

“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

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

53

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

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

54

“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

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

55

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

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

56

RxJavadef 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

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

57

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

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

58

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

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

59

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

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

60

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

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

61

HTTP (Scala)

vertx.createHttpServer.requestHandler {

req: HttpServerRequest => req.response.end("Hello World!")

}.listen(8080)

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

62

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

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

63

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

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

64

Vertx on RaspberryPipublic 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

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

65

● 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

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

66

References speaker

http://www.slideshare.net/desmax74

https://twitter.com/desmax74

it.linkedin.com/in/desmax74

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx

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

67

Thanks for your attention !

ROME 11-12 april 2014 – Massimiliano Dessì - Vertx


Recommended