Slide 1

Slide 1 text

Reactive Programming with RxJava Catalog Tribe in Shanghai [email protected] 2018.01.18 1

Slide 2

Slide 2 text

Agenda • Why Reactive Programming? • RxJava Observable • RxJava Operators • RxJava Schedulers • References 2

Slide 3

Slide 3 text

Why Reactive

Slide 4

Slide 4 text

High available system Service Infinite streams Many slow connections Depends A Depends B Slow remote services

Slide 5

Slide 5 text

Blocking vs Non-Blocking

Slide 6

Slide 6 text

ReactiveX • Started by Microsoft Rx Lib (Reactive Extensions) • For composing asynchronous and event-based programs by using observable sequences • Easy way to implement complicated non-blocking system • Easy to combine multiple data source responses • Resiliency / Fault tolerance / Deal heavy load • Why Reactive

Slide 7

Slide 7 text

Reactive Streams Publisher Subscriber

Slide 8

Slide 8 text

Reactive Streams Publisher Subscriber

Slide 9

Slide 9 text

Reactive Streams Publisher Subscriber Subscribe then request data (Backpressure)

Slide 10

Slide 10 text

Reactive Streams Publisher Subscriber Subscribe then request data (Backpressure)

Slide 11

Slide 11 text

Reactive Streams Publisher Subscriber Subscribe then request data (Backpressure)

Slide 12

Slide 12 text

Reactive Streams Publisher Subscriber Subscribe then request data (Backpressure) 0..N Data published then 0..1 (Error or Completed)

Slide 13

Slide 13 text

Reactive Streams Publisher Subscriber Subscribe then request data (Backpressure) 0..N Data published then 0..1 (Error or Completed) Example : Using Message Queue 1. Polling message queue for new message (traditional Kafka client) 2. Listener or callback for new message (spring-kafka use listener) 3. Reactive stream (kakfa streams) is reactive streams

Slide 14

Slide 14 text

Observable RxJava

Slide 15

Slide 15 text

Iterable vs Observable Event Iterable (pull) Observable (push) Receive data T next() onNext(T) Discover error Throw Exception onError(Exception) Complete !hasNext() onCompleted()

Slide 16

Slide 16 text

Use Observable getDataFromLocalMemory() .skip(10) .take(5) .map { s -> s + " transformed" } .forEach { println(“next => " + it) } Iterable Observable getDataFromNetwork() .skip(10) .take(5) .map { s -> s + " transformed" } .subscribe { println(“next => " + it) }

Slide 17

Slide 17 text

Why Use Observable • Observables are composable • Observables are Flexible • Observables are less opinionated • Various implementation (thread-pool, event loops, non- blocking I/O) • Callback is hard to implement and maintain • Not only for UI, Useful for Distributed System

Slide 18

Slide 18 text

Structure of Observable

Slide 19

Slide 19 text

Cold vs Hot Observable • Cold Observable • Like VOD (Video on demand) (Finite stream) • At time to subscribe, you can receive first data • Other subscribe, receive first data also • Hot Observable • Like TV or Radio (Infinite Stream) • At time to subscribe, you can receive published data at that time

Slide 20

Slide 20 text

Other Objects • Flowable (RxJava2) • Observable with back pressure • Single • onSuccess/onFailure • Completable • onCompleted with no returns • Maybe (RxJava2) • Single + Completable

Slide 21

Slide 21 text

Subject • Observable + Observer • Varieties of Subject • AsyncSubject - take last elements • BehaviorSubject - like hot observable + latest element • PublishSubject - like hot observable • ReplaySubject - cold observable

Slide 22

Slide 22 text

Operators RxJava

Slide 23

Slide 23 text

Operators example

Slide 24

Slide 24 text

Operators example fun fetchWeather(city:String):Single

Slide 25

Slide 25 text

Operators example fun fetchWeather(city:String):Single

Slide 26

Slide 26 text

Operators example fun fetchWeather(city:String):Single

Slide 27

Slide 27 text

Operators example

Slide 28

Slide 28 text

