Intro to Reactor

  • 3,229 views
Uploaded on

Brief introduction to Reactor. What it is, why it's important, what it looks like to code with it.

Brief introduction to Reactor. What it is, why it's important, what it looks like to code with it.

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,229
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
83
Comments
0
Likes
7

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Reactor Foundational framework for Reactive, Fast Data applications on the JVM Jon Brisbin Reactor Project Lead © Copyright 2013 Pivotal. All rights reserved. 1
  • 2. What is Reactor? 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. © Copyright 2013 Pivotal. All rights reserved. 2
  • 3. What is Reactor? Reactor is a distillation of other libraries and bestpractices. Elements of other patterns and libraries surface throughout Reactor's abstractions. © Copyright 2013 Pivotal. All rights reserved. 3
  • 4. What is Reactor? © Copyright 2013 Pivotal. All rights reserved. 4
  • 5. What is Reactor? © Copyright 2013 Pivotal. All rights reserved. 5
  • 6. What is Reactive? “Reactive programming can be seen as a natural extension of higher-order functional programming to concurrent systems that deal with distributed state by coordinating and orchestrating asynchronous data streams exchanged by actors.” https://www.coursera.org/course/reactive © Copyright 2013 Pivotal. All rights reserved. 6
  • 7. What is Reactive? Reactive Extensions in .NET – http://rx.codeplex.com/ Netflix RxJava – https://github.com/Netflix/RxJava Observer pattern – http://en.wikipedia.org/wiki/Observer_pattern © Copyright 2013 Pivotal. All rights reserved. 7
  • 8. How is Reactor reactive? Reactor applications route events based on a Selector – Like a routing topic, but can be any object – $(“string”) – $(anonymousObject) RegexSelector: R(“topic.(.+)”) UriTemplateSelector: U(“/{path}/{segment}**”) ClassSelector: T(Throwable.class) JsonPathSelector: J(“$.”) © Copyright 2013 Pivotal. All rights reserved. 8
  • 9. What does the code look like? © Copyright 2013 Pivotal. All rights reserved. 9
  • 10. What does the code look like? © Copyright 2013 Pivotal. All rights reserved. 10
  • 11. What does the code look like? © Copyright 2013 Pivotal. All rights reserved. 11
  • 12. What is Fast Data (and #uberfastdata)? High throughput: millions per second. – Selector-based dispatch: 10-15MM/sec – RingBuffer Processor: 100MM/sec Low latency: microseconds per request. – DO. NOT. BLOCK! High volume: billions per minute/hour/day. – High sustained throughput © Copyright 2013 Pivotal. All rights reserved. 12
  • 13. Reactor - Dispatchers Dispatchers manage task execution ThreadPoolExecutorDispatcher – Backed by standard ThreadPoolExecutor BlockingQueueDispatcher – Event Loop style RingBufferDispatcher – LMAX Disruptor RingBuffer SynchronousDispatcher © Copyright 2013 Pivotal. All rights reserved. 13
  • 14. Reactor - Selectors Can be created from any object using $(obj). – Or use the long form: Selectors.object(obj) Can extract data from the matched key. – U(“/{path}/{segment}”) results in headers “path” and “segment” Predicate<T> Selectors can match on domain-specific criteria – – – – – Header values Object values Time/Date Moon Phase Position of the ISS © Copyright 2013 Pivotal. All rights reserved. 14
  • 15. Reactor - Streams Streams allow for composition of functions on data Callback++ Netflix RxJava Observable, JDK 8 Stream stream.map(String::toUpperCase) .filter(new Predicate<String>() { public boolean test(String s) { … } }) .consume(s → log.info(“consumed string {}”, s)); © Copyright 2013 Pivotal. All rights reserved. 15
  • 16. Reactor - Promises 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) ); © Copyright 2013 Pivotal. All rights reserved. 16
  • 17. Reactor - Processor Processor<Buffer> proc; Operation<Buffer> op = proc.prepare(); op.get().append(data).flip(); op.commit(); proc.batch(512, buff → buff.append(data).flip()); © Copyright 2013 Pivotal. All rights reserved. 17
  • 18. Reactor - Spring @Configuration @EnableReactor public class ReactorConfiguration { @Bean public Reactor input(Environment env) { return Reactors.reactor(env); } @Bean public Reactor output(Environment env) { return Reactors.reactor(env); } © Copyright 2013 Pivotal. All rights reserved. 18
  • 19. Reactor - Spring @Component public class SimpleHandler { @Autowired private Reactor reactor; @Selector(“test.topic”) public void onTestTopic(String s) { // Handle data } } © Copyright 2013 Pivotal. All rights reserved. 19
  • 20. Reactor - Demo © Copyright 2013 Pivotal. All rights reserved. 20
  • 21. Reactor – Random 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 Dynamic Interface-based event proxies © Copyright 2013 Pivotal. All rights reserved. 21
  • 22. Reactor – 3rd Party Support Meltdown: A Clojure binding by @michaelklishin & @ifesdjeen – https://github.com/clojurewerkz/meltdown Couchbase: v2 Java SDK platform © Copyright 2013 Pivotal. All rights reserved. 22
  • 23. Reactor – Spring Framework 4.0 STOMP – Reactor TCP handles STOMP broker relay ReactorSubscribableChannel – SubscribableChannel implementation © Copyright 2013 Pivotal. All rights reserved. 23
  • 24. Reactor – Spring Integration ReactorProcessorMessageDispatcher – Pluggable into any MessageChannel that takes a MessageDispatcher XML Namespace support – <int-reactor:syslog-inbound-channel-adapter id="syslog" port="${port:5140}" channel="output" auto-startup="false"/> More Integration planned in near future © Copyright 2013 Pivotal. All rights reserved. 24
  • 25. Reactor – Spring XD TCP + Netty: Supports all standard Netty Codecs – HTTP, FTP, SMTP, WebSocket, protobuf, etc… Syslog: Standard syslog ingest using Reactor TCP – reactor-syslog: ~700k/sec – syslog-tcp: ~30k/sec MessageBus: Using Selectors like topics and queues – Based on RedisMessageBus © Copyright 2013 Pivotal. All rights reserved. 25
  • 26. BUILT FOR THE SPEED OF BUSINESS