Reactive Streams
and
Akka
Reactive Streams
Write once, stream everywhere
- Functional extension of async/await
- Handling streams of "live" data
- Problems: Synchronisation, Error handling, Producer-Consumer
- Interfaces/Contracts part of JDK 9 (JEP 266)
- ReactiveX (reactivex.io): Java, .NET, JS, C++... (backend, frontend...)
- Project Reactor (projectreactor.io): Java, Kafka (backend focused)
Observable → Operator → Subscriber
Observable = Stream prototype
Operator = Stream transformation
Subscriber = Stream consumer
Observable
Future, Iterable, merge, concat, periodic, timer, ...
Operator
Transformations
map, filter, scan, groupBy, flatMap, takeUntil, delay, ...
Backpressure
debounce, throttle, buffer, window, sample, ...
Error handling
retry, catch, using, delayError, switchOnError, ...
val loadNext = list.scollEvents()
.debounce(100, TimeUnit.MILLISECOND)
.observeOn(Schedulers.ui())
.map { list.maxY - list.list.currentY }
.filter { remaining -> remaining < 2 * PAGE_HEIGHT }
Observable
.concat(
Observable
.range(1,100)
.map { page ->
Observable
.fromCallable { downloadPage(page) }
.retry(2)
.delaySubscription(loadNext)
}
)
.takeUntil { page -> page.isEmpty() }
.flatMap { page -> Observable.from(page) }
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.ui())
.filter { item -> ! list.contains(item) }
.subscribe(
onNext = { item -> list.add(item) },
onError = { e -> list.clear(); list.add(e) },
onCompleted = { list.add(FOOTER) }
)
Akka
(Like Erlang, but on JVM)
- Actor concurrency model
- message driven
- 2.5M actors / 1GB and 50M message / s
- Actors form a tree-like hierarchy (spanning a single or multiple machines)
- Each Actor is responsible for failures of its children (restart/back-off)
- Actor references and paths (local or remote)
- Actor persistence (serialisation/deserialisation)
Akka Streams
- Reactive Streams compliant
- More complex API (designed for cluster execution)
- Pipelining vs. Parallel processing
- Source / Sink / Flow / Graph
- Broadcasting / Consuming streams
- Allows cycles (RxJava uses Subjects)
Reactive StreamsAkka
By Samuel Pastva
Reactive StreamsAkka
- 282