Slide 1

Slide 1 text

Unless otherwise indicated, these slides are © 2013-2014 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring JAX 2017 Mark Paluch, Pivotal Software, Inc. @mp911de

Slide 2

Slide 2 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 3

Slide 3 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ What is Reactive Programming?

Slide 4

Slide 4 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Imperative ! Reactive ! Synchronous ! Blocking ! Non-Blocking ! Asynchronous ! Actors 4 Programming models

Slide 5

Slide 5 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 Understanding imperative HttpClient c = …; HttpGet get = new HttpGet("https://google.com"); HttpResponse response = c.execute(get);

Slide 6

Slide 6 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 6 Understanding imperative EntityManager entityManager = …; List users = … entityManager.getTransaction().begin(); for (User user : users) { entityManager.persist(user); } entityManager.getTransaction().commit();

Slide 7

Slide 7 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 7 Understanding imperative public void saveUsers() { EntityManager entityManager = …; List users = … entityManager.getTransaction().begin(); for (User user : users) { entityManager.persist(user); } entityManager.getTransaction().commit(); }

Slide 8

Slide 8 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 8 Understanding imperative HttpClient c = …; for (int i = 0; i < 10; i++) { HttpGet get = new HttpGet("https://google.com"); HttpResponse response = c.execute(get); // … }

Slide 9

Slide 9 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Remote calls with latency 9 Request Data access Remote data service

Slide 10

Slide 10 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Remote calls with latency 9 Request Data access Remote data service

Slide 11

Slide 11 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Remote calls with latency 9 Request Data access Remote data service I/O Wait

Slide 12

Slide 12 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Remote calls with latency 9 Request Data access Remote data service I/O Wait

Slide 13

Slide 13 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Remote calls with latency 9 Request Data access Remote data service I/O Wait This one is waiting

Slide 14

Slide 14 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Remote calls with latency 9 Request Data access Remote data service I/O Wait This one is waiting

Slide 15

Slide 15 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 10 Imperative programming

Slide 16

Slide 16 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 11 Imperative: Web applications

Slide 17

Slide 17 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 12 What is reactive?

Slide 18

Slide 18 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Synchronous fetch model 13

Slide 19

Slide 19 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 20

Slide 20 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Serve slow clients 14 Server

Slide 21

Slide 21 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 22

Slide 22 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Use Case: Push message to client 16 Server Message Broker

Slide 23

Slide 23 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 17 Other use cases

Slide 24

Slide 24 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 18 Asynchronous

Slide 25

Slide 25 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 19 Asynchronous

Slide 26

Slide 26 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 20 Asynchronous: Requirements

Slide 27

Slide 27 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Asynchronous: Future 21 AsyncRestTemplate asyncRestTemplate = … AsyncCassandraTemplate asyncCassandra = … SettableListenableFuture future = new SettableListenableFuture<>(); asyncRestTemplate.getForEntity("https://slow-service.com", String.class) .addCallback(response -> { Page page = new Page(); page.setId(…); page.setContent(response.getBody()); ListenableFuture insertFuture = asyncCassandra.insert(page); insertFuture.addCallback(savedPage -> future.set("OK"), failure -> future.setException(failure)); }, failure -> failure -> future.setException(failure)); return future;

Slide 28

Slide 28 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Asynchronous: Future 22 AsyncRestTemplate asyncRestTemplate = … AsyncCassandraTemplate asyncCassandra = … SettableListenableFuture future = new SettableListenableFuture<>(); asyncRestTemplate.getForEntity("https://slow-service.com", String.class) .addCallback(response -> { Page page = new Page(); page.setId(…); page.setContent(response.getBody()); ListenableFuture insertFuture = asyncCassandra.insert(page); insertFuture.addCallback(savedPage -> future.set("OK"), failure -> future.setException(failure)); }, failure -> failure -> future.setException(failure)); return future;

Slide 29

Slide 29 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Asynchronous: Future 23 AsyncRestTemplate asyncRestTemplate = … AsyncCassandraTemplate asyncCassandra = … SettableListenableFuture future = new SettableListenableFuture<>(); asyncRestTemplate.getForEntity("https://slow-service.com", String.class) .addCallback(response -> { Page page = new Page(); page.setId(…); page.setContent(response.getBody()); ListenableFuture insertFuture = asyncCassandra.insert(page); insertFuture.addCallback(savedPage -> future.set("OK"), failure -> future.setException(failure)); }, failure -> failure -> future.setException(failure)); return future;

Slide 30

Slide 30 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Asynchronous: Future 24 AsyncRestTemplate asyncRestTemplate = … AsyncCassandraTemplate asyncCassandra = … SettableListenableFuture future = new SettableListenableFuture<>(); asyncRestTemplate.getForEntity("https://slow-service.com", String.class) .addCallback(response -> { Page page = new Page(); page.setId(…); page.setContent(response.getBody()); ListenableFuture insertFuture = asyncCassandra.insert(page); insertFuture.addCallback(savedPage -> future.set("OK"), failure -> future.setException(failure)); }, failure -> failure -> future.setException(failure)); return future;

Slide 31

Slide 31 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 25

Slide 32

Slide 32 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 26 Using Java types Non- Blocking Streaming Pattern Future x Pull CompletableFuture x Push Stream x Pull Iterator x Pull Input/OutputStream x Pull

Slide 33

Slide 33 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 27 Asynchronous: CompletableFuture

Slide 34

Slide 34 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Asynchronous: CompletableFuture example 28 CompletableFuture> future = … future.thenCompose(response -> { Page page = new Page(); page.setId(…); page.setContent(response.getBody()); return asyncCassandra.insert(page); }).thenApply(Page::getId);

Slide 35

Slide 35 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 29 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."); }

Slide 36

Slide 36 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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. 30

Slide 37

Slide 37 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Effects of an async fetch model 31 Request I/O

Slide 38

Slide 38 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Effects of an async fetch model 31 Request I/O

Slide 39

Slide 39 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Effects of an async fetch model 31 Request I/O

Slide 40

Slide 40 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Effects of an async fetch model 31 Request I/O

Slide 41

Slide 41 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Effects of an async fetch model 31 Request I/O Requires synchronization

Slide 42

Slide 42 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Effects of an async fetch model 31 Request I/O Requires synchronization Still waiting, eh?

Slide 43

Slide 43 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Effects of an async fetch model 31 Request I/O Requires synchronization Still waiting, eh?

Slide 44

Slide 44 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 32 Imperative programming

Slide 45

Slide 45 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ We need a different toolset! 33

Slide 46

Slide 46 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ We need a different toolset! 34

Slide 47

Slide 47 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 35 Reactive programming model

Slide 48

Slide 48 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 36 Reactive Streams

Slide 49

Slide 49 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Publisher and Subscriber 37 Subscriber Publisher Subscribe Data

Slide 50

Slide 50 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Publisher and Subscriber 37 Subscriber Publisher Subscribe Data

Slide 51

Slide 51 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Publisher and Subscriber 37 Subscriber Publisher Subscribe Data

Slide 52

Slide 52 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 38 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

Slide 53

Slide 53 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 39 Reactive libraries

Slide 54

Slide 54 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 40 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

Slide 55

Slide 55 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 41 Reactive APIs on the JVM: Generations Reactive API Generation Support RxJava 1 2nd Limited back pressure RxJava 2 4th Reactive Streams + operator fusion Akka Streams 2 3rd Reactive Streams + actor fusion Project Reactor 4th Reactive Streams + operator fusion

Slide 56

Slide 56 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 42 RxJava 2 or Project Reactor

Slide 57

Slide 57 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 43 Back pressure

Slide 58

Slide 58 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Request all the data ! Now 44 Asynchronous fetch model AsyncHttpClient c = …; for (int i = 0; i < 10; i++) { HttpGet get = new HttpGet("https://google.com"); Future response = c.execute(get); // … }

Slide 59

Slide 59 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Asynchronous fetch model 45

Slide 60

Slide 60 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Asynchronous fetch model 45 Remote App Remote Remote App can’t keep up (Back pressure)

Slide 61

Slide 61 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Asynchronous fetch model 45 Remote App Remote Remote App can’t keep up (Back pressure)

Slide 62

Slide 62 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Publisher and Subscriber 46 Subscriber Publisher Publish as fast as possible

Slide 63

Slide 63 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 47 Publisher

Slide 64

Slide 64 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 47 Publisher I/O thread push

Slide 65

Slide 65 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Back pressure control 48 Subscriber Publisher Demand

Slide 66

Slide 66 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 67

Slide 67 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 50

Slide 68

Slide 68 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 50 Data store App

Slide 69

Slide 69 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 50 Data store App Data store

Slide 70

Slide 70 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 50 Data store App Data store Data store

Slide 71

Slide 71 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 50 Data store App Data store Data store Data store App

Slide 72

Slide 72 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 50 Data store App Data store Data store Data store App

Slide 73

Slide 73 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Introduction to Project Reactor

Slide 74

Slide 74 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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? 52

Slide 75

Slide 75 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 53

Slide 76

Slide 76 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 54

Slide 77

Slide 77 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 55 List Iterator Future Future>

Slide 78

Slide 78 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 55 List Iterator Future Future> .get() for-each .hasNext()

Slide 79

Slide 79 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 55 List Iterator Future Future> .get() for-each .hasNext() Request thread pulls

Slide 80

Slide 80 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 56 Publisher

Slide 81

Slide 81 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 56 Publisher Thread pushes data

Slide 82

Slide 82 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 57 Iterable Iterator Publisher Subscriber

Slide 83

Slide 83 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 57 Iterable Iterator Publisher Subscriber vs.

Slide 84

Slide 84 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 58 Subscriber Publisher feedback push events produces consumes Relation between Publisher and Subscriber

Slide 85

Slide 85 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 59 Subscriber Publisher feedback push events produces consumes interfaces from Reactive Streams spec Relation between Publisher and Subscriber

Slide 86

Slide 86 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 60 Subscriber Publisher feedback 0..N elements + 0..1 (complete | error) produces consumes Signals

Slide 87

Slide 87 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 61 Subscriber Publisher push events produces consumes Demand (Back pressure control) Back pressure

Slide 88

Slide 88 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 62 Subscriber Publisher push events produces consumes can I have an API though?

Slide 89

Slide 89 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 90

Slide 90 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 64 Project Reactor 3

Slide 91

Slide 91 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 65 Project Reactor

Slide 92

Slide 92 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Duration ! CompletableFuture ! Stream 66 Focus on Java 8

Slide 93

Slide 93 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Project Reactor Types 67 Mono Flux

Slide 94

Slide 94 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Project Reactor Types 67 Mono Flux 0..1..Error 0..N..Error

Slide 95

Slide 95 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 68 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

Slide 96

Slide 96 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Explaining reactive operations 69 Transformed Completion signal Error signal Emitted element Time

Slide 97

Slide 97 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux 70 These are items emitted by the Flux. operator 1 2 3 4 5 6 1 2 3

Slide 98

Slide 98 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono 71 This is the eventual item emitted by the Mono. operator 1 1

Slide 99

Slide 99 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 72 Operators an Rx-inspired API with a vocabulary of operators similar to RxJava...

Slide 100

Slide 100 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 73 Operators an Rx-inspired API ...but not exactly the same

Slide 101

Slide 101 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 74 Flux/Mono generator operator operator operator nothing happens until you subscribe

Slide 102

Slide 102 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 75 Flux/Mono generator Subscriber operator operator operator nothing happens until you subscribe

Slide 103

Slide 103 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 104

Slide 104 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 105

Slide 105 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Reactor is agnostic ! Facilitates switching ! Schedulers 78 Threading (contexts)

Slide 106

Slide 106 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 79 Schedulers

Slide 107

Slide 107 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 80 Context switching

Slide 108

Slide 108 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 81 Flux/Mono generator operator subscribeOn operator publishOn operator operator Subscriber Sub Sub Sub Sub Sub Sub

Slide 109

Slide 109 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 82 Flux/Mono generator operator subscribe On operator publish On operator operator Subscriber Sub Sub Sub Sub Sub Sub

Slide 110

Slide 110 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 111

Slide 111 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 84 Flux/Mono generator operator subscribeOn operator publishOn operator operator Subscriber Sub Sub Sub Sub Sub Sub

Slide 112

Slide 112 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 113

Slide 113 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 114

Slide 114 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Operator time! map, filter, buffer 87

Slide 115

Slide 115 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 88 Flux.range Subscriber map filter buffer

Slide 116

Slide 116 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 89

Slide 117

Slide 117 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 90

Slide 118

Slide 118 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 91

Slide 119

Slide 119 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 92 Flux.range Subscriber map filter buffer

Slide 120

Slide 120 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 93 Flux.range Subscriber map filter buffer

Slide 121

Slide 121 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 122

Slide 122 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 123

Slide 123 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 124

Slide 124 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 125

Slide 125 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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

Slide 126

Slide 126 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 99 Flux.range(5, 3) .map(i -> i + 3) .filter(i -> i % 2 == 0) .buffer(3)

Slide 127

Slide 127 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 100 Flux.range(5, 3) .map(i -> i + 3) .filter(i -> i % 2 == 0) .buffer(3) 5, 6, 7 | 8, 9, 10 | 8, 10 | [8,10]|

Slide 128

Slide 128 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Operator time²! flatMap all the things 101

Slide 129

Slide 129 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 102 flatMap operator

Slide 130

Slide 130 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 103

Slide 131

Slide 131 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 104

Slide 132

Slide 132 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 105

Slide 133

Slide 133 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 106 flatMap(user -> tweetStream(user))

Slide 134

Slide 134 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 107 flatMap(user -> tweetStream(user))

Slide 135

Slide 135 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 108 flatMap(user -> tweetStream(user))

Slide 136

Slide 136 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 109 flatMap(user -> tweetStream(user))

Slide 137

Slide 137 text

Unless otherwise indicated, these slides are 
 © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Coding Time!

Slide 138

Slide 138 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring WebFlux

Slide 139

Slide 139 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 112 What is Reactive Spring

Slide 140

Slide 140 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Scaling 113

Slide 141

Slide 141 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Scaling 113

Slide 142

Slide 142 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Scaling 113

Slide 143

Slide 143 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 114 Reactive Spring portfolio

Slide 144

Slide 144 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 115 What is WebFlux?

Slide 145

Slide 145 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Project Reactor 3.0 ! Spring Framework 5.0 ! Optional: Spring Boot 2.0 116 Requirements

Slide 146

Slide 146 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 117

Slide 147

Slide 147 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 118 Y U no Servlet API?

Slide 148

Slide 148 text

Unless otherwise indicated, these slides are 
 © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Coding Time!

Slide 149

Slide 149 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 120 Spring Web MVC

Slide 150

Slide 150 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring Data

Slide 151

Slide 151 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 122 Request Data access Remote data service

Slide 152

Slide 152 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 122 Request Data access Remote data service

Slide 153

Slide 153 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 122 Request Data access Remote data service I/O Wait

Slide 154

Slide 154 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 122 Request Data access Remote data service I/O Wait

Slide 155

Slide 155 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 122 Request Data access Remote data service I/O Wait This one is waiting

Slide 156

Slide 156 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 122 Request Data access Remote data service I/O Wait This one is waiting

Slide 157

Slide 157 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 123 Request Data access Remote data service

Slide 158

Slide 158 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 123 Request Data access Remote data service Bulk fetch

Slide 159

Slide 159 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 123 Request Data access Remote data service Multiple calls Bulk fetch

Slide 160

Slide 160 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 123 Request Data access Remote data service Multiple calls Bulk fetch

Slide 161

Slide 161 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Accessing data today 123 Request Data access Remote data service Multiple calls Bulk fetch

Slide 162

Slide 162 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 124 Todays’ data access

Slide 163

Slide 163 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Project Reactor 3.0 ! Spring Framework 5.0 ! Spring Data 2.0 ! A reactive (asynchronous, ideally non-blocking) driver ! Optional: Spring Boot 2.0 125 Requirements for Reactive Spring Data

Slide 164

Slide 164 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! Project Reactor 3.0 ! Spring Framework 5.0 ! Spring Data 2.0 ! A reactive (asynchronous, ideally non-blocking) driver ! Optional: Spring Boot 2.0 125 Requirements for Reactive Spring Data

Slide 165

Slide 165 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 126 Reactive Spring Data

Slide 166

Slide 166 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ ! MongoDB ! Apache Cassandra ! Redis ! Couchbase 127 Reactive Spring Data modules

Slide 167

Slide 167 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 128 What about JPA

Slide 168

Slide 168 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 129 Future reactive Spring Data modules

Slide 169

Slide 169 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 130 Why reactive drivers?

Slide 170

Slide 170 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 131

Slide 171

Slide 171 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 131 Data store App

Slide 172

Slide 172 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 131 Data store App Data store

Slide 173

Slide 173 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 131 Data store App Data store Data store

Slide 174

Slide 174 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 131 Data store App Data store Data store Data store App

Slide 175

Slide 175 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive fetch model 131 Data store App Data store Data store Data store App

Slide 176

Slide 176 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 132 Imperative Template API T insert(T objectToSave) void insertAll(Collection<…> objects)

Slide 177

Slide 177 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 133 Reactive Template API Mono insert(T objectToSave) Mono insert(Mono objectToSave)

Slide 178

Slide 178 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 134 Reactive Repository API public interface ReactivePersonRepository extends ReactiveCrudRepository {
 
 Flux findByLastname(String lastname);
 
 @Query("{ 'firstname': ?0 }")
 Mono customQuery(String firstname); Flux findByLastname(Mono lastname); }

Slide 179

Slide 179 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 135 Reactive Repository API public interface ReactivePersonRepository extends ReactiveCrudRepository {
 
 Flux findByLastname(String lastname);
 
 @Query("{ 'firstname': ?0 }")
 Mono customQuery(String firstname); Flux findByLastname(Mono lastname); }

Slide 180

Slide 180 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 136 Reactive Repository API public interface ReactivePersonRepository extends ReactiveCrudRepository {
 
 Flux findByLastname(String lastname);
 
 @Query("{ 'firstname': ?0 }")
 Mono customQuery(String firstname); Flux findByLastname(Mono lastname); }

Slide 181

Slide 181 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 137 Reactive Repository API public interface ReactivePersonRepository extends ReactiveCrudRepository {
 
 Flux findByLastname(String lastname);
 
 @Query("{ 'firstname': ?0 }")
 Mono customQuery(String firstname); Flux findByLastname(Mono lastname); }

Slide 182

Slide 182 text

Unless otherwise indicated, these slides are 
 © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Coding Time!

Slide 183

Slide 183 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 139 Reactive MongoDB

Slide 184

Slide 184 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 140 Reactive Apache Cassandra

Slide 185

Slide 185 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 141 Reactive Redis

Slide 186

Slide 186 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 142 Reactive Couchbase

Slide 187

Slide 187 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Going Reactive

Slide 188

Slide 188 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 144 What does it take to go reactive?

Slide 189

Slide 189 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 145 Existing applications

Slide 190

Slide 190 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 146 Reactive language

Slide 191

Slide 191 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 147 Reactive Streams

Slide 192

Slide 192 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 148 Reactive composition library

Slide 193

Slide 193 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 149 … 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)

Slide 194

Slide 194 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 150 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)

