Slide 1

Slide 1 text

© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission. Reactor: A Foundation for Reactive FastData Applications on the JVM Jon Brisbin – @j_brisbin Stephane Maldini – @smaldini

Slide 2

Slide 2 text

The Spring IO Directory

Slide 3

Slide 3 text

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!

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Reactor – Landscape

Slide 8

Slide 8 text

Reactor – What does it look like? Environment env = new Environment(); Reactor reactor = Reactors.reactor() .env(env) .dispatcher(RING_BUFFER) .get(); reactor.on($(“topic”), (Event ev) → { System.out.println(“Hello “ + ev.getData()); }); reactor.notify(“topic”, Event.wrap(“John Doe”));

Slide 9

Slide 9 text

Reactor – Dispatchers ● Dispatchers manage task execution – ThreadPoolExecutorDispatcher ● Standard ThreadPoolExecutor – BlockingQueueDispatcher ● Event Loop style – RingBufferDispatcher ● LMAX Disruptor RingBuffer – SynchronousDispatcher

Slide 10

Slide 10 text

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 Selectors can be created to match on domain-specific criteria like header values

Slide 11

Slide 11 text

Reactor – Selectors ● A RegexSelector will match a String by executing the regex over it – R(“some.(.*)”) – Selectors.regex(“some.(.*)”) reactor.on(R(“some.(.+)”), (Event ev) → { // s will be 'topic' String s = ev.getHeaders().get(“group1”); }); reactor.notify(“some.topic”, Event.wrap(“John Doe”));

Slide 12

Slide 12 text

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 ev) → { // s will be 'topic' String s = ev.getHeaders().get(“topic”); }); reactor.notify(“/some/topic”, Event.wrap(“John Doe”));

Slide 13

Slide 13 text

Reactor – Consumer, Function, Supplier, Predicate public interface Consumer { void accept(T t); } public interface Supplier { T get(); } public interface Function { V apply(T t); } public abstract class Predicate { boolean test(T t); }

Slide 14

Slide 14 text

Reactor – Stream ● Streams allow for composition of functions on data – Callback++ – Netflix RxJava Observable, JDK 8 Stream Stream str; str.map(String::toUpperCase) .filter(new Predicate() { public boolean test(String s) { … } }) .consume(s → log.info(“consumed string {}”, s));

Slide 15

Slide 15 text

Reactor – Promise ● Promises allow for composition of functions on data – Share common functions with Stream Promise 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));

Slide 16

Slide 16 text

Reactor – Processor ● Thin wrapper around Disruptor RingBuffer – Converts Disruptor API to Reactor API – Uber fast performance for #UberFastData Processor proc; Operation op = proc.prepare(); op.get().append(data).flip(); op.commit(); proc.batch(512, buff → buff.append(data).flip());

Slide 17

Slide 17 text

Reactor – Spring ● Helpers to integrate Reactor into ApplicationContext – @EnableReactor for easy configuration – Wiring annotated handlers

Slide 18

Slide 18 text

Reactor – Spring @Configuration @EnableReactor public 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(); }

Slide 19

Slide 19 text

Reactor – Spring @Component public class SimpleHandler { @Autowired private Reactor reactor; @Selector(“test.topic”) public void onTestTopic(String s) { // Handle data } }

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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() } }

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

Reactor – Groovy : Environment GroovyEnvironment.create { environment { defaultDispatcher = "test" dispatcher('test') { type = DispatcherType.SYNCHRONOUS } } }

Slide 25

Slide 25 text

Reactor – Groovy : Environment GroovyEnvironment.create { reactor('test1') { stream('test') { consume{ ev-> log.info ev.data } } on('test') { reply it } } }

Slide 26

Slide 26 text

Reactor – Demo

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Reactor – Roadmap ● 1.0 feature complete – 1.0 M3 this morning! – 1.0 RC1 – within a week – 1.0 GA – within a month

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

Reactor – Uber Community contributions ● Meltdown: A Clojure binding by @michaelklishin & @ifesdjeen – https://github.com/clojurewerkz/meltdown

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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