SlideShare a Scribd company logo
1
Mateusz Gajewski
Solutions Architect @ Allegro
Kraków Office Opening • February 2015
allegrotech.io, twitter: @allegrotechblog
RxJava
Reactive eXtensions for JVM
But first, let me introduce myself…
2
Talk agenda
• Problem statement
• Reactive programming concept
• Brief history of reactive extensions (RX)
• RxJava API contract
• Functional operators
• Schedulers
• Subjects
• Dealing with back-pressure
3
Problem
4
Statement: asynchronous programming is hard and error-prone
but still extremely indispensable
Possible approaches
• Future<T>,
• Guava’s ListenableFuture<T> (JVM6+)
• CompletableFuture<T> (JVM8)
• RxJava (JVM6+)
5
*Future(s) are not enough
• Supporting single (scalar) values,
• Future<T>.get(period, TimeUnit) still blocks
threads,
• Composing is hard - leading to callback hell,
• Complex flows required some kind of FSM,
• Error handling is error-prone :)
6
https://github.com/ReactiveX/RxJava
“RxJava – Reactive Extensions for the JVM – a
library for composing asynchronous and
event-based programs using observable
sequences for the Java VM”
7
Buzzword alert: reactive!
8
Reactive manifesto v2
Reactive system has to be:
9
Responsive thus react to users demand
Resilient thus react to errors and failure
Elastic thus react to load
Message-driven thus react to events and messages
Ok, but what’s reactive
programming in this context?
10
Reactive programming
• Wikipedia says: “Data flows and propagation of
change”,
• I prefer: “programming with asynchronous
(in)finite data sequences”
• Basically pushing data instead of pulling it
11
Reactive extensions
• Implement reactive programming paradigm over
(in)finite sequences of data,
• Push data propagation:
• Observer pattern on steroids,
• Declarative (functional) API for composing
sequences,
• Non-opinionated about source of concurrency
(schedulers, virtual time)
12
.NET was there first
and everybody is into it now
13
.NET was there first
• Version 1.0 released 17.11.2009,
• Shipped with .NET 4.0 by default,
• Version 2.0 released 15.08.2012,
• With a support for “Portable Library” (.NET 4.5)
• Reactive Extensions for JS released 17.03.2010
14
RxJava 1.0.x
• Ported from .NET to JVM by Netflix,
• Stable API release in November 2014,
• After nearly two years of development,
• Targeting Java (and Android), Scala, Groovy,
JRuby, Kotlin and Clojure,
• Last version 1.0.5 released 3 days ago
15
Observable<T> vs Iterable<T> vs
Future<T>
16
Scalar value Sequence
Synchronous T Iterable<T>
Asynchronous* Future<T> Observable<T>
* Observable is single-threaded by default
Observable is an ordered (serial) data sequence
17
* this is so called marble diagram (source: https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava)
RxJava API contract
18
Core types
• Observer<T>
• Observable<T>
• OnSubscribe<T>
• Producer
• Subscriber<T>
• Subscription
• Operator<T, R>
• Scheduler
• Subject<T>
19
Observer<T> contract
• methods:
• onNext(T)
• onError(Throwable T)
• onCompleted()
• onError/onCompleted called exactly once
20
Observer<T> example
21
Functional operators
22
Observable<T> functional API
23
Operator class Source type Result type
Anamorphic
aka unfold
T Observable<T>
Bind
aka map
Observable<T1> Observable<T2>
Catamorphic
aka fold or reduce
Observable<T> T
http://en.wikipedia.org/wiki/Anamorphism, http://en.wikipedia.org/wiki/Catamorphism
Unfold operatorsaka “how to create observables”
24
Operator Description
Observable.just(T value) Wraps plain value(s) into Observable
Observable.range(int from, int to) Generates range sequence
Observable.timer() Generates time-based sequence
Observable.interval() Generates interval-based sequence
Observable.create(OnSubscribe<T>) Creates observable with delegate (most powerful)
Observable.never() Empty sequence that never completes either way
Observable.empty() Empty sequence that completes right away
Observable.error(Throwable t) Empty sequence that completes with error
OnSubscribe<T>
25
OnSubscribe<T> contract
• onNext() called from a single thread (synchronisation is not
provided)
• onCompleted() and onError() called exactly once,
• Subscriber.isUnsubscribed() is checked prior to sending any
notification
• setProducer() is used to support reactive-pull back-pressure
26
Producer
• Provided to support reactive pull back-pressure,
• Observer can request n elements from producer,
• If n == Long.MAX_VALUE back-pressure is disabled,
• Still hard to use and do it right :(
• But there is some work being done with FSM to
better support back-pressure implementation
27
Producer example
28
Subscriber<T>
• Basically both Observer<T> and Subscription,
• Used in Operator<T, R> for lifting Observables
into Observables,
• Maintains subscription list
29
Operator<T, R>
• Covers “bind” operator class for lifting Observables
• Can preserve state in a scope of chained calls,
• Should maintain subscriptions and unsubscribe requests,
• It’s hard to write it right (composite subscriptions, back-
pressure, cascading unsubscribe requests)
30
Operator<T, R>
31
Transformer<T, R>
32
What will be the result? ;)
Operators categories
map and fold
33
Category Examples
Combining join, startWith, merge, concat, zip…
Conditional
amb, skipUntil, skipWhile, takeUntil, takeWhile,
defaultIfEmpty…
Filtering
filter, first, last, takeLast, skip, elementAt, sample, throttle,
timeout, distinct, distinctUntilChange, ofType,
ignoreElements…
Aggregating concat, count, reduce, collect, toList, toMap, toSortedList…
Transformational map, flatMap, switchMap, scan, groupBy, buffer, window…
See more: http://reactivex.io/documentation/operators.html
Schedulers
34
Schedulers
• Source of concurrency for Observables:
• Observable can use them via observeOn/subscribeOn,
• Schedules unit of work through Workers,
• Workers represent serial execution of work.
• Provides different processing strategies (Event Loop, Thread
Pools, etc),
• Couple provided out-of-the-box plus you can write your own
35
Schedulers
36
Name Description
Schedulers.computation()
Schedules computation bound work
(ScheduledExecutorService with pool size = NCPU, LRU
worker select strategy)
Schedulers.immediate() Schedules work on current thread
Schedulers.io()
I/O bound work (ScheduledExecutorService with growing
thread pool)
Schedulers.trampoline() Queues work on the current thread
Schedulers.newThread() Creates new thread for every unit of work
Schedulers.test() Schedules work on scheduler supporting virtual time
Schedulers.from(Executor e) Schedules work to be executed on provided executor
(subscribe|observe)On
• Think of them this way:
• subscribeOn - invocation of the subscription,
• observeOn - observing of the notifications
• Thus:
• subscribeOn for background processing and
warm-up
37
(subscribe|observe)On
38
What will be the result? ;)
Subjects
39
Subjects
• Subject is a proxy between Observable<T> and
Subscriber<T>
• It can subscribe multiple observables
• And emit items as an observable
• Different Subject types has different properties
40
AsyncSubject
BehaviourSubject
PublishSubject
ReplaySubject
Back-pressure
45
Cold vs hot observables
• Passive sequence is cold:
• Producing notifications when requested
• At rate Observer desires
• Ideal for reactive pull model of back-pressure using Producer.request(n)
• Active sequence is hot:
• Producing notifications regardless of subscriptions:
• Immediately when it is created
• At rate Observer sometimes cannot handle,
• Ideal for flow control strategies like buffering, windowing, throttling,
onBackpressure*
46
Cold vs hot examples
47
Cold Hot
Asynchronous requests
(Observable.from)
UI events (mouse clicks,
movements)
Created with OnSubscribe<T> Timer events
Subscriptions to queues Push pub/sub (broadcasts)
Dealing with back-pressure
48
https://github.com/ReactiveX/RxJava/wiki/Backpressure
onBackpressure*
49
Design considerations
• Reactive Extensions are not a silver-bullet for dealing with concurrency:
• Threading/synchronization concerns does not go away,
• You can still block your threads (dead-lock),
• Simple flows on top of RX and static sequences yields significant overhead,
• Choosing right operators flow is a challenge,
• You should avoid shared-state if possible (immutability FTW),
• Debugging is quite hard (but there is “plugins” mechanism),
• Understanding and using back-pressure well is harder :)
50
More reading
• Free Rx.NET books:
• Introduction to RX: http://www.introtorx.com/
• RX Design Guidelines: http://go.microsoft.com/fwlink/?LinkID=205219
• Reactive Extensions: http://reactivex.io
• Interactive RX diagrams: http://rxmarbles.com
• Reactive programming @ Netflix: http://techblog.netflix.com/2013/01/
reactive-programming-at-netflix.html
51
Interesting RX-enabled projects
• https://github.com/Netflix/Hystrix
• https://github.com/jersey/jersey
• https://github.com/square/retrofit
• https://github.com/ReactiveX/RxNetty
• https://github.com/couchbase/couchbase-java-client
• https://github.com/Netflix/ocelli
• https://github.com/davidmoten/rtree
52
Thank you
53

