Reactive programming with Rxjava
-
Upload
christophe-marchal -
Category
Technology
-
view
621 -
download
0
Transcript of Reactive programming with Rxjava
![Page 1: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/1.jpg)
Christophe Marchal
Reactive programming with RxJava
![Page 2: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/2.jpg)
http://github.com/toff63
@toff63
http://francesbagual.net
About me
![Page 3: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/3.jpg)
MOTIVATION
![Page 4: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/4.jpg)
Scaling
Moore’s law is delivering more cores but not faster cores
![Page 5: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/5.jpg)
Amdahl’s law
Speedup limited by the sequential portion of the code
![Page 6: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/6.jpg)
In other words, parallelize your
code to scale
![Page 7: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/7.jpg)
I am not Netflix!
![Page 8: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/8.jpg)
http://techblog.netflix.com/2016/09/zuul-2-netflix-journey-to-asynchronous.html
Multithreaded System Architecture
![Page 9: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/9.jpg)
Efficient use of resources
● CPU efficient
● Memory efficient
● Hard Drive efficient
● Network efficient
![Page 10: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/10.jpg)
Efficient use of threads
![Page 11: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/11.jpg)
Non-Blocking architecture
![Page 12: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/12.jpg)
http://techblog.netflix.com/2016/09/zuul-2-netflix-journey-to-asynchronous.html
Asynchronous and Non-Blocking System Architecture
![Page 13: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/13.jpg)
Challenges
● listeners / callback● force functional code● exception handling● Everything becomes a
Stream
![Page 14: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/14.jpg)
RxJava for the win!
![Page 15: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/15.jpg)
Challenges
![Page 16: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/16.jpg)
Erik Meijer
Origins
![Page 17: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/17.jpg)
Reactive eXtension
![Page 18: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/18.jpg)
Collection Future
Current vision
![Page 19: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/19.jpg)
Observable: Stream of event
Reactive vision
Everything is an event
![Page 20: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/20.jpg)
Observable: Stream of event
Observer
Reactive vision
![Page 21: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/21.jpg)
Reactive vision
T getData()
One Item
synchronous
![Page 22: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/22.jpg)
Reactive vision
Iterable<T> getData()T getData()
One Item Several Items
synchronous
![Page 23: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/23.jpg)
Reactive vision
Iterable<T> getData()T getData()
Future<T> getData()
One Item Several Items
synchronous
Asynchronous
![Page 24: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/24.jpg)
Reactive vision
Iterable<T> getData()
Observable<T> getData()
T getData()
Future<T> getData()
One Item Several Items
synchronous
Asynchronous
![Page 25: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/25.jpg)
Pull vs Push
Iterable<T> getData() Observable<T> getData()
Pull
T next()throw Exception()
returns;
Push
onNext()onError()onComplete()
![Page 26: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/26.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/basic/Application.java
Simple collection
![Page 27: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/27.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/restclient/Application.java
Calling remote API
![Page 28: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/28.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/restclient/Application.java
Calling remote API
Observable from Future
![Page 29: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/29.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/restclient/Application.java
Calling remote API
Exception handling
![Page 30: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/30.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/restclient/Application.java
Calling remote API
Fallback
![Page 31: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/31.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/composition/Service.java
Composing Observable
![Page 32: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/32.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/composition/Application.java#L17
Composing Observable
![Page 33: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/33.jpg)
https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/flatMap.png
FlatMap
![Page 34: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/34.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/composition/Application.java#L34
Composing Observables
![Page 35: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/35.jpg)
https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/zip.png
Zip
![Page 36: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/36.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/composition/Application.java#L24
Composing Observables
![Page 37: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/37.jpg)
https://raw.github.com/wiki/ReactiveX/RxJava/images/rx-operators/merge.png
Merge
![Page 38: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/38.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/composition/SeriesHttpHandler.java#L22
RxNetty
![Page 39: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/39.jpg)
Demo
![Page 40: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/40.jpg)
Concurrency
![Page 41: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/41.jpg)
Observable is sequential
Scheduling and Combining Observables enable Concurrency
![Page 42: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/42.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/composition/SeriesHttpHandler.java
Adding concurrency
Scheduler
![Page 43: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/43.jpg)
Demo
![Page 44: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/44.jpg)
Cold Stream vs Hot Stream
Hot Stream Cold Stream
no control on emission rate emits when requested
UI events, Metric events,
System events
DB query, Service request,
Downloading file
![Page 45: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/45.jpg)
Cold Stream vs Hot Stream
Hot Stream Cold Stream
no control on emission rate emits when requested
UI events, Metric events,
System events
DB query, Service request,
Downloading file
Flow control Flow control & Back pressure
![Page 46: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/46.jpg)
Flow Control
![Page 47: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/47.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/flowcontrol/Backpressure.java
Backpressure needed
Synchronous on same thread
![Page 48: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/48.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/flowcontrol/Backpressure.java
No backpressure needed
Asynchronous (queuing)
![Page 49: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/49.jpg)
Block Operator
Hot Stream Cold Stream
![Page 50: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/50.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/flowcontrol/Backpressure.java
toBlocking
![Page 51: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/51.jpg)
Temporal Operators
Hot Stream
![Page 52: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/52.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/flowcontrol/Backpressure.java
Sample
9891040771910879031787798
![Page 53: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/53.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/flowcontrol/Backpressure.java
Throttle First
0118117118630717530662584575
![Page 54: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/54.jpg)
Debounce
![Page 55: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/55.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/flowcontrol/Backpressure.java
Debounce
52025
![Page 56: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/56.jpg)
Buffer
![Page 57: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/57.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/flowcontrol/Backpressure.java
Buffer
[0, 1, 2, 3, 4, 5][6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][21, 22, 23, 24, 25]
![Page 58: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/58.jpg)
Window time
![Page 59: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/59.jpg)
https://github.com/toff63/Sandbox/blob/master/java/rsjug-rx/rsjug-rx/src/main/java/rs/jug/rx/flowcontrol/Backpressure.java
28545333541675424446235
Window time
![Page 60: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/60.jpg)
Reactive Stream
![Page 61: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/61.jpg)
● Push when Consumer keeps up
● Pull when Consumer is slow
● Bound all queues
Maximize throughput
![Page 62: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/62.jpg)
Reactive Stream: Consumer keeps up
Publisher Subscriber
As many as you can
Push
![Page 63: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/63.jpg)
Reactive Stream: Consumer Starts buffering
Publisher Subscriber
As many as you can
![Page 64: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/64.jpg)
Reactive Stream: Consumer Starts buffering
Publisher Subscriber
Give me 0
Give me 2
Pull
![Page 65: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/65.jpg)
On backpressure buffer
![Page 66: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/66.jpg)
On backpressure buffer Hot Stream
Hot Stream
![Page 67: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/67.jpg)
On backpressure buffer
Scheduler
Hot Stream
![Page 68: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/68.jpg)
On backpressure Drop
![Page 69: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/69.jpg)
On backpressure buffer Hot Stream
![Page 70: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/70.jpg)
And lots and lots of other operators
![Page 71: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/71.jpg)
Rx Ports
![Page 72: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/72.jpg)
● Observable API is complex
● Takes time to become fluent with Observable
● Hard to test !
● Debugging is harder as everything is asynchronous
● Stacktraces can be truncated due to scheduler
Drawbacks
![Page 73: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/73.jpg)
Stacktrace example
18:42:59.487 [rx-request-processor-5-67] ERROR n.k.t.util.HttpContentInputStream - Error on serverio.netty.util.IllegalReferenceCountException: refCnt: 0 at io.netty.buffer.AbstractByteBuf.ensureAccessible(AbstractByteBuf.java:1178) ~[netty-buffer-4.0.27.Final.jar:4.0.27.Final] at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:848) ~[netty-buffer-4.0.27.Final.jar:4.0.27.Final] at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:841) ~[netty-buffer-4.0.27.Final.jar:4.0.27.Final] at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:831) ~[netty-buffer-4.0.27.Final.jar:4.0.27.Final] at netflix.karyon.transport.util.HttpContentInputStream$1.onNext(HttpContentInputStream.java:67) [karyon2-governator-2.3.0.jar:2.3.0] at netflix.karyon.transport.util.HttpContentInputStream$1.onNext(HttpContentInputStream.java:33) [karyon2-governator-2.3.0.jar:2.3.0] at rx.Observable$33.onNext(Observable.java:7480) [rxjava-1.0.10.jar:1.0.10] at rx.observers.SafeSubscriber.onNext(SafeSubscriber.java:130) [rxjava-1.0.10.jar:1.0.10] at io.reactivex.netty.protocol.http.UnicastContentSubject$AutoReleaseByteBufOperator$1.onNext(UnicastContentSubject.java:262) [rxnetty-0.4.9.jar:0.4.9] at rx.internal.operators.NotificationLite.accept(NotificationLite.java:150) [rxjava-1.0.10.jar:1.0.10] at rx.internal.operators.BufferUntilSubscriber.emit(BufferUntilSubscriber.java:151) [rxjava-1.0.10.jar:1.0.10] at rx.internal.operators.BufferUntilSubscriber.onNext(BufferUntilSubscriber.java:184) [rxjava-1.0.10.jar:1.0.10] at io.reactivex.netty.protocol.http.UnicastContentSubject.onNext(UnicastContentSubject.java:286) [rxnetty-0.4.9.jar:0.4.9] at io.reactivex.netty.protocol.http.server.ServerRequestResponseConverter.invokeContentOnNext(ServerRequestResponseConverter.java:193) [rxnetty-0.4.9.jar:0.4.9] at io.reactivex.netty.protocol.http.server.ServerRequestResponseConverter.channelRead(ServerRequestResponseConverter.java:129) [rxnetty-0.4.9.jar:0.4.9] at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:339) [netty-transport-4.0.27.Final.jar:4.0.27.Final] at io.netty.channel.AbstractChannelHandlerContext.access$600(AbstractChannelHandlerContext.java:32) [netty-transport-4.0.27.Final.jar:4.0.27.Final] at io.netty.channel.AbstractChannelHandlerContext$7.run(AbstractChannelHandlerContext.java:329) [netty-transport-4.0.27.Final.jar:4.0.27.Final] at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:36) [netty-common-4.0.27.Final.jar:4.0.27.Final] at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111) [netty-common-4.0.27.Final.jar:4.0.27.Final] at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137) [netty-common-4.0.27.Final.jar:4.0.27.Final] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_73]
![Page 74: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/74.jpg)
Netflix experience migrating zuul
http://techblog.netflix.com/2016/09/zuul-2-netflix-journey-to-asynchronous.html
![Page 75: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/75.jpg)
References
● https://www.infoq.com/presentations/rx-service-architecture
● https://www.infoq.com/presentations/rxjava-reactor● http://reactivex.io/tutorials.html● http://reactivex.io/documentation/operators.html
![Page 76: Reactive programming with Rxjava](https://reader030.fdocuments.us/reader030/viewer/2022021502/5872a11e1a28ab07208b5c07/html5/thumbnails/76.jpg)
Christophe Marchal
Thank you !
Questions?