$30 off During Our Annual Pro Sale. View Details »

Reactive Spring Workshop @Javaland

Reactive Spring Workshop @Javaland

Slides introducing reactive programming with Spring and Reactor at the Javaland "Reactive Spring" workshop, given March 2017.

Simon Baslé

March 28, 2017
Tweet

More Decks by Simon Baslé

Other Decks in Programming

Transcript

  1. Reactive Spring Workshop

    View Slide

  2. Reactive Programming 101
    what does it bring to the table?

    View Slide

  3. WHY?

    View Slide

  4. WHY?
    because blocking is evil

    View Slide

  5. sync/blocking
    main thread processing
    resumes
    I/O
    ! app does
    nothing

    View Slide

  6. sync/blocking
    main thread processing
    resumes
    I/O
    BAD
    ! app does
    nothing

    View Slide

  7. async & blocking
    main thread wait &
    join
    ! new
    threads,
    costly
    ! complex

    View Slide

  8. async & blocking
    main thread wait &
    join
    ! new
    threads,
    costly
    ! complex
    BAD

    View Slide

  9. async & nonblocking
    “event loop”
    in non-blocking
    processin
    g
    chunks
    no more threads
    than needed

    View Slide

  10. how do you achieve that
    without losing your mind ?

    View Slide

  11. Reactive Programming

    View Slide

  12. Composing asynchronous
    & event-based sequences,
    using non-blocking operators


    View Slide

  13. without sacrifice

    View Slide

  14. without sacrifice
    Callbacks ?
    Futures ?
    easy to block
    hard to compose
    callback hell !
    not readable

    View Slide

  15. Pull? Push!

    View Slide

  16. Pull? Push!

    View Slide

  17. vs
    Iterable
    -
    Iterator
    Publisher
    -
    Subscriber

    View Slide

  18. Data in Flux

    View Slide

  19. Publisher Subscriber
    push events
    produces consumes
    feedback

    View Slide

  20. interfaces from
    Reactive Streams spec
    Publisher Subscriber
    feedback
    consumes
    push events
    produces

    View Slide

  21. Publisher Subscriber
    push events
    produces consumes
    feedback
    Subscriber
    onNext(T)
    onComplete();
    onError(Throwable);

    View Slide

  22. Publisher Subscriber
    produces consumes
    feedback
    0..N elements
    +
    0..1 (complete | error)

    View Slide

  23. Publisher Subscriber
    push events
    produces consumes
    feedback
    backpressure

    View Slide

  24. Publisher Subscriber
    push events
    produces consumes
    feedback
    can I have an
    API though?

    View Slide

  25. Publisher Subscriber
    push events
    produces consumes
    feedback

    View Slide

  26. Reactor 3
    types and operators

    View Slide

  27. Flux
    for 0..N elements

    View Slide

  28. View Slide

  29. Mono
    for at most 1 element

    View Slide

  30. View Slide

  31. Reactive Streams
    all the way

    View Slide

  32. focus on Java 8

    View Slide

  33. focus on Java 8
    Duration, CompletableFuture, Streams

    View Slide

  34. an Rx-inspired API
    with a vocabulary of operators similar to RxJava...

    View Slide

  35. an Rx-inspired API
    ...but not exactly the same

    View Slide

  36. Flux/Mono
    generator
    operator
    operator
    operator
    nothing happens
    until you subscribe

    View Slide

  37. Flux/Mono
    generator
    Subscriber
    operator
    operator
    operator
    nothing happens
    until you subscribe

    View Slide

  38. Flux/Mono
    generator
    Subscriber
    operator
    operator
    operator
    per Subscription
    state
    Sub
    Sub
    Sub

    View Slide

  39. Flux/Mono
    generator
    Subscriber
    operator
    operator
    operator
    data
    flows
    Sub
    Sub
    Sub

    View Slide

  40. “elements of functional programming”

    View Slide

  41. threading
    contexts

    View Slide

  42. Reactor is
    agnostic

    View Slide

  43. however it
    facilitates switching

    View Slide

  44. Schedulers

    View Slide

  45. Schedulers
    elastic, parallel, single, timer...

    View Slide

  46. publishOn
    switch rest of the flux on a thread

    View Slide

  47. subscribeOn
    make the subscription and request happen
    on a particular thread

    View Slide

  48. Flux/Mono
    generator
    operator
    subscribeOn
    operator
    publishOn
    operator
    operator
    Subscriber
    Sub
    Sub
    Sub
    Sub
    Sub
    Sub

    View Slide

  49. Flux/Mono
    generator
    operator
    subscribe
    On
    operator
    publish
    On
    operator
    operator
    Subscriber
    Sub
    Sub
    Sub
    Sub
    Sub
    Sub

    View Slide

  50. Flux/Mono
    generator
    operator
    subscribeOn
    operator
    publishOn
    operator
    operator
    Subscriber
    Sub
    Sub
    Sub
    Sub
    Sub
    Sub

    View Slide

  51. Flux/Mono
    generator
    operator
    subscribeOn
    operator
    publishOn
    operator
    operator
    Subscriber
    Sub
    Sub
    Sub
    Sub
    Sub
    Sub

    View Slide

  52. Flux/Mono
    generator
    operator
    subscribeOn
    operator
    publishOn
    operator
    operator
    Subscriber
    Sub
    Sub
    Sub
    Sub
    Sub
    Sub

    View Slide

  53. Flux/Mono
    generator
    operator
    subscribeOn
    operator
    publishOn
    operator
    operator
    Subscriber
    Sub
    Sub
    Sub
    Sub
    Sub
    Sub

    View Slide

  54. CODING
    TIME!

    View Slide

  55. View Slide

  56. Bonus Slides
    operator step-by-step examples, backpressure

    View Slide

  57. map, filter, buffer

    View Slide

  58. Flux.range
    Subscriber
    map
    filter
    buffer

    View Slide

  59. View Slide

  60. View Slide

  61. View Slide

  62. Flux.range(5, 3)
    .map(i -> i + 3)
    .filter(i -> i % 2 == 0)
    .buffer(3)

    View Slide

  63. Flux.range
    Subscriber
    map
    filter
    buffer

    View Slide

  64. Flux.range
    Subscriber
    map
    filter
    buffer

    View Slide

  65. Flux.range
    Subscriber
    map
    filter
    buffer

    View Slide

  66. Flux.range
    Subscriber
    map
    filter
    buffer

    View Slide

  67. Flux.range
    Subscriber
    map
    filter
    buffer

    View Slide

  68. Flux.range
    Subscriber
    map
    filter
    buffer

    View Slide

  69. Flux.range
    Subscriber
    map
    filter
    buffer

    View Slide

  70. 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]|

    View Slide

  71. retry

    View Slide

  72. Flux.from
    Subscriber
    map
    filter
    retry
    Publisher from
    HTTP reactive
    client

    View Slide

  73. View Slide

  74. Flux.from
    Subscriber
    map
    filter
    retry
    Publisher from
    HTTP reactive
    client

    View Slide

  75. Flux.from
    Subscriber
    map
    filter
    retry
    Publisher from
    HTTP reactive
    client
    resubscribe

    View Slide

  76. Trickier: flatMap
    async sub-processes

    View Slide

  77. View Slide

  78. flatMap(user -> tweetStream(user))

    View Slide

  79. flatMap(user -> tweetStream(user))

    View Slide

  80. flatMap(user -> tweetStream(user))

    View Slide

  81. flatMap(user -> tweetStream(user))

    View Slide

  82. View Slide

  83. & much
    more...

    View Slide

  84. backpressure
    the "volume control"

    View Slide

  85. Publisher Subscriber
    subscribe

    View Slide

  86. Publisher Subscriber
    push data as fast as possible

    View Slide

  87. Publisher Subscriber
    subscribe
    with small request
    (eg. 1)

    View Slide

  88. Publisher Subscriber
    1 onNext

    View Slide

  89. Publisher Subscriber
    request more
    (eg. 2)

    View Slide

  90. Publisher Subscriber
    2 onNext

    View Slide

  91. Publisher Subscriber
    backpressure

    View Slide

  92. other ways of dealing with backpressure
    eg. drop, buffer...

    View Slide

  93. Credits
    ! Robot Devil: copyright FOX
    ! Volume Knob: CC0 (via Pixabay)
    ! Camel Shape: CC0 (via Pixabay)
    ! Dromedary Shape: CC-By-SA USPN,Whidou (via Wikimedia)
    ! Thread Balls: CC0 (via Pixabay)
    ! Coding Time: derived from KEMUDA Computer Lab (CC-By-SA Andy.aug, via Wikimedia)
    ! Sound Table: CC0 (via Pexels)
    ! Dam: CC-By-SA Matthew Hatton (via geograph.org.uk)
    ! logos: Pivotal, Spring, Twitter and Github logo copyright their respective companies.

    View Slide