More Related Content

What's hot (20)

PPT
Monitoring using Prometheus and Grafana
Arvind Kumar G.S
 
PPTX
Enterprise Integration Patterns
Sergey Podolsky
 
PDF
Apache Kafka Architecture & Fundamentals Explained
confluent
 
PDF
Grafana introduction
Rico Chen
 
PDF
Introduction to Spring WebFlux #jsug #sf_a1
Toshiaki Maki
 
PPTX
Django - Python MVC Framework
Bala Kumar
 
PDF
Django Introduction & Tutorial
之宇 趙
 
PPT
Core java slides
Abhilash Nair
 
PPTX
Exactly-Once Financial Data Processing at Scale with Flink and Pinot
Flink Forward
 
PDF
Cloud Monitoring tool Grafana
Dhrubaji Mandal ♛
 
PDF
CDC Stream Processing With Apache Flink With Timo Walther | Current 2022
HostedbyConfluent
 
PDF
Python projects
Zealous System
 
PPTX
Visual studio code
MVP Microsoft
 
PPTX
Monitoring With Prometheus
Agile Testing Alliance
 
PPTX
Prometheus and Grafana
Lhouceine OUHAMZA
 
PPTX
Java Constructor
MujtabaNawaz4
 
PDF
Spring MVC Framework
Hùng Nguyễn Huy
 