Operators example

Slide 29

Slide 29 text

Operators example

Slide 30

Slide 30 text

Operators example

Slide 31

Slide 31 text

Operators example Times out and emits an error after 2 sec

Slide 32

Slide 32 text

Operators example Times out and emits an error after 2 sec

Slide 33

Slide 33 text

Operators example

Slide 34

Slide 34 text

Operators example

Slide 35

Slide 35 text

Operators example Logs a message in case of error

Slide 36

Slide 36 text

Operators example Logs a message in case of error

Slide 37

Slide 37 text

Operators example

Slide 38

Slide 38 text

Operators example

Slide 39

Slide 39 text

Operators example Switches to a different service in case of error

Slide 40

Slide 40 text

Operators example Switches to a different service in case of error

Slide 41

Slide 41 text

Operators example

Slide 42

Slide 42 text

Operators example

Slide 43

Slide 43 text

Operators example Transform a weather instance into a string message

Slide 44

Slide 44 text

Operators example Transform a weather instance into a string message

Slide 45

Slide 45 text

Operators example

Slide 46

Slide 46 text

Operators example

Slide 47

Slide 47 text

Operators example Triggers the processing of the chain

Slide 48

Slide 48 text

Marble Diagram - zip

Slide 49

Slide 49 text

Marble Diagram - zip UpStream

Slide 50

Slide 50 text

Marble Diagram - zip UpStream Operator

Slide 51

Slide 51 text

Marble Diagram - zip UpStream DownStream Operator

Slide 52

Slide 52 text

Marble Diagram - flatMap

Slide 53

Slide 53 text

Marble Diagram - retry

Slide 54

Slide 54 text

Reactive Server Observer Observer Streaming API REST API

Slide 55

Slide 55 text

Reactive Server Observer Observer Streaming API REST API

Slide 56

Slide 56 text

Reactive Server Observer Observer Streaming API REST API

Slide 57

Slide 57 text

Reactive Server Observer Observer Streaming API REST API

Slide 58

Slide 58 text

Reactive Server Observer Observer Streaming API REST API

Slide 59

Slide 59 text

Reactive Server Observer Observer Streaming API REST API Observable.zip(tweets, issues)

Slide 60

Slide 60 text

Reactive Server Observer Observer Streaming API REST API Observable.zip(tweets, issues)

Slide 61

Slide 61 text

RxJava Operators • Factory operators • create, defer, from, interval, just, range, repeat … • Transform • buffer, flatMap, groupBy, map, scan, window • Filtering • debounce, distinct, elementAt, filter, first, ignoreElements, last, sample, skip, skipLast, take, takeLast • Combine • and, then, when, combineLatest, join, merge, startWith, switch, zip

Slide 62

Slide 62 text

RxJava Operators • Error handling (catch, retry) • Utility • delay, do, materialize/dematerialize, observeOn, serialize, subscribe, subscribeOn, timeInterval, timeout, timestamp, using • Conditional • all, amb, contains, defaultIfEmpty, sequenceEqual, skipUntil, skipWhile, takeUntil, takeWhile • Math/Aggregator • average, concat, count, max, min, reduce, sum

Slide 63

Slide 63 text

RxJava Operators • ConnectableObservable operators • connect, publish, refcount, replay • Convert • to • Backpressure • onBackPressureBuffer, onBackpressureDrop, onBackpressureLatest

Slide 64

Slide 64 text

Schedulers RxJava

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

Schedulers • Observable is single thread in default • Scheduling emit data - subscribeOn(scheduler) • Scheduling subscribe data - observeOn(scheduler) • Type of schedulers • computation, io, newThread, single, trampoline, from … • TestScheduler for simulate Observable timely emit

Slide 67

Slide 67 text

Migration strategy - Strangler pattern

Slide 68

Slide 68 text

References • Books • Reactive Programming with RxJava • Articles • Why Reactive • Advanced Reactive Java • RxJava Part1, Part 2, Part 3 • Testing RxJava, RxJava2

Slide 69

Slide 69 text

Thank you!