32
© 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

Reactor - a foundation for asynchronous applications on the JVM

Embed Size (px)

DESCRIPTION

Speakers: Jon Brisbin and Stephane Maldini Reactor was recently made public after a two-year incubation, evolving slowly alongside frameworks like Storm, Akka, Play, GPars or Vert.x. Integrated with Grails starting with version 2.3, Reactor takes the best ideas from several asynchronous toolsets and synthesizes them into a coherent framework that supports a variety of runtime topologies and makes it easy for developers to efficiently leverage their cloud or traditional hardware assets. Reactor is equally at home inside or outside a Spring ApplicationContext and also provides first-class Groovy support in the form of DSLs and language extensions. Special attention has been given to make Reactor easy enough to use to create single-file node.js-like applications, while maintaining a solid asynchronous toolset that works with Big and Fast Data tools like Gemfire, Spring Integration, and Spring Batch. This talk will give Reactor a proper introduction and show sample code that demonstrates the event-driven and composition-based nature of Reactor applications.

Citation preview

Page 1: Reactor - a foundation for asynchronous applications on the JVM

© 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

The Spring IO Directory

Page 3: Reactor - a foundation for asynchronous applications on the JVM

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

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

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

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

Reactor – Landscape

Page 8: Reactor - a foundation for asynchronous applications on the JVM

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Reactor – Groovy : Environment

GroovyEnvironment.create {environment {

defaultDispatcher = "test"

dispatcher('test') {type = DispatcherType.SYNCHRONOUS

}}

}

Page 25: Reactor - a foundation for asynchronous applications on the JVM

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

Reactor – Demo

Page 27: Reactor - a foundation for asynchronous applications on the JVM

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

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

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

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

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

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