Slide 195

Slide 195 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 151 Assembly trace from producer [reactor.core.publisher.MonoMapFuseable] : reactor.core.publisher.Mono.map(Mono.java:2126) org.springframework.data.redis.core.DefaultReactiveValueOperations.lambda$get$12(DefaultRea org.springframework.data.redis.core.DefaultReactiveValueOperations.lambda$createMono$23(Def org.springframework.data.redis.core.ReactiveRedisTemplate.doInConnection(ReactiveRedisTempl org.springframework.data.redis.core.ReactiveRedisTemplate.lambda$createMono$1(ReactiveRedis reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:45) reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44) reactor.core.publisher.Mono.block(Mono.java:1263) workshop.CachingController.getOrCreate(CachingController.java:44) org.springframework.web.reactive.result.method.InvocableHandlerMethod.doInvoke(InvocableHan org.springframework.web.reactive.result.method.InvocableHandlerMethod.lambda$invoke$0(Invoc

Slide 196

Slide 196 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 152 Error has been observed by the following operator(s): |_ Mono.map(DefaultReactiveValueOperations.java:157) |_ Flux.from(ReactiveRedisTemplate.java:296) |_ Flux.doOnSignal(ReactiveRedisTemplate.java:296) |_ Mono.from(ReactiveRedisTemplate.java:272) |_ Mono.defer(ReactiveRedisTemplate.java:272) |_ Mono.switchIfEmpty(CachingController.java:44) |_ Mono.error(InvocableHandlerMethod.java:127) |_ Mono.flatMap(InvocableHandlerMethod.java:116) |_ Mono.doOnSignal(RequestMappingHandlerAdapter.java:191) |_ Mono.error(RequestMappingHandlerAdapter.java:215) |_ Mono.onErrorResume(RequestMappingHandlerAdapter.java:192) |_ Mono.defer(RequestMappingHandlerAdapter.java:189) |_ Mono.then(RequestMappingHandlerAdapter.java:189) |_ Mono.flatMap(DispatcherHandler.java:129) |_ Mono.flatMap(DispatcherHandler.java:130) |_ Mono.error(ResponseStatusExceptionHandler.java:47) |_ Mono.onErrorResume(ExceptionHandlingWebHandler.java:67)

Slide 197

Slide 197 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Questions? Mark Paluch • @mp911de

Slide 198

Slide 198 text

Unless otherwise indicated, these slides are © 2013-2017 Pivotal Software, 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 154 @mp911de