PPTX
ReactJS presentation.pptx
DivyanshGupta922023
 
PPTX
Grafana optimization for Prometheus
Mitsuhiro Tanda
 
Monitoring using Prometheus and Grafana
Arvind Kumar G.S
 
Enterprise Integration Patterns
Sergey Podolsky
 
Apache Kafka Architecture & Fundamentals Explained
confluent
 
Grafana introduction
Rico Chen
 
Introduction to Spring WebFlux #jsug #sf_a1
Toshiaki Maki
 
Django - Python MVC Framework
Bala Kumar
 
Django Introduction & Tutorial
之宇 趙
 
Core java slides
Abhilash Nair
 
Exactly-Once Financial Data Processing at Scale with Flink and Pinot
Flink Forward
 
Cloud Monitoring tool Grafana
Dhrubaji Mandal ♛
 
CDC Stream Processing With Apache Flink With Timo Walther | Current 2022
HostedbyConfluent
 
Python projects
Zealous System
 
Visual studio code
MVP Microsoft
 
Monitoring With Prometheus
Agile Testing Alliance
 
Prometheus and Grafana
Lhouceine OUHAMZA
 
Java Constructor
MujtabaNawaz4
 
Spring MVC Framework
Hùng Nguyễn Huy
 
ReactJS presentation.pptx
DivyanshGupta922023
 
Grafana optimization for Prometheus
Mitsuhiro Tanda
 

Similar to RxJava - introduction & design (20)

PDF
Reactive java - Reactive Programming + RxJava
NexThoughts Technologies
 
PDF
Streams, Streams Everywhere! An Introduction to Rx
Andrzej Sitek
 
PPTX
Reactive Programming in Java 8 with Rx-Java
Kasun Indrasiri
 
PPTX
Microservices Part 4: Functional Reactive Programming
Araf Karsh Hamid
 
PPTX
Intro to Functional Programming with RxJava
Mike Nakhimovich
 
PPTX
Introduction to RxJava on Android
Chris Arriola
 
PPTX
An Introduction to RxJava
Sanjay Acharya
 
PPTX
Functional reactive programming
Araf Karsh Hamid
 
PDF
Reactive Programming in Java by Mario Fusco - Codemotion Rome 2015
Codemotion
 
PDF
Reactive Programming for a demanding world: building event-driven and respons...
Mario Fusco
 
PDF
The Mayans Lost Guide to RxJava on Android
Fernando Cejas
 
