![Page 1: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/1.jpg)
© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission.
Reactor: A Foundation for Reactive FastData Applications on the JVM
Jon Brisbin – @j_brisbinStephane Maldini – @smaldini
![Page 2: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/2.jpg)
The Spring IO Directory
![Page 3: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/3.jpg)
Reactor – Housekeeping
● Tweet questions during the presentation
– @ProjectReactor
– @j_brisbin
– @smaldini
● Stop us anywhere if you have a question
– There are no stupid questions, only stupid answers!
![Page 4: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/4.jpg)
Reactor – What is it?
● Reactor is a foundational library
– Plays in grey area between user-level and lower-level abstractions
– Components and application cores can be built on Reactor
– Drivers, servers, data integration libraries, domain integration libraries, Evented architectures
![Page 5: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/5.jpg)
Reactor – What is it?
● Reactor is a distillation of other libraries and best-practices
– Elements of other patterns and libraries surface throughout Reactor's abstractions
http://stackoverflow.com/questions/16595393/akka-or-reactor
![Page 6: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/6.jpg)
Reactor – What can I build with it?
● Reactor applications are reactive
– Reactive Extensions in .NET
– Netflix RxJava
– Observer pattern
● Reactor applications route events based on a Selector
– Like a routing topic, but can be any object
– Regex, URI template, Class.isAssingableFrom, custom logic
![Page 7: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/7.jpg)
Reactor – Landscape
![Page 8: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/8.jpg)
Reactor – What does it look like?
Environment env = new Environment();
Reactor reactor = Reactors.reactor().env(env).dispatcher(RING_BUFFER).get();
reactor.on($(“topic”), (Event<String> ev) → {System.out.println(“Hello “ + ev.getData());
});
reactor.notify(“topic”, Event.wrap(“John Doe”));
![Page 9: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/9.jpg)
Reactor – Dispatchers
● Dispatchers manage task execution
– ThreadPoolExecutorDispatcher● Standard ThreadPoolExecutor
– BlockingQueueDispatcher● Event Loop style
– RingBufferDispatcher● LMAX Disruptor RingBuffer
– SynchronousDispatcher
![Page 10: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/10.jpg)
Reactor – Selectors
● Selectors are the left-hand side of an equality comparison
– A Selector can be created from any object using $(obj) (or the long form: Selectors.object(obj))
– A Selector can extract data from the matched key
– Predicate<T> Selectors can be created to match on domain-specific criteria like header values
![Page 11: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/11.jpg)
Reactor – Selectors
● A RegexSelector will match a String by executing the regex over it
– R(“some.(.*)”)
– Selectors.regex(“some.(.*)”)
reactor.on(R(“some.(.+)”), (Event<String> ev) → {// s will be 'topic'String s = ev.getHeaders().get(“group1”);
});
reactor.notify(“some.topic”, Event.wrap(“John Doe”));
![Page 12: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/12.jpg)
Reactor – Selectors
● A UriTemplateSelector will match a String by extracting bits from a URI
– U(“/some/{path}”)
– Selectors.uri(“/some/{path}”)
reactor.on(U(“/some/{topic}”), (Event<String> ev) → {// s will be 'topic'String s = ev.getHeaders().get(“topic”);
});
reactor.notify(“/some/topic”, Event.wrap(“John Doe”));
![Page 13: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/13.jpg)
Reactor – Consumer, Function, Supplier, Predicate
public interface Consumer<T> { void accept(T t);
}
public interface Supplier<T> { T get();
}
public interface Function<T, V> { V apply(T t);
}
public abstract class Predicate<T> { boolean test(T t);
}
![Page 14: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/14.jpg)
Reactor – Stream
● Streams allow for composition of functions on data
– Callback++
– Netflix RxJava Observable, JDK 8 Stream
Stream<String> str;
str.map(String::toUpperCase) .filter(new Predicate<String>() {
public boolean test(String s) { … }}).consume(s → log.info(“consumed string {}”, s));
![Page 15: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/15.jpg)
Reactor – Promise
● Promises allow for composition of functions on data
– Share common functions with Stream
Promise<String> p;
String s = p .onSuccess(s → log.info(“consumed string {}”, s)) .onFailure(t → log.error(t.getMessage(), t)) .onComplete(t → log.info(“complete”)) .await(5, SECONDS);
p.map(String::toUpperCase).consume(s → log.info(“UC: {}”, s));
![Page 16: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/16.jpg)
Reactor – Processor
● Thin wrapper around Disruptor RingBuffer
– Converts Disruptor API to Reactor API
– Uber fast performance for #UberFastData
Processor<Buffer> proc;
Operation<Buffer> op = proc.prepare();op.get().append(data).flip();op.commit();
proc.batch(512, buff → buff.append(data).flip());
![Page 17: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/17.jpg)
Reactor – Spring
● Helpers to integrate Reactor into ApplicationContext
– @EnableReactor for easy configuration
– Wiring annotated handlers
![Page 18: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/18.jpg)
Reactor – Spring@Configuration@EnableReactorpublic class ReactorConfiguration {
@Bean public Reactor input(Environment env) { return Reactors.reactor().env(env) .dispatcher(RING_BUFFER).get(); }
@Bean public Reactor output(Environment env) { return Reactors.reactor().env(env) .dispatcher(RING_BUFFER).get(); }
![Page 19: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/19.jpg)
Reactor – Spring
@Componentpublic class SimpleHandler {
@Autowired private Reactor reactor;
@Selector(“test.topic”) public void onTestTopic(String s) { // Handle data }
}
![Page 20: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/20.jpg)
Reactor – Spring
● DispatcherTaskExecutor
– Not really a high-scale TaskExecutor
– Used to get Spring components running in same thread as Reactor Consumers
● ConversionService integration
● PromiseHandlerMethodReturnValueHandler (!)
● ReactorSubscribableChannel
![Page 21: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/21.jpg)
Reactor – Groovy
● First class citizen language implementation
– @CompileStatic ready
– Prominent use of Closure as Consumers, Functions and more
– Operator overloading for elegant programming
– Full Reactor system Builder
![Page 22: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/22.jpg)
Reactor – Groovy : Notification and Consumer
@CompileStatic def welcome(){
reactor.on('greetings') { String s ->reply “hello $s”reply “how are you?”
}
reactor.notify 'greetings', 'Jon'reactor.send('greetings', 'Stephane'){ println it cancel()}
}
![Page 23: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/23.jpg)
Reactor – Groovy : Promises and Streams
def promise = Promises.task { longStuff(); 1 } get()
def transformation = c | { it + 1 }transformation.await() == 2
def deferredStream = Streams.defer().get()(deferredStream & { it > 2 }) << { send(it) }
deferredStream << 1 << 2 << 3 << 4
![Page 24: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/24.jpg)
Reactor – Groovy : Environment
GroovyEnvironment.create {environment {
defaultDispatcher = "test"
dispatcher('test') {type = DispatcherType.SYNCHRONOUS
}}
}
![Page 25: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/25.jpg)
Reactor – Groovy : Environment
GroovyEnvironment.create {reactor('test1') {
stream('test') {consume{ ev->
log.info ev.data}
}on('test') {
reply it}
}}
![Page 26: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/26.jpg)
Reactor – Demo
![Page 27: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/27.jpg)
Reactor – Extensive awesomeness
● TCP Client/Server, with a Netty 4 implementation
● Buffer tools
● Sequencer support, for event ordering
● Work Queue support, with OOTB Java Chronicle implementation
● Logback Appender
![Page 28: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/28.jpg)
Reactor – Roadmap
● 1.0 feature complete
– 1.0 M3 this morning!
– 1.0 RC1 – within a week
– 1.0 GA – within a month
![Page 29: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/29.jpg)
Reactor – Roadmap
1.1 Discussions
– StateBox: A safe tool for concurrent writes
– Better Timer management
– Spring XD, Spring 4
– Exploring Distributed Reactors
● Voice your interest and your use-case here– MillWheel: Fault-Tolerant Stream Processing at Internet
Scale
http://db.disi.unitn.eu/pages/VLDBProgram/pdf/industry/p734-akidau.pdf
![Page 30: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/30.jpg)
Reactor – Uber Community contributions
● Meltdown: A Clojure binding by @michaelklishin & @ifesdjeen
– https://github.com/clojurewerkz/meltdown
![Page 31: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/31.jpg)
Reactor – Uber Community contributions
● High Performance Couchbase ingestion by @daschl
– http://nitschinger.at/Using-the-Reactor-Processor-for-High-Performance-TCP
● Benefits of using Reactor Processor, TCP and Batching facilities
![Page 32: Reactor - a foundation for asynchronous applications on the JVM](https://reader033.vdocuments.us/reader033/viewer/2022052821/554a12f6b4c9058c5d8b4c39/html5/thumbnails/32.jpg)
Learn More. Stay Connected.
● Github organization : http://github.com/reactor
● Follow-up:
– Spring XD
– Spring 4 WebSocket
– Grails and the realtime web
Talk to us on Twitter: @ProjectReactor @springcentral
Find Session replays on YouTube: spring.io/video