Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

Introduction to Reactive Streams and Reactor 2.5

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Próximo SlideShare
Intro to Reactor
Intro to Reactor
Cargando en…3
×

Eche un vistazo a continuación

1 de 40 Anuncio
Anuncio

Más Contenido Relacionado

Presentaciones para usted (20)

Anuncio

Similares a Introduction to Reactive Streams and Reactor 2.5 (20)

Anuncio

Más reciente (20)

Introduction to Reactive Streams and Reactor 2.5

  1. 1. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ (Rx + Reactive Streams + Spring) % Java 8 = Reactor 2.5 Stéphane Maldini @smaldlini
  2. 2. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Stéphane Maldini • Survive in London • Reactive Engineering @ • Project Reactor lead • Reactive Streams & 
 Reactive Streams Commons contributor • Works on Spring Framework 5
 upcoming Reactive support • @smaldini on Twitter 2 +
  3. 3. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Do you need to be “reactive” ? If you ask then you probably don’t. 3
  4. 4. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ How much faster is it ? It’s slower than your usual imperative system. 4
  5. 5. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 5 Is it good at anything beyond pretending ? Yes. It scales with the request volume.
  6. 6. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 6 But remember it changes the way you think code. 
 It’s definitely a michelin star lunch.
  7. 7. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Swipe Right - it’s a match • Mobile/IoT backend API • Server-to-Server communications (HTTP…) • Unreliable clients • Big Data • Mutualized Resources (Cloud…) • User Interfaces 7
  8. 8. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive, what the sh*t? 8 More details on http://fr.slideshare.net/StphaneMaldini/intro-to-reactive-programming-52821416 • Reactive is used to broadly define event-driven systems • Reactive Manifesto defines qualities of reactive systems • Reactive programming: moving imperative logic to async, non- blocking, functional-style code, in particular when interacting with “time consuming” resources
  9. 9. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ For reactive programming, we need tools : ☐ Reactive Streams ☐ Reactive APIs 9
  10. 10. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams • Reactive Streams is a protocol for asynchronous stream processing with non-blocking backpressure • De facto standard for interop between reactive libraries • To be included in Java 9 as java.util.concurrent.Flow 10
  11. 11. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams principle 11 Publisher SubscriberData Demand • Max(InflightData) <= demand • No data sent without demand • Demand can be unbounded
  12. 12. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams is 3+1 interfaces (+ a TCK) 1215 onSubscribe onNext* (onError|onComplete)? Publisher Subscriber Subscription request(n) cancel()
  13. 13. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Streams offers Quality of Service for the JVM Bounded hardware use and flow prioritization 13
  14. 14. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Imperative vs Reactive Streams ? 14 User rickSanchez = userRepository.findUser(“rick”); Blocking, not returning until done ! Might throw exceptions
  15. 15. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ If this blocks, and runs on a serving HTTP request ? If the calling HTTP requests come from another “Microservice” ? If that Microservice is also calling in a blocking way ? If you solve scalability issues by scaling out ? If you agreed to pay the scalability tax, how far can it help you ? Thinking about the big picture 15
  16. 16. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Imperative vs Reactive Streams ? 16 Publisher<User> rickSanchez = userRepository.findUser(“rick”); rickSanchez.subscribe(new Subscriber<User>(){ … }); Might send 0, 1 or N Users ! Non Blocking - on demand data emission Callback for start, result, error or complete
  17. 17. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ How practical is Publisher ? 17
  18. 18. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Do you want to implement Publisher yourself ? Probably not, usually. 18
  19. 19. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ For reactive programming, we need tools : ☑ Reactive Streams ☐ Reactive APIs 19
  20. 20. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ • Transform, Combine, Timebox, Aggregate, Consume… • On the JVM: • Reactor 2.5 is 4th generation* and based on Reactive Streams • RxJava 1.x: 2nd generation* and most used implementation • Akka Stream 2.x: Lightbend 3rd generation* Reactive API • Also for other languages, for example RxJS, MostJS Reactive APIs 20 * Based on http://akarnokd.blogspot.fr/2016/03/operator-fusion-part-1.html
  21. 21. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor 2.5 ecosystem 21
  22. 22. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Core 2.5 • Cross collaboration with Dávid Karnok (RxJava) and some Spring Framework committers • Natively based on Reactive Streams, RSC* and Java 8+ • 2 new rich Publisher types : Flux & Mono • Strong focus on efficiency • Ever-improving debugging, logging, testing capabilities * ReactiveStreamsCommons is a research effort about reactive flows 22
  23. 23. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux (0..N elements) with ReactiveX compliant API 23
  24. 24. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono (0..1 element) 24
  25. 25. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Imperative vs Reactor ? 25 Mono<User> rickSanchez = userRepository.findUser(“rick”); rickSanchez.consume(this::userHandler, this::errorHandler) Single Typed Publisher ! Start the Mono and consume its result or error.
  26. 26. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Mono, a single-data-at-most API 26
  27. 27. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Flux, classic Rx patterns for 0..N events 27
  28. 28. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Visual (Marble) doc for Flux & Mono 28
  29. 29. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactor Web Console (preview) 29
  30. 30. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Concurrency Types Cheat Sheet 30 No value Single value Multiple values Blocking void T
 Future<T> Iterable<T> Collection<T> Stream<T> Non- blocking CompletableFuture<Void> CompletableFuture<T> CompletableFuture<List<T>> Reactive
 Streams Publisher<Void> Publisher<T> Publisher<T> RxJava Observable<Void> Completable (1.1.1) Observable<T> Single<T> (1.0.13) Observable<T> Reactor Mono<Void> Mono<T> Flux<T>
  31. 31. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ https://spring.io/blog/2016/04/19/understanding-reactive-types 31
  32. 32. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring 32 • Spring projects are going reactive • Reactor Core is the reactive foundation • RxJava support provided out of the box • You will be able to choose your web engine:
 Tomcat, Jetty, Undertow or Netty • Most impact on Web and Data support (IO intensive) • Spring Reactive experiment • Spring Reactive Playground sample application
  33. 33. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Well known Controller example 33 @RestController public class UserController { private BlockingRepository<User> repository; @RequestMapping(path = "/save-capitalized", method = RequestMethod.POST) public void saveCapitalized(@RequestBody List<User> users) { users.forEach(u -> u.setName(u.getName().toUpperCase())); repository.save(users); } } public interface BlockingRepository<T> { void save(List<T> elements); Iterable<T> findAll(); }
  34. 34. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Controller with Reactive types 34 @RestController public class UserController { private ReactiveRepository<User> repository; @RequestMapping(path = "/save-capitalized", method = RequestMethod.POST) public Mono<Void> saveCapitalized(@RequestBody Flux<User> users) { return repository.save(users.map(u -> new User(u.getName().toUpperCase())); } } public interface ReactiveRepository<T> { Mono<Void> save(Publisher<T> elements); Flux<T> findAll(); }
  35. 35. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Blocking vs Reactive: memory consumption 35 Memoryconsumption Time Blocking Reactive
  36. 36. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Blocking vs Reactive: streaming updates 36 Numberofuserssaved inthedatabase Time Blocking Reactive
  37. 37. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Controller with Reactive return values 37 @RestController public class UserController { private ReactiveRepository<User> repository; @RequestMapping(path = "/", method = RequestMethod.GET) public Flux<User> findAll() { return repository.findAll(); } } • Optimized serialization when using Flux instead of List • Also perfectly suitable for Server-Sent Events
  38. 38. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive HTTP client with Mono 38 import static org.springframework.web.client.reactive.HttpRequestBuilders.*; import static org.springframework.web.client.reactive.WebResponseExtractors.*; Mono<Person> result = webClient .perform(get("http://localhost:8080/person") .header("X-Test-Header", "testvalue") .accept(MediaType.APPLICATION_JSON)) .extract(body(Person.class));
  39. 39. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive HTTP client with Flux 39 import static org.springframework.web.client.reactive.HttpRequestBuilders.*; import static org.springframework.web.client.reactive.WebResponseExtractors.*; Flux<Person> response = webClient .perform(get("http://localhost:8080/persons") .accept(MediaType.APPLICATION_JSON)) .extract(bodyStream(Person.class)); Works for: • JSON array [{"foo":"bar"},{"foo":"baz"}] • JSON Streaming {"foo":"bar"}{"foo":"baz"} • SSE with something like .extract(sseStream(Person.class))
  40. 40. Unless otherwise indicated, these slides are © 2013-2015 Pivotal Software, Inc. and licensed under a
 Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Do you want to learn and play at the same time ? Get Factorio on Steam for a few coins 40

×