PPTX
Reactive Programming on Android - RxAndroid - RxJava
Ali Muzaffar
 
PDF
Intro to Rx Java
Syed Awais Mazhar Bukhari
 
PDF
RxJava@DAUG
Maxim Volgin
 
PPTX
Reactive programming with rx java
CongTrung Vnit
 
PDF
Reactive Everywhere
trion development GmbH
 
PDF
RxJava pour Android : présentation lors du GDG Android Montréal
Sidereo
 
PPTX
RxJava 2 Reactive extensions for the JVM
Netesh Kumar
 
PPTX
Samuele Resca - REACTIVE PROGRAMMING, DAMN. IT IS NOT ABOUT REACTJS - Codemot...
Codemotion
 
PPTX
Mario Fusco - Reactive programming in Java - Codemotion Milan 2017
Codemotion
 
Reactive java - Reactive Programming + RxJava
NexThoughts Technologies
 
Streams, Streams Everywhere! An Introduction to Rx
Andrzej Sitek
 
Reactive Programming in Java 8 with Rx-Java
Kasun Indrasiri
 
Microservices Part 4: Functional Reactive Programming
Araf Karsh Hamid
 
Intro to Functional Programming with RxJava
Mike Nakhimovich
 
Introduction to RxJava on Android
Chris Arriola
 
An Introduction to RxJava
Sanjay Acharya
 
Functional reactive programming
Araf Karsh Hamid
 
Reactive Programming in Java by Mario Fusco - Codemotion Rome 2015
Codemotion
 
Reactive Programming for a demanding world: building event-driven and respons...
Mario Fusco
 
The Mayans Lost Guide to RxJava on Android
Fernando Cejas
 
Reactive Programming on Android - RxAndroid - RxJava
Ali Muzaffar
 
Intro to Rx Java
Syed Awais Mazhar Bukhari
 
RxJava@DAUG
Maxim Volgin
 
Reactive programming with rx java
CongTrung Vnit
 
Reactive Everywhere
trion development GmbH
 
RxJava pour Android : présentation lors du GDG Android Montréal
Sidereo
 
RxJava 2 Reactive extensions for the JVM
Netesh Kumar
 
Samuele Resca - REACTIVE PROGRAMMING, DAMN. IT IS NOT ABOUT REACTJS - Codemot...
Codemotion
 
Mario Fusco - Reactive programming in Java - Codemotion Milan 2017
Codemotion
 
Ad

More from allegro.tech (10)

PDF
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
allegro.tech
 
PPTX
allegro.tech Data Science Meetup #2: Elasticsearch w praktyce
allegro.tech
 
PDF
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
allegro.tech
 
PDF
Scaling infrastructure beyond containers
allegro.tech
 
PDF
Confitura 2015 - Code Quality Keepers @ Allegro
allegro.tech
 
PDF
Confitura 2015 - Mikrousługi nie lubią być samotne
allegro.tech
 
PDF
RxJava & Hystrix - Perfect match for distributed applications
allegro.tech
 
PDF
Microservices architecture pitfalls
allegro.tech
 
PDF
JDD 2014: Adam Dubiel - Import allegro.tech.internal.*
allegro.tech
 
PDF
Fighting with scale
allegro.tech
 
Allegro Tech Talks Poznań #4: Jak przyspieszyć SOLRa w kilku prostych krokach.
allegro.tech
 
allegro.tech Data Science Meetup #2: Elasticsearch w praktyce
allegro.tech
 
[WHUG] Wielki brat patrzy - czyli jak zbieramy dane o użytkownikach allegro
allegro.tech
 
Scaling infrastructure beyond containers
allegro.tech
 
Confitura 2015 - Code Quality Keepers @ Allegro
allegro.tech
 
Confitura 2015 - Mikrousługi nie lubią być samotne
allegro.tech
 
RxJava & Hystrix - Perfect match for distributed applications
allegro.tech
 
Microservices architecture pitfalls
allegro.tech
 
JDD 2014: Adam Dubiel - Import allegro.tech.internal.*
allegro.tech
 
Fighting with scale
allegro.tech
 
Ad

Recently uploaded (20)

PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PDF
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PPTX
Designing Production-Ready AI Agents
Kunal Rai
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
Advancing WebDriver BiDi support in WebKit
Igalia
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PDF
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Designing Production-Ready AI Agents
Kunal Rai
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
Advancing WebDriver BiDi support in WebKit
Igalia
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 

RxJava - introduction & design

  • 1. 1 Mateusz Gajewski Solutions Architect @ Allegro Kraków Office Opening • February 2015 allegrotech.io, twitter: @allegrotechblog RxJava Reactive eXtensions for JVM
  • 2. But first, let me introduce myself… 2
  • 3. Talk agenda • Problem statement • Reactive programming concept • Brief history of reactive extensions (RX) • RxJava API contract • Functional operators • Schedulers • Subjects • Dealing with back-pressure 3
  • 4. Problem 4 Statement: asynchronous programming is hard and error-prone but still extremely indispensable
  • 5. Possible approaches • Future<T>, • Guava’s ListenableFuture<T> (JVM6+) • CompletableFuture<T> (JVM8) • RxJava (JVM6+) 5
  • 6. *Future(s) are not enough • Supporting single (scalar) values, • Future<T>.get(period, TimeUnit) still blocks threads, • Composing is hard - leading to callback hell, • Complex flows required some kind of FSM, • Error handling is error-prone :) 6
  • 7. https://github.com/ReactiveX/RxJava “RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM” 7
  • 9. Reactive manifesto v2 Reactive system has to be: 9 Responsive thus react to users demand Resilient thus react to errors and failure Elastic thus react to load Message-driven thus react to events and messages
  • 10. Ok, but what’s reactive programming in this context? 10
  • 11. Reactive programming • Wikipedia says: “Data flows and propagation of change”, • I prefer: “programming with asynchronous (in)finite data sequences” • Basically pushing data instead of pulling it 11
  • 12. Reactive extensions • Implement reactive programming paradigm over (in)finite sequences of data, • Push data propagation: • Observer pattern on steroids, • Declarative (functional) API for composing sequences, • Non-opinionated about source of concurrency (schedulers, virtual time) 12
  • 13. .NET was there first and everybody is into it now 13
  • 14. .NET was there first • Version 1.0 released 17.11.2009, • Shipped with .NET 4.0 by default, • Version 2.0 released 15.08.2012, • With a support for “Portable Library” (.NET 4.5) • Reactive Extensions for JS released 17.03.2010 14
  • 15. RxJava 1.0.x • Ported from .NET to JVM by Netflix, • Stable API release in November 2014, • After nearly two years of development, • Targeting Java (and Android), Scala, Groovy, JRuby, Kotlin and Clojure, • Last version 1.0.5 released 3 days ago 15
  • 16. Observable<T> vs Iterable<T> vs Future<T> 16 Scalar value Sequence Synchronous T Iterable<T> Asynchronous* Future<T> Observable<T> * Observable is single-threaded by default
  • 17. Observable is an ordered (serial) data sequence 17 * this is so called marble diagram (source: https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava)
  • 19. Core types • Observer<T> • Observable<T> • OnSubscribe<T> • Producer • Subscriber<T> • Subscription • Operator<T, R> • Scheduler • Subject<T> 19
  • 20. Observer<T> contract • methods: • onNext(T) • onError(Throwable T) • onCompleted() • onError/onCompleted called exactly once 20
  • 23. Observable<T> functional API 23 Operator class Source type Result type Anamorphic aka unfold T Observable<T> Bind aka map Observable<T1> Observable<T2> Catamorphic aka fold or reduce Observable<T> T http://en.wikipedia.org/wiki/Anamorphism, http://en.wikipedia.org/wiki/Catamorphism
  • 24. Unfold operatorsaka “how to create observables” 24 Operator Description Observable.just(T value) Wraps plain value(s) into Observable Observable.range(int from, int to) Generates range sequence Observable.timer() Generates time-based sequence Observable.interval() Generates interval-based sequence Observable.create(OnSubscribe<T>) Creates observable with delegate (most powerful) Observable.never() Empty sequence that never completes either way Observable.empty() Empty sequence that completes right away Observable.error(Throwable t) Empty sequence that completes with error
  • 26. OnSubscribe<T> contract • onNext() called from a single thread (synchronisation is not provided) • onCompleted() and onError() called exactly once, • Subscriber.isUnsubscribed() is checked prior to sending any notification • setProducer() is used to support reactive-pull back-pressure 26
  • 27. Producer • Provided to support reactive pull back-pressure, • Observer can request n elements from producer, • If n == Long.MAX_VALUE back-pressure is disabled, • Still hard to use and do it right :( • But there is some work being done with FSM to better support back-pressure implementation 27
  • 29. Subscriber<T> • Basically both Observer<T> and Subscription, • Used in Operator<T, R> for lifting Observables into Observables, • Maintains subscription list 29
  • 30. Operator<T, R> • Covers “bind” operator class for lifting Observables • Can preserve state in a scope of chained calls, • Should maintain subscriptions and unsubscribe requests, • It’s hard to write it right (composite subscriptions, back- pressure, cascading unsubscribe requests) 30
  • 32. Transformer<T, R> 32 What will be the result? ;)
  • 33. Operators categories map and fold 33 Category Examples Combining join, startWith, merge, concat, zip… Conditional amb, skipUntil, skipWhile, takeUntil, takeWhile, defaultIfEmpty… Filtering filter, first, last, takeLast, skip, elementAt, sample, throttle, timeout, distinct, distinctUntilChange, ofType, ignoreElements… Aggregating concat, count, reduce, collect, toList, toMap, toSortedList… Transformational map, flatMap, switchMap, scan, groupBy, buffer, window… See more: http://reactivex.io/documentation/operators.html
  • 35. Schedulers • Source of concurrency for Observables: • Observable can use them via observeOn/subscribeOn, • Schedules unit of work through Workers, • Workers represent serial execution of work. • Provides different processing strategies (Event Loop, Thread Pools, etc), • Couple provided out-of-the-box plus you can write your own 35
  • 36. Schedulers 36 Name Description Schedulers.computation() Schedules computation bound work (ScheduledExecutorService with pool size = NCPU, LRU worker select strategy) Schedulers.immediate() Schedules work on current thread Schedulers.io() I/O bound work (ScheduledExecutorService with growing thread pool) Schedulers.trampoline() Queues work on the current thread Schedulers.newThread() Creates new thread for every unit of work Schedulers.test() Schedules work on scheduler supporting virtual time Schedulers.from(Executor e) Schedules work to be executed on provided executor
  • 37. (subscribe|observe)On • Think of them this way: • subscribeOn - invocation of the subscription, • observeOn - observing of the notifications • Thus: • subscribeOn for background processing and warm-up 37
  • 40. Subjects • Subject is a proxy between Observable<T> and Subscriber<T> • It can subscribe multiple observables • And emit items as an observable • Different Subject types has different properties 40
  • 46. Cold vs hot observables • Passive sequence is cold: • Producing notifications when requested • At rate Observer desires • Ideal for reactive pull model of back-pressure using Producer.request(n) • Active sequence is hot: • Producing notifications regardless of subscriptions: • Immediately when it is created • At rate Observer sometimes cannot handle, • Ideal for flow control strategies like buffering, windowing, throttling, onBackpressure* 46
  • 47. Cold vs hot examples 47 Cold Hot Asynchronous requests (Observable.from) UI events (mouse clicks, movements) Created with OnSubscribe<T> Timer events Subscriptions to queues Push pub/sub (broadcasts)
  • 50. Design considerations • Reactive Extensions are not a silver-bullet for dealing with concurrency: • Threading/synchronization concerns does not go away, • You can still block your threads (dead-lock), • Simple flows on top of RX and static sequences yields significant overhead, • Choosing right operators flow is a challenge, • You should avoid shared-state if possible (immutability FTW), • Debugging is quite hard (but there is “plugins” mechanism), • Understanding and using back-pressure well is harder :) 50
  • 51. More reading • Free Rx.NET books: • Introduction to RX: http://www.introtorx.com/ • RX Design Guidelines: http://go.microsoft.com/fwlink/?LinkID=205219 • Reactive Extensions: http://reactivex.io • Interactive RX diagrams: http://rxmarbles.com • Reactive programming @ Netflix: http://techblog.netflix.com/2013/01/ reactive-programming-at-netflix.html 51
  • 52. Interesting RX-enabled projects • https://github.com/Netflix/Hystrix • https://github.com/jersey/jersey • https://github.com/square/retrofit • https://github.com/ReactiveX/RxNetty • https://github.com/couchbase/couchbase-java-client • https://github.com/Netflix/ocelli • https://github.com/davidmoten/rtree 52