Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring Workshop Mark Paluch, Pivotal Software, Inc. @mp911de
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ @mp911de github.com/mp911de paluch.biz Mark Paluch
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Programm ! 10:00 Begrüßung ! 10:15–11:30 Was ist Reaktive Programmierung? ! 11:30-13:00 Einführung in Project Reactor ! 13:00-14:00 Mittagspause ! 14:00-15:00 Spring WebFlux ! 15:00–15:30 Pause ! 15:30-16:30 Reactive Spring Data !3
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ What is Reactive Programming?
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !6 Understanding imperative HttpClient c = …; HttpGet get = new HttpGet("https://google.com"); HttpResponse response = c.execute(get);
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !9 Understanding imperative HttpClient c = …; for (int i = 0; i < 10; i++) { HttpGet get = new HttpGet("https://google.com"); HttpResponse response = c.execute(get); // … }
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Remote calls with latency !10 Request Data access Remote data service I/O Wait This one is waiting
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Makes assumptions over resource usage ! Developers are in charge of resource usage efficiency !11 Imperative programming
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Container calls code on a Thread ! Call continues until all work is done ! Thread is occupied ! Thread is released at the end of work • Latencies affect duration in which Thread is occupied !12 Imperative: Web applications
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Synchronous fetch model !13 Service App Data store App Service
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Reactive is used to describe event-driven systems ! Reactive is used more for scalability and stability than for speed ! Reacts to resource availability !14 What is reactive?
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Serve slow clients !15 Server
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Serve slow clients !16 Server
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Push message to client !17 Server Message Broker
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Live (continuous) database queries ! UI event handling (Android) ! Big Data ! Real time analytics ! HTTP/2 !18 Other use cases
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! A form of computer timing control protocol ! Starts processing after receiving a signal ! Completed eventually !19 Asynchronous
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Introduces concurrency ! Does not block the caller • At least in the first place ! Keeps more Threads busy !20 Asynchronous
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Unit of execution • Runnable ! Executor • Thread • ThreadPool !21 Asynchronous: Requirements
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Say „callback“ to a JavaScript developer and he will start crying instantaneously! – Venkat Subramaniam !26
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !27 Using Java types Non- Blocking Streaming Pattern Future<T> x Pull CompletableFuture<T> x Push Stream<T> x Pull Iterator<T> x Pull Input/OutputStream x Pull
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Available since Java 8 ! Functional composition ! Functional transformation !28 Asynchronous: CompletableFuture
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !30 Concurrency effects public static class Test extends Thread { boolean keepRunning = true; public void run() { long count = 0; while (keepRunning) { count++; } System.out.println("Thread terminated after cycles: " + count); } } public static void main(String[] args) throws InterruptedException { Test t = new Test(); t.start(); System.out.println("Started"); Thread.sleep(1000); t.keepRunning = false; System.out.println("keepRunning set to false."); }
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Understanding the Java Memory Model is hard. Getting concurrency right is harder. !31
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Effects of an async fetch model !32 Request I/O Requires synchronization Still waiting, eh?
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Makes assumptions over resource usage ! Need a change • Change programming model !33 Imperative programming
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ We need a different toolset! !34
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ We need a different toolset! !35
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Allows building and composing asynchronous applications ! Reacts to the availability of resources ! Requires a reactive API !36 Reactive programming model
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Collaborative initiative to provide a standard for asynchronous stream processing with non-blocking back pressure. ! Co-designed by Twitter, Lightbend, Pivotal, Netflix and many others ! De-facto interop standard ! Java 9: Flow API !37 Reactive Streams
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Publisher and Subscriber !38 Subscriber Publisher Subscribe Data
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !39 Distributions org.reactivestreams:reactive-streams • Publisher • Subscriber • Subscription • Processor • Flow.Publisher • Flow.Subscriber • Flow.Subscription • Flow.Processor Part of Java 9 in java.util.concurrent
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Apply a wide range of operators: map, split, merge, delay RxJava 1 2 Project Reactor Akka Streams !40 Reactive libraries
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !41 Reactive APIs on the JVM Reactive API Reactive Streams Type Non-Reactive Streams Type RxJava 1 Observable Single Completable RxJava 2 Flowable Observable Single Maybe,Completable Akka Streams 2 Source Sink Flow Project Reactor Mono Flux
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Use Reactor if • using Java 8 ! Use RxJava if • stuck with Java 6 • need checked Exceptions in functions !43 RxJava 2 or Project Reactor
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! „Volume knob“ for data emission ! Communicates demand (capacity) of the subscriber to the publisher !44 Back pressure
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Request all the data ! Now !45 Asynchronous fetch model AsyncHttpClient c = …; for (int i = 0; i < 10; i++) { HttpGet get = new HttpGet("https://google.com"); Future<HttpResponse> response = c.execute(get); // … }
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Asynchronous fetch model !46 Remote App Remote Remote App can’t keep up (Back pressure)
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Publisher and Subscriber !47 Subscriber Publisher Publish as fast as possible
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !48 Publisher<T> I/O thread push
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Back pressure control !49 Subscriber Publisher Demand
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Back pressure control !50 Subscriber Publisher Demand
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model !51 Data store App Data store Data store Data store App
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Zeit für Fragen 11:30-13:00 Einführung in Project Reactor
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Introduction to Project Reactor
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ How do you achieve asynchronous, non-blocking processing? Without losing your mind? !54
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !58 Publisher<T> Thread pushes data
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !59 Iterable<T> Iterator<T> Publisher<T> Subscriber<T> vs.
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !60 Subscriber Publisher feedback push events produces consumes Relation between Publisher and Subscriber
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !61 Subscriber Publisher feedback push events produces consumes interfaces from Reactive Streams spec Relation between Publisher and Subscriber
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !62 Subscriber Publisher feedback 0..N elements + 0..1 (complete | error) produces consumes Signals
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !63 Subscriber Publisher push events produces consumes Demand (Back pressure control) Back pressure
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !64 Subscriber Publisher push events produces consumes can I have an API though?
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !65 Subscriber Publisher push events produces consumes
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Composing asynchronous & event-based sequences, using non-blocking operators ! Without sacrifice • No callback hell • No Futures ! End to end Reactive Streams !67 Project Reactor
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Duration ! CompletableFuture ! Stream !68 Focus on Java 8
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Project Reactor Types !69 Mono<T> Flux<T> 0..1..Error 0..N..Error
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !70 This is the timeline of the Flux. Time flows from left to right. These are items emitted by the Flux. This vertical line indicates that the Flux has completed successfully. These dotted lines and this box indicate that a transformation is being applied to the Flux. The text inside the box shows the nature of the transformation. If for some reason the Flux terminates abnormally, with an error, the vertical line is replaced by an X. This Flux is the result of the transformation. operator 1 2 3 4 5 6 1 2 3 Explaining reactive operations
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Explaining reactive operations !71 Transformed Completion signal Error signal Emitted element Time
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux !72 These are items emitted by the Flux. operator 1 2 3 4 5 6 1 2 3
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono !73 This is the eventual item emitted by the Mono. operator 1 1
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !74 Operators an Rx-inspired API with a vocabulary of operators similar to RxJava...
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !75 Operators an Rx-inspired API ...but not exactly the same
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !76 Flux/Mono generator operator operator operator nothing happens until you subscribe
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !77 Flux/Mono generator Subscriber operator operator operator nothing happens until you subscribe
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux/Mono generator Subscriber operator operator operator Sub Sub Sub per Subscription state
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ data flows Flux/Mono generator Subscriber operator operator operator Sub Sub Sub
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Reactor is agnostic ! Facilitates switching ! Schedulers !80 Threading (contexts)
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! single: Single-Threaded scheduler ! elastic: Grows (unbounded) as needed • used for I/O offloading ! parallel: Fixed-sized at number of CPU cores • Event-Loop ! timer: Timed tasks !81 Schedulers
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! publishOn • switch emission of the Publisher on a thread ! subscribeOn • make the subscription and request happen on a particular thread !82 Context switching
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !83 Flux/Mono generator operator subscribeOn operator publishOn operator operator Subscriber Sub Sub Sub Sub Sub Sub
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !84 Flux/Mono generator operator subscribe On operator publish On operator operator Subscriber Sub Sub Sub Sub Sub Sub
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !85 Flux/Mono generator operator subscribeOn operator publishOn operator operator Subscriber Sub Sub Sub Sub Sub Sub
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !86 Flux/Mono generator operator subscribeOn operator publishOn operator operator Subscriber Sub Sub Sub Sub Sub Sub
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !87 Flux/Mono generator operator subscribeOn operator publishOn operator operator Subscriber Sub Sub Sub Sub Sub Sub
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !88 Flux/Mono generator operator subscribeOn operator publishOn operator operator Subscriber Sub Sub Sub Sub Sub Sub
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Operator time! map, filter, buffer !89
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !90 Flux.range Subscriber map filter buffer
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !94 Flux.range Subscriber map filter buffer
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !95 Flux.range Subscriber map filter buffer
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !96 Flux.range Subscriber map filter buffer
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !97 Flux.range Subscriber map filter buffer
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !98 Flux.range Subscriber map filter buffer
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !99 Flux.range Subscriber map filter buffer
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !100 Flux.range Subscriber map filter buffer
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !101 Flux.range(5, 3) .map(i -> i + 3) .filter(i -> i % 2 == 0) .buffer(3)
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Operator time²! flatMap all the things !103
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Asynchronous sub-process ! Map to 0, 1 or N elements !104 flatMap operator
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !108 flatMap(user -> tweetStream(user))
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !109 flatMap(user -> tweetStream(user))
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !110 flatMap(user -> tweetStream(user))
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !111 flatMap(user -> tweetStream(user))
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! It’s all about efficient resource usage ! Turn around the idea of imperative programming ! React to the availability of resources !115 What is Reactive Spring
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Spring WebFlux – Reactive web applications ! Spring Data – Reactive data store support ! Spring Cloud Stream – Message-driven microservices ! Spring Boot – Reactive auto configuration ! Spring Security – Security for reactive web applications ! Spring Cloud Gateway – API Gateway !117 Reactive Spring portfolio
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Spring’s reactive web framework ! End to end non-blocking and asynchronous execution !118 What is WebFlux?
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Project Reactor 3.1 ! Spring Framework 5.0 ! Optional: Spring Boot 2.0 !119 Requirements
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Servlet API is thread-bound ! Servlet API has no native HTTP/2 support (yet) ! No notion of back pressure ! SSE API’s (Server-sent events) are vendor-specific !122
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Allows usage of Reactive types ! Improves asynchronous usage (DeferredResult) ! Improves SSE streaming usage (ResponseBodyEmitter) ! Everything else is blocking !124 Spring Web MVC
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Zeit für Fragen 15:00–15:30 Pause 15:30-16:30 Reactive Spring Data
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today !127 Request Data access Remote data service I/O Wait This one is waiting
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today !128 Request Data access Remote data service Multiple calls Bulk fetch
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Keep resources busy ! Connection contention ! Usually synchronous/blocking ! Multiple requests ! Asynchronous isn’t always a good answer !129 Todays’ data access
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Project Reactor 3.1 ! Spring Framework 5.0 ! Spring Data 2.0 ! A reactive (asynchronous, ideally non-blocking) driver ! Optional: Spring Boot 2.0 !130 Requirements for Reactive Spring Data
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Reactive Template API ! Reactive Repository support ! Reduced feature set !131 Reactive Spring Data
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! MongoDB ! Apache Cassandra ! Redis ! Couchbase !132 Reactive Spring Data modules
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! JDBC is a blocking API ! JPA is a blocking API ! Sorry, no reactive JPA support so far ! …but !133 What about JPA
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Not a priority but feasible • Neo4j • Solr • ElasticSearch !135 Future reactive Spring Data modules
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Non-blocking I/O ! Threading-infrastructure ! Back pressure ! Integration with reactive libraries !136 Why reactive drivers?
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model !137 Data store App Data store Data store Data store App
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !138 Imperative Template API <T> T insert(T objectToSave) void insertAll(Collection<…> objects)
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !139 Reactive Template API <T> Mono<T> insert(T objectToSave) <T> Mono<T> insert(Mono<T> objectToSave)
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Blocking driver ! Reactive driver ! Requires both drivers and two connections ! Collection operations (CRUD, Geo-commands) ! Aggregation streaming ! No GridFS, MapReduce, Grouping support in Spring Data !145 Reactive MongoDB
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Asynchronous driver (adoption layer) ! Feature parity ! Optional: Asynchronous Template API with ListenableFuture !146 Reactive Apache Cassandra
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Reactive driver (used for blocking operations as well) ! Reactive Template API ! Planned: Reactive Pub/Sub ! No Reactive Repository support !147 Reactive Redis
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Reactive driver (used for blocking operations as well) ! Reactive Template API ! Reactive Repository support !148 Reactive Couchbase
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Change your mindset ! Non-blocking • I/O • Computation ! Consider if reactive is benefit or burden !150 What does it take to go reactive?
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Carefully consider whether it makes sense ! Functional-reactive programming is a good answer for a certain class of problems ! Can improve code ! Can clutter code !151 Existing applications
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Get familiar with the vocabulary • Asynchronous • non-blocking • back pressure • reactive • reactive extensions • streams operators !152 Reactive language
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Don’t implment Reactive Streams interfaces yourself • Unless you’re trying the RS TCK to pass ! Reactive Streams is just the contract • Use a reactive composition library ! Nothing happens until subscription !153 Reactive Streams
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Carefully select your tools • API • Drivers ! Tooling is important ! Define code styles ! Learn reading the stack trace !154 Reactive composition library
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !155 … at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:926) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:644) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:579) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:496) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:458) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory at java.lang.Thread.run(Thread.java:745)
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ !156 java.lang.NullPointerException: The mapper returned a null value. at java.util.Objects.requireNonNull(Objects.java:228) at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:37 at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:37 at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:76) at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:37 at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java: at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:37 at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:37 at reactor.core.publisher.FluxFlatMap$FlatMapMain.innerNext(FluxFlatMap.java:778)
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Zeit für Fragen Mark Paluch • @mp911de
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Resources ! Code - Repository @ Github ! Reactor Rx Lite API – Repository @ Github ! Spring Data Examples – Repository @ Github ! Spring projects release calendar – Google Calendar !160 @mp911de
Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Execution Model !162 Request Data access Reactive remote data service That’s not the data you’re looking for Remote data service Stream Demand Dispatcher