SlideShare une entreprise Scribd logo
1  sur  67
Télécharger pour lire hors ligne
1
Massimiliano Dessì
@desmax74
2
ROME 11-12 april 2014 – Massimiliano Dessì
@desmax74
Massimiliano Dessì has more than 14 years of
experience in programming.
He’s a proud father of three.
Manager of GDG Sardegna, Founder of S
SpringFramework IT,
co-founder of JugSardegna.
Author of Spring 2.5 AOP.
He works and lives in Cagliari, Italy.
Speaker
3
Vert.x
ROME 11-12 april 2014 – Massimiliano Dessì
Vert.x is a
lightweight (IoT)
polyglot
application development framework
for the JVM
enabling you
to build
high performance/reactive applications
4
ROME 11-12 april 2014 – Massimiliano Dessì
5
Software requirements nowadays
Highly Responsive
Real Time
Scalable
Resilient
Petabytes
ROME 11-12 april 2014 – Massimiliano Dessì
6
http://iamdany.com/Famous-Weapons
We need different
weapons
(architectures)
New ProblemsNew ProblemsNew Problems
ROME 11-12 april 2014 – Massimiliano Dessì
7
Reactive
“readily responsive to a stimulus”
Component active and ready to respond to event
Event Driven
ROME 11-12 april 2014 – Massimiliano Dessì
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ì
9
Asyncronous and loosely coupled
+
Non blocking
=
lower latency and higher
throughput
React to event - Event driven
ROME 11-12 april 2014 – Massimiliano Dessì
10
Wear your Seatbelt
ROME 11-12 april 2014 – Massimiliano Dessì
11
Higher throughput
ROME 11-12 april 2014 – Massimiliano Dessì
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/
12
Old blocking model
ROME 11-12 april 2014 – Massimiliano Dessì
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ì
14
Old blocking model
ROME 11-12 april 2014 – Massimiliano Dessì
15
“The C10k problem is the problem of optimising network
sockets to handle a large number of clients at the same
time”
http://en.wikipedia.org/wiki/C10k_problem
ROME 11-12 april 2014 – Massimiliano Dessì
16
Concurrency solutions on jvm
ROME 11-12 april 2014 – Massimiliano Dessì
- No shared mutable state (all solutions derived from this) -
Functional approach [Scala, JDK8]
Actors [Akka]
Reactor/EventLoop [Vertx]
...
17
Reactor pattern
ROME 11-12 april 2014 – Massimiliano Dessì
18
Reactor pattern
ROME 11-12 april 2014 – Massimiliano Dessì
19
Event Loop
ROME 11-12 april 2014 – Massimiliano Dessì
The Reactor pattern
implementation in Vertx
is based on
Netty
EventLoop
20
http://500px.com/photo/40357406
Event Loop
ROME 11-12 april 2014 – Massimiliano Dessì
21
Non blocking – Netty approach
ROME 11-12 april 2014 – Massimiliano Dessì
22
Non blocking – Netty approach
ROME 11-12 april 2014 – Massimiliano Dessì
An eventLoop is powered by exactly on eThread
that never change.
The Events and task are executed in a FIFO order
23
Netty thread model internals
ROME 11-12 april 2014 – Massimiliano Dessì
24
EventLoop Internals
ROME 11-12 april 2014 – Massimiliano Dessì
25
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ì
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ì
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.
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ì
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ì
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
and
async composition (RxJava)
Event Loops
ROME 11-12 april 2014 – Massimiliano Dessì
30
Never block the Event Loop
Never block the Event Loop
Never block the Event Loop
If you need a blocking and long computation code
use a separate thread for this
Golden Rule
ROME 11-12 april 2014 – Massimiliano Dessì
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ì
32
Verticles packaging
(Module)
ROME 11-12 april 2014 – Massimiliano Dessì
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" //runnable
"worker": true //worker verticle
"preserve-cwd":true
...
}
33
Event Bus distributed
Vertx
Vertx
Vertx
Eventbus
Eventbus
Eventloops
Multicast
Browsers
ROME 11-12 april 2014 – Massimiliano Dessì
Location
transparency
34
public class MyVerticle extends Verticle {
@Override
public void start() {
// register handlers
}
@Override
public void start(Future<Void> startedResult) {
// register handlers
}
@Override
public void stop() {...}
}
Verticle
ROME 11-12 april 2014 – Massimiliano Dessì
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ì
36
Polyglot Verticles
ROME 11-12 april 2014 – Massimiliano Dessì
37
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ì
38
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ì
39
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ì
40
Pub Sub
EventBus bus = vertx.eventBus();
bus.publish(“com.codemotion.firsthandler”, “Hello world”);
publish mean broadcast, all subscribers
ROME 11-12 april 2014 – Massimiliano Dessì
41
P2P
EventBus bus = vertx.eventBus();
bus.send(“39.216667.Nord-9.116667.Est”, “Hello world”);
send mean point to point, only one subscriber, round robin
ROME 11-12 april 2014 – Massimiliano Dessì
42
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ì
43
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ì
44
Message from the UI
ROME 11-12 april 2014 – Massimiliano Dessì
<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>
45
Goodies
ROME 11-12 april 2014 – Massimiliano Dessì
● HTTP/HTTPS servers/clients
● WebSockets support
● SockJS support
● Timers
● Buffers
● Streams and Pumps
● Routing
● Async File I/O
● Shared Data
● Module Repo
(http://modulereg.vertx.io/)
● WebServer
● SessionManager
● Auth manager
● Persistors (Mongo, JDBC)
● Spring
● RxJava
● Many others
● Compile on the fly
(deploy .java verticle)
46
eventBus.sendWithTimeout("test.address", "This is a message", 1000,
new Handler<AsyncResult<Message<String>>>() {
public void handle(AsyncResult<Message<String>> result) {
if (result.succeeded()) {
System.out.println("I received a reply " + message.body);
} else {
ReplyException ex = (ReplyException)result.cause();
System.err.println("Failure type: " + ex.failureType();
System.err.println("Failure code: " + ex.failureCode();
System.err.println("Failure message: " + ex.message();
// restart dead verticle ?
}
}
});
Notification of reply failure
ROME 11-12 april 2014 – Massimiliano Dessì
https://github.com/Netflix/RxJava/wiki
ROME 11-12 april 2014 – Massimiliano Dessì
47
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ì
https://github.com/Netflix/RxJava/wiki
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ì
https://github.com/Netflix/RxJava/wiki
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
ROME 11-12 april 2014 – Massimiliano Dessì
https://github.com/Netflix/RxJava/wiki
50
RxJava
ROME 11-12 april 2014 – Massimiliano Dessì
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
51
RxJava
ROME 11-12 april 2014 – Massimiliano Dessì
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
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
ROME 11-12 april 2014 – Massimiliano Dessì
https://github.com/Netflix/RxJava/wiki
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ì
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ì
55
RxJava
ROME 11-12 april 2014 – Massimiliano Dessì
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 differenences from
the client perspective,
an Observable in both cases
http://netflix.github.io/RxJava/javadoc/rx/package-tree.html
56
mod-rxvertx
https://github.com/Netflix/RxJava/wik
i
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ì
57
Deploy module runtime
ROME 11-12 april 2014 – Massimiliano Dessì
// You can require API modules piecemeal
var container = require('vertx/container');
// Or you can pull everything in at once
// var vertx = require('vertx');
// var container = vertx.container;
var config = {
"web_root": ".",
"port": 8080
};
//downloaded form vertx repository
container.deployModule("io.vertx~mod-web-server~2.0.0-final", config);
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. We call this module fail-
over.
To run a module with HA, you simply add the -ha switch when running it on the command line, for example:
58
Automatic failover
ROME 11-12 april 2014 – Massimiliano Dessì
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. We call this module fail-over.
To run a module with HA, you simply add the -ha switch when
running it on the command line, for example:
vertx runmod com.acme~my-mod~2.1 -ha
org.vertx.java.platform.impl.HAManager
59
HTTP (Java)
ROME 11-12 april 2014 – Massimiliano Dessì
HttpServer server = vertx.createHttpServer();
server.requestHandler(new Handler< HttpServerRequest >() {
public void handle(HttpServerRequest request) {
request.response().write("Hello world").end();
}
});
server.listen(8080, "localhost");
60
HTTP (JavaScript)
ROME 11-12 april 2014 – Massimiliano Dessì
var vertx = require('vertx');
var server = vertx.createHttpServer();
server.requestHandler(function(request) {
request.response.write("Hello world").end();
});
server.listen(8080, "localhost");
61
HTTP (Scala)
ROME 11-12 april 2014 – Massimiliano Dessì
vertx.createHttpServer.requestHandler {
req: HttpServerRequest => req.response.end("Hello World!")
}.listen(8080)
62
HTTP (Clojure)
ROME 11-12 april 2014 – Massimiliano Dessì
(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))
63
HTTP (JRuby)
ROME 11-12 april 2014 – Massimiliano Dessì
require "vertx"
server = Vertx::HttpServer.new
server.request_handler do |request|
request.response.write("Hello world").end;
end
server.listen(8080, "localhost")
64
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ì
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ì
66
References speaker
ROME 11-12 april 2014 – Massimiliano Dessì
http://www.slideshare.net/desmax74
https://twitter.com/desmax74
it.linkedin.com/in/desmax74
67
Thanks for your attention !
ROME 11-12 april 2014 – Massimiliano Dessì

Contenu connexe

Similaire à Vert.x - Dessì

Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMMassimiliano 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...Codemotion
 
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.xCodemotion
 
HLayer / Cloud Native Best Practices
HLayer / Cloud Native Best PracticesHLayer / Cloud Native Best Practices
HLayer / Cloud Native Best PracticesAymen EL Amri
 
TechEvent OpenShift for Developers
TechEvent OpenShift for DevelopersTechEvent OpenShift for Developers
TechEvent OpenShift for DevelopersTrivadis
 
Docker what - Frank Maounis
Docker what - Frank MaounisDocker what - Frank Maounis
Docker what - Frank MaounisFrank Maounis
 
In-Flight Asset Management with Neo4j - Michael Wilmes @ GraphConnect London ...
In-Flight Asset Management with Neo4j - Michael Wilmes @ GraphConnect London ...In-Flight Asset Management with Neo4j - Michael Wilmes @ GraphConnect London ...
In-Flight Asset Management with Neo4j - Michael Wilmes @ GraphConnect London ...Neo4j
 
Wherecamp Navigation Conference 2015 - 3D Rapid mapping on mobile devices
Wherecamp Navigation Conference 2015 - 3D Rapid mapping on mobile devicesWherecamp Navigation Conference 2015 - 3D Rapid mapping on mobile devices
Wherecamp Navigation Conference 2015 - 3D Rapid mapping on mobile devicesWhereCampBerlin
 
OrientDB: a Document-Graph Database ready for the Cloud - Dell'Aquila
OrientDB: a Document-Graph Database ready for the Cloud - Dell'AquilaOrientDB: a Document-Graph Database ready for the Cloud - Dell'Aquila
OrientDB: a Document-Graph Database ready for the Cloud - Dell'AquilaCodemotion
 
PkgSrc in Five Minutes
PkgSrc in Five MinutesPkgSrc in Five Minutes
PkgSrc in Five MinutesJens Rehsack
 
Introduction to TensorFlow
Introduction to TensorFlowIntroduction to TensorFlow
Introduction to TensorFlowMatthias Feys
 
Docker - BWI Innovation Talk
Docker - BWI Innovation TalkDocker - BWI Innovation Talk
Docker - BWI Innovation TalkTimm Heuss
 
My Journey to Becoming a Docker Captain
My Journey to Becoming a Docker CaptainMy Journey to Becoming a Docker Captain
My Journey to Becoming a Docker CaptainAjeet Singh Raina
 
[Sirius Day Eindhoven 2018] ASML's MDE Going Sirius
[Sirius Day Eindhoven 2018]  ASML's MDE Going Sirius[Sirius Day Eindhoven 2018]  ASML's MDE Going Sirius
[Sirius Day Eindhoven 2018] ASML's MDE Going SiriusObeo
 
Docker containers : introduction
Docker containers : introductionDocker containers : introduction
Docker containers : introductionrinnocente
 
Unleash software architecture leveraging on docker
Unleash software architecture leveraging on dockerUnleash software architecture leveraging on docker
Unleash software architecture leveraging on dockerAdrien Blind
 
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...Codemotion
 
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...Alessandro Confetti
 
Container-as-a-Service – Plattformunabhängige Datenbankbereitstellung in der ...
Container-as-a-Service – Plattformunabhängige Datenbankbereitstellung in der ...Container-as-a-Service – Plattformunabhängige Datenbankbereitstellung in der ...
Container-as-a-Service – Plattformunabhängige Datenbankbereitstellung in der ...MariaDB plc
 

Similaire à Vert.x - Dessì (20)

Vert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVMVert.X like Node.js but polyglot and reactive on JVM
Vert.X like Node.js but polyglot and reactive on JVM
 
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...
 
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
 
HLayer / Cloud Native Best Practices
HLayer / Cloud Native Best PracticesHLayer / Cloud Native Best Practices
HLayer / Cloud Native Best Practices
 
TechEvent OpenShift for Developers
TechEvent OpenShift for DevelopersTechEvent OpenShift for Developers
TechEvent OpenShift for Developers
 
Docker what - Frank Maounis
Docker what - Frank MaounisDocker what - Frank Maounis
Docker what - Frank Maounis
 
In-Flight Asset Management with Neo4j - Michael Wilmes @ GraphConnect London ...
In-Flight Asset Management with Neo4j - Michael Wilmes @ GraphConnect London ...In-Flight Asset Management with Neo4j - Michael Wilmes @ GraphConnect London ...
In-Flight Asset Management with Neo4j - Michael Wilmes @ GraphConnect London ...
 
Wherecamp Navigation Conference 2015 - 3D Rapid mapping on mobile devices
Wherecamp Navigation Conference 2015 - 3D Rapid mapping on mobile devicesWherecamp Navigation Conference 2015 - 3D Rapid mapping on mobile devices
Wherecamp Navigation Conference 2015 - 3D Rapid mapping on mobile devices
 
OrientDB: a Document-Graph Database ready for the Cloud - Dell'Aquila
OrientDB: a Document-Graph Database ready for the Cloud - Dell'AquilaOrientDB: a Document-Graph Database ready for the Cloud - Dell'Aquila
OrientDB: a Document-Graph Database ready for the Cloud - Dell'Aquila
 
OrientDB Codemotion 2014
OrientDB Codemotion 2014OrientDB Codemotion 2014
OrientDB Codemotion 2014
 
PkgSrc in Five Minutes
PkgSrc in Five MinutesPkgSrc in Five Minutes
PkgSrc in Five Minutes
 
Introduction to TensorFlow
Introduction to TensorFlowIntroduction to TensorFlow
Introduction to TensorFlow
 
Docker - BWI Innovation Talk
Docker - BWI Innovation TalkDocker - BWI Innovation Talk
Docker - BWI Innovation Talk
 
My Journey to Becoming a Docker Captain
My Journey to Becoming a Docker CaptainMy Journey to Becoming a Docker Captain
My Journey to Becoming a Docker Captain
 
[Sirius Day Eindhoven 2018] ASML's MDE Going Sirius
[Sirius Day Eindhoven 2018]  ASML's MDE Going Sirius[Sirius Day Eindhoven 2018]  ASML's MDE Going Sirius
[Sirius Day Eindhoven 2018] ASML's MDE Going Sirius
 
Docker containers : introduction
Docker containers : introductionDocker containers : introduction
Docker containers : introduction
 
Unleash software architecture leveraging on docker
Unleash software architecture leveraging on dockerUnleash software architecture leveraging on docker
Unleash software architecture leveraging on docker
 
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...
 
Container-as-a-Service – Plattformunabhängige Datenbankbereitstellung in der ...
Container-as-a-Service – Plattformunabhängige Datenbankbereitstellung in der ...Container-as-a-Service – Plattformunabhängige Datenbankbereitstellung in der ...
Container-as-a-Service – Plattformunabhängige Datenbankbereitstellung in der ...
 

Plus de Codemotion

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Codemotion
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyCodemotion
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaCodemotion
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserCodemotion
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Codemotion
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Codemotion
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Codemotion
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 - Codemotion
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Codemotion
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Codemotion
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Codemotion
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Codemotion
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Codemotion
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Codemotion
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Codemotion
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...Codemotion
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Codemotion
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Codemotion
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Codemotion
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Codemotion
 

Plus de Codemotion (20)

Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
Fuzz-testing: A hacker's approach to making your code more secure | Pascal Ze...
 
Pompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending storyPompili - From hero to_zero: The FatalNoise neverending story
Pompili - From hero to_zero: The FatalNoise neverending story
 
Pastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storiaPastore - Commodore 65 - La storia
Pastore - Commodore 65 - La storia
 
Pennisi - Essere Richard Altwasser
Pennisi - Essere Richard AltwasserPennisi - Essere Richard Altwasser
Pennisi - Essere Richard Altwasser
 
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
Michel Schudel - Let's build a blockchain... in 40 minutes! - Codemotion Amst...
 
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
Richard Süselbeck - Building your own ride share app - Codemotion Amsterdam 2019
 
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
Eward Driehuis - What we learned from 20.000 attacks - Codemotion Amsterdam 2019
 
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 - Francesco Baldassarri  - Deliver Data at Scale - Codemotion Amsterdam 2019 -
Francesco Baldassarri - Deliver Data at Scale - Codemotion Amsterdam 2019 -
 
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
Martin Förtsch, Thomas Endres - Stereoscopic Style Transfer AI - Codemotion A...
 
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
Melanie Rieback, Klaus Kursawe - Blockchain Security: Melting the "Silver Bul...
 
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
Angelo van der Sijpt - How well do you know your network stack? - Codemotion ...
 
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
Lars Wolff - Performance Testing for DevOps in the Cloud - Codemotion Amsterd...
 
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
Sascha Wolter - Conversational AI Demystified - Codemotion Amsterdam 2019
 
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
Michele Tonutti - Scaling is caring - Codemotion Amsterdam 2019
 
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
Pat Hermens - From 100 to 1,000+ deployments a day - Codemotion Amsterdam 2019
 
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
James Birnie - Using Many Worlds of Compute Power with Quantum - Codemotion A...
 
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
Don Goodman-Wilson - Chinese food, motor scooters, and open source developmen...
 
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
Pieter Omvlee - The story behind Sketch - Codemotion Amsterdam 2019
 
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
Dave Farley - Taking Back “Software Engineering” - Codemotion Amsterdam 2019
 
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
 

Dernier

FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024The Digital Insurer
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWERMadyBayot
 
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...apidays
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
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 Takeoffsammart93
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
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 2024The Digital Insurer
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
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 RobisonAnna Loughnan Colquhoun
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxRustici Software
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfsudhanshuwaghmare1
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbuapidays
 
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 CVKhem
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDropbox
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfOverkill Security
 

Dernier (20)

FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
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...
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
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
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
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
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
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
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
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
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
DBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor PresentationDBX First Quarter 2024 Investor Presentation
DBX First Quarter 2024 Investor Presentation
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 

Vert.x - Dessì

  • 2. 2 ROME 11-12 april 2014 – Massimiliano Dessì @desmax74 Massimiliano Dessì has more than 14 years of experience in programming. He’s a proud father of three. Manager of GDG Sardegna, Founder of S SpringFramework IT, co-founder of JugSardegna. Author of Spring 2.5 AOP. He works and lives in Cagliari, Italy. Speaker
  • 3. 3 Vert.x ROME 11-12 april 2014 – Massimiliano Dessì Vert.x is a lightweight (IoT) polyglot application development framework for the JVM enabling you to build high performance/reactive applications
  • 4. 4 ROME 11-12 april 2014 – Massimiliano Dessì
  • 5. 5 Software requirements nowadays Highly Responsive Real Time Scalable Resilient Petabytes ROME 11-12 april 2014 – Massimiliano Dessì
  • 6. 6 http://iamdany.com/Famous-Weapons We need different weapons (architectures) New ProblemsNew ProblemsNew Problems ROME 11-12 april 2014 – Massimiliano Dessì
  • 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ì
  • 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ì
  • 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ì
  • 10. 10 Wear your Seatbelt ROME 11-12 april 2014 – Massimiliano Dessì
  • 11. 11 Higher throughput ROME 11-12 april 2014 – Massimiliano Dessì 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/
  • 12. 12 Old blocking model ROME 11-12 april 2014 – Massimiliano Dessì
  • 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ì
  • 14. 14 Old blocking model ROME 11-12 april 2014 – Massimiliano Dessì
  • 15. 15 “The C10k problem is the problem of optimising network sockets to handle a large number of clients at the same time” http://en.wikipedia.org/wiki/C10k_problem ROME 11-12 april 2014 – Massimiliano Dessì
  • 16. 16 Concurrency solutions on jvm ROME 11-12 april 2014 – Massimiliano Dessì - No shared mutable state (all solutions derived from this) - Functional approach [Scala, JDK8] Actors [Akka] Reactor/EventLoop [Vertx] ...
  • 17. 17 Reactor pattern ROME 11-12 april 2014 – Massimiliano Dessì
  • 18. 18 Reactor pattern ROME 11-12 april 2014 – Massimiliano Dessì
  • 19. 19 Event Loop ROME 11-12 april 2014 – Massimiliano Dessì The Reactor pattern implementation in Vertx is based on Netty EventLoop
  • 20. 20 http://500px.com/photo/40357406 Event Loop ROME 11-12 april 2014 – Massimiliano Dessì
  • 21. 21 Non blocking – Netty approach ROME 11-12 april 2014 – Massimiliano Dessì
  • 22. 22 Non blocking – Netty approach ROME 11-12 april 2014 – Massimiliano Dessì An eventLoop is powered by exactly on eThread that never change. The Events and task are executed in a FIFO order
  • 23. 23 Netty thread model internals ROME 11-12 april 2014 – Massimiliano Dessì
  • 24. 24 EventLoop Internals ROME 11-12 april 2014 – Massimiliano Dessì
  • 25. 25 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ì
  • 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ì
  • 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. 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ì
  • 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ì
  • 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 and async composition (RxJava) Event Loops ROME 11-12 april 2014 – Massimiliano Dessì
  • 30. 30 Never block the Event Loop Never block the Event Loop Never block the Event Loop If you need a blocking and long computation code use a separate thread for this Golden Rule ROME 11-12 april 2014 – Massimiliano Dessì
  • 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ì
  • 32. 32 Verticles packaging (Module) ROME 11-12 april 2014 – Massimiliano Dessì 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" //runnable "worker": true //worker verticle "preserve-cwd":true ... }
  • 33. 33 Event Bus distributed Vertx Vertx Vertx Eventbus Eventbus Eventloops Multicast Browsers ROME 11-12 april 2014 – Massimiliano Dessì Location transparency
  • 34. 34 public class MyVerticle extends Verticle { @Override public void start() { // register handlers } @Override public void start(Future<Void> startedResult) { // register handlers } @Override public void stop() {...} } Verticle ROME 11-12 april 2014 – Massimiliano Dessì
  • 35. 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ì
  • 36. 36 Polyglot Verticles ROME 11-12 april 2014 – Massimiliano Dessì
  • 37. 37 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ì
  • 38. 38 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ì
  • 39. 39 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ì
  • 40. 40 Pub Sub EventBus bus = vertx.eventBus(); bus.publish(“com.codemotion.firsthandler”, “Hello world”); publish mean broadcast, all subscribers ROME 11-12 april 2014 – Massimiliano Dessì
  • 41. 41 P2P EventBus bus = vertx.eventBus(); bus.send(“39.216667.Nord-9.116667.Est”, “Hello world”); send mean point to point, only one subscriber, round robin ROME 11-12 april 2014 – Massimiliano Dessì
  • 42. 42 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ì
  • 43. 43 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ì
  • 44. 44 Message from the UI ROME 11-12 april 2014 – Massimiliano Dessì <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>
  • 45. 45 Goodies ROME 11-12 april 2014 – Massimiliano Dessì ● HTTP/HTTPS servers/clients ● WebSockets support ● SockJS support ● Timers ● Buffers ● Streams and Pumps ● Routing ● Async File I/O ● Shared Data ● Module Repo (http://modulereg.vertx.io/) ● WebServer ● SessionManager ● Auth manager ● Persistors (Mongo, JDBC) ● Spring ● RxJava ● Many others ● Compile on the fly (deploy .java verticle)
  • 46. 46 eventBus.sendWithTimeout("test.address", "This is a message", 1000, new Handler<AsyncResult<Message<String>>>() { public void handle(AsyncResult<Message<String>> result) { if (result.succeeded()) { System.out.println("I received a reply " + message.body); } else { ReplyException ex = (ReplyException)result.cause(); System.err.println("Failure type: " + ex.failureType(); System.err.println("Failure code: " + ex.failureCode(); System.err.println("Failure message: " + ex.message(); // restart dead verticle ? } } }); Notification of reply failure ROME 11-12 april 2014 – Massimiliano Dessì https://github.com/Netflix/RxJava/wiki ROME 11-12 april 2014 – Massimiliano Dessì
  • 47. 47 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ì https://github.com/Netflix/RxJava/wiki
  • 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ì https://github.com/Netflix/RxJava/wiki
  • 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 ROME 11-12 april 2014 – Massimiliano Dessì https://github.com/Netflix/RxJava/wiki
  • 50. 50 RxJava ROME 11-12 april 2014 – Massimiliano Dessì 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
  • 51. 51 RxJava ROME 11-12 april 2014 – Massimiliano Dessì 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
  • 52. 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 ROME 11-12 april 2014 – Massimiliano Dessì https://github.com/Netflix/RxJava/wiki
  • 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ì
  • 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ì
  • 55. 55 RxJava ROME 11-12 april 2014 – Massimiliano Dessì 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 differenences from the client perspective, an Observable in both cases http://netflix.github.io/RxJava/javadoc/rx/package-tree.html
  • 56. 56 mod-rxvertx https://github.com/Netflix/RxJava/wik i 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ì
  • 57. 57 Deploy module runtime ROME 11-12 april 2014 – Massimiliano Dessì // You can require API modules piecemeal var container = require('vertx/container'); // Or you can pull everything in at once // var vertx = require('vertx'); // var container = vertx.container; var config = { "web_root": ".", "port": 8080 }; //downloaded form vertx repository container.deployModule("io.vertx~mod-web-server~2.0.0-final", config); 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. We call this module fail- over. To run a module with HA, you simply add the -ha switch when running it on the command line, for example:
  • 58. 58 Automatic failover ROME 11-12 april 2014 – Massimiliano Dessì 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. We call this module fail-over. To run a module with HA, you simply add the -ha switch when running it on the command line, for example: vertx runmod com.acme~my-mod~2.1 -ha org.vertx.java.platform.impl.HAManager
  • 59. 59 HTTP (Java) ROME 11-12 april 2014 – Massimiliano Dessì HttpServer server = vertx.createHttpServer(); server.requestHandler(new Handler< HttpServerRequest >() { public void handle(HttpServerRequest request) { request.response().write("Hello world").end(); } }); server.listen(8080, "localhost");
  • 60. 60 HTTP (JavaScript) ROME 11-12 april 2014 – Massimiliano Dessì var vertx = require('vertx'); var server = vertx.createHttpServer(); server.requestHandler(function(request) { request.response.write("Hello world").end(); }); server.listen(8080, "localhost");
  • 61. 61 HTTP (Scala) ROME 11-12 april 2014 – Massimiliano Dessì vertx.createHttpServer.requestHandler { req: HttpServerRequest => req.response.end("Hello World!") }.listen(8080)
  • 62. 62 HTTP (Clojure) ROME 11-12 april 2014 – Massimiliano Dessì (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))
  • 63. 63 HTTP (JRuby) ROME 11-12 april 2014 – Massimiliano Dessì require "vertx" server = Vertx::HttpServer.new server.request_handler do |request| request.response.write("Hello world").end; end server.listen(8080, "localhost")
  • 64. 64 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ì
  • 65. 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ì
  • 66. 66 References speaker ROME 11-12 april 2014 – Massimiliano Dessì http://www.slideshare.net/desmax74 https://twitter.com/desmax74 it.linkedin.com/in/desmax74
  • 67. 67 Thanks for your attention ! ROME 11-12 april 2014 – Massimiliano Dessì