71
A Lite Rx API for the JVM 井口 @ SmartNews, Inc. SpringOne Platform 2016 報告会

SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Embed Size (px)

Citation preview

Page 1: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

A Lite Rx API for the JVM

井口 貝 @ SmartNews, Inc.

SpringOne Platform 2016 報告会

Page 2: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

自己紹介

名前

井口 貝 (いのくち かい)

@kainoque

所属

  サーバサイドエンジニア @ SmartNews, Inc.

ref: SmartNews, Inc. | Teamhttp://about.smartnews.com/ja/team/

Page 3: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

自己紹介

Page 4: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

自己紹介

Page 5: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

SmartNews のニュース配信システム構成

Page 6: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・SpringOne 2016 のセッション報告を通じて、Reactive Streams の実装である Reactor を紹介

 ・Reactor API の紹介

 ・Spring 5 との関連性

 ・注意点など

はじめに

Page 7: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・セッション概要

・”Reactive”

・Reactive Streams

・Reactor

・Reactor and Spring 5

・Reactor API Hands-on

・Notes

もくじ

Page 8: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・セッション概要

・”Reactive”

・Reactive Streams

・Reactor

・Reactor and Spring 5

・Reactor API Hands-on

・Notes

もくじ

Page 9: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

タイトル

Reactor Core 3.0: A Lite Rx API for the JVM

内容

・Reactive Streams の概要とその実装の一つである Reactor の紹介

・API ハンズオン

発表者

・Mr. Stéphane Maldini (Project Reactor lead)

・Mr. Sébastien Deleuze (Spring and Project Reactor committer)

セッション概要

Page 10: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・セッション概要

・”Reactive”

・Reactive Streams

・Reactor

・Reactor and Spring 5

・Reactor API Hands-on

・Notes

もくじ

Page 11: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

“Reactive”広義には、「non-blocking で event-driven なシステム」を形容する言葉

Reactive Manifesto にてその必要要件が定義されている

・Responsive (即応性)

・Resilent (耐障害性)

・Elastic (弾力性)

・Message-Driven (メッセージ駆動)ref: The Reactive Manifestohttp://www.reactivemanifesto.org/

Page 12: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

よりスケールし、安定的に動作し、キャパシティプランニングを容易にすることを標榜す

る場合、システムの Reactive 化は一つの選択肢となる

ユースケース

・BigData processsing・外部サービスに依存する webapp・データ生成側と利用側の処理速度に非対称性があるシステム

・大量のクライアントをさばく必要があるシステム

“Reactive”

Page 13: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

もくじ

・セッション概要

・”Reactive”

・Reactive Streams

・Reactor

・Reactor and Spring 5

・Reactor API Hands-on

・Notes

Page 14: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactive Streams

”Reactive” なシステムを実現するための非同期ストリーム処理の標準仕様

・non-blocking な backpressure をもつ

・Reactive Streams Commons が策定

・j.u.c.Flow として Java 9 にも組み込まれる予定

・JEP 266: More Concurrency Updates

ref: JEP 266: More Concurrency Updateshttp://openjdk.java.net/jeps/266

ref: reactive-streams-jvm https://github.com/reactive-streams/reactive-streams-jvm

Page 15: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・Publisher と Subscriber の間のコミュニケーション

・Subscriber が受け取るデータの個数を、自身でコントロール可能 (backpressure)・Publisher は Subscriber の要求数より多いデータを送らない

・Publisher は Subscriber から要求されるまでデータを送らない

Reactive Streams

Page 16: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

4 interfaces / 7 methods の定義 (+ TCK)

・Publisher

・Subscriber

・Subscription

・Processor

Reactive Streams Subscriber Publisher Subscription

Subscriber Publisher Subscription

subscribe(this)

generate

onSubscribe(s)

s

request(1)

request something

onNext(data)

onComplete()

Page 17: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactive StreamsPublisher

public interface Publisher<T> { void subscribe(Subscriber<T> s);}

Subscriber Publisher Subscription

Subscriber Publisher Subscription

subscribe(this)

generate

onSubscribe(s)

s

request(1)

request something

onNext(data)

onComplete()

Page 18: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactive StreamsSubscriber

public interface Subscriber<T> { void onSubscribe(Subscription s); void onNext(T t); void onError(Throwable t); void onComplete();}

Subscriber Publisher Subscription

Subscriber Publisher Subscription

subscribe(this)

generate

onSubscribe(s)

s

request(1)

request something

onNext(data)

onComplete()

Page 19: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

public interface Subscription { void request(long n); void cancel();}

Reactive StreamsSubscription

Subscriber Publisher Subscription

Subscriber Publisher Subscription

subscribe(this)

generate

onSubscribe(s)

s

request(1)

request something

onNext(data)

onComplete()

Page 20: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {}

Reactive StreamsProcessor

Component A Component CComponent BSubscriber of A / Publisher of C

Processor<T1, T2>

T1 T2

Page 21: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactive StreamsSubscriber Publisher Subscription

Subscriber Publisher Subscription

subscribe(this)

generate

onSubscribe(s)

s

request(1)

request something

onNext(data)

onComplete()

Page 22: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・Reactive Streams 自体は直接開発者に触られることを必ずしも想定していない

・通常は Reactive Streams を実装した Reactive API Library を使用する

・実装 Library

・RxJava 2.0 (JVM)

・Akka-Stream (JVM)

・Reactor 3.0 (JVM)

・RxJS (JavaScript) などなど

Reactive Streams

Page 23: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・セッション概要

・”Reactive”

・Reactive Streams

・Reactor

・Reactor and Spring 5

・Reactor API Hands-on

・Notes

もくじ

Page 24: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor

Reactive Streams を実装した JVM 向け API ライブラリの一つ

・buffer, merge, concatenate, filter, map などの API を提供する

・RxJava の project lead である David Karnok や  Spring Framework の commiter が中心となって contribute している

Page 25: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor特徴

・リソースの効率性に強くフォーカスしている

・contributor の多くが共通する Spring 5 とも相性良く設計されている

・Java 8 の各インターフェイスをベースにしている

・RxJava などに顕著な専用の Action1 などのクラスは用いていない

・デバッグ・ロギング・テストを容易に行える

 ・4th Generation Reactive Library

ref: Operator-fusion (Part 1)http://akarnokd.blogspot.jp/2016/03/operator-fusion-part-1.html

Page 26: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor

Page 27: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor・API 紹介

・Mono

・Flux

・Schedulers

・各型の比較

・RxJava との相互運用

Page 28: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・API 紹介

・Mono

・Flux

・Schedulers

・各型の比較

・RxJava との相互運用

Reactor

Page 29: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

ReactorMono

・1 個 (または 0 個) の値のみを emit する Publisher 実装

・reactor.core.publisher.Mono

Page 30: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Mono

Reactor

Page 31: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Mono

Reactor

Page 32: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Flux

・複数の値を emit する Publisher 実装

・reactor.core.publisher.Flux

Reactor

Page 33: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Flux

Reactor

Page 34: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Flux

Reactor

Page 35: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Scheduler

・publish / subscribe を行うスレッドのスレッドプールの factory

・Schedulers.single(), parallel(), elastic() 等で生成

・publish / subscribe は、デフォルトでは呼び出し側スレッドで行われる

Reactor

Page 36: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Scheduler

・Slow-Publisher, Fast-Subscriber

・someFlux.subscribeOn(Schedulers.elastic())

Reactor

Page 37: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Scheduler

・Fast-Publisher, Slow-Subscriber

・someFlux.publishOn(Schedulers.elastic())

Reactor

Page 38: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor・API 紹介

・Mono

・Flux

・Schedulers

・各型の比較

・RxJava との相互運用

Page 39: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

No value Single value Multiple Values

Blocking void TFuture<T>

Iterable<T>Collection<T>Stream<T>

Non-Blocking CompletableFuture<Void>

CompletableFuture<T>

CompletableFuture<List<T>>

Reactive Streams Publisher<Void> Publisher<T> Publisher<T>

RxJava Completable Single<T> Observable<T>

Reactor Mono<Void> Mono<T> Flux<T>

Reactor

Page 40: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor・API 紹介

・Mono

・Flux

・Schedulers

・各型の比較

・RxJava との相互運用

Page 41: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

RxJava1Adapter

RxJava 1 系 の Completable / Single / Observable と Reactor の

Mono / Flux の相互変換アダプタ

Reactor

from RxJava to RxJava

No value completableToMono publisherToCompletable

Single value singleToMono publisherToSingle

Multiple Values observableToFlux publisherToObservable

Page 42: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・セッション概要

・”Reactive”

・Reactive Streams

・Reactor

・Reactor and Spring 5

・Reactor API Hands-on

・Notes

もくじ

Page 43: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor and Spring 5Spring 5 における Reactive サポートの導入に際して、

Reactor Core がその基礎となっている

・例:

・Flux/Mono を受け取り、返却可能な Controller の導入

・Flux/Mono を返却可能な HTTP Client 実装の導入

ref: Reactive Programming with Spring 5.0 M1https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1

Page 44: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Controller

Reactor and Spring 5

Page 45: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactive HTTP Client

in org.springframework.web.client.reactive

Reactor and Spring 5

Page 46: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Spring Initializr で手軽に試すことができる

Dependencies から Reactive Web を選択 (Spring Boot のバージョンは 1.4.1 (SNAPSHOT))

Reactor and Spring 5

ref: SPRING INITIALIZR bootstrap your application nowhttps://start.spring.io/

Page 47: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・セッション概要

・”Reactive”

・Reactive Streams

・Reactor

・Reactor and Spring 5

・Reactor API Hands-on

・Notes

もくじ

Page 48: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor の各 API を理解するためのハンズオン

Part 1 から 9 まで、各 API を利用した JUnit テストが書かれている

それをグリーンにしながら進めていく

Reactor API Hands-on

ref: Lite Rx API Hands-onhttps://github.com/reactor/lite-rx-api-hands-on

Part 1 Flux の作成

Part 2 Mono の作成

Part 3 値の変換

Part 4 Flux のマージ

Part 5 リクエスト

Part 6 その他の操作

Part 7 Reactive -> Blocking 処理の変換

Part 8 RxJava との相互運用

Part 9 Blocking -> Reactive 処理の変換

Page 49: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor API Hands-on

Page 50: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Part 1 Flux の作成

Part 2 Mono の作成

Part 3 値の変換

Part 4 Flux のマージ

Part 5 リクエスト

Reactor API Hands-on

Part 6 その他の操作

Part 7 Reactive -> Blocking 処理の変換

Part 8 RxJava との相互運用

Part 9 Blocking -> Reactive 処理の変換

Page 51: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Mono#just

Reactor API Hands-on

Page 52: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Flux#fromIterable

Reactor API Hands-on

Page 53: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Part 1 Flux の作成

Part 2 Mono の作成

Part 3 値の変換

Part 4 Flux のマージ

Part 5 リクエスト

Reactor API Hands-on

Part 6 その他の操作

Part 7 Reactive -> Blocking 処理の変換

Part 8 RxJava との相互運用

Part 9 Blocking -> Reactive 処理の変換

Page 54: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

{Mono,Flux}#map

Reactor API Hands-on

Page 55: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

{Mono,Flux}#flatMap

Reactor API Hands-on

Page 56: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Part 1 Flux の作成

Part 2 Mono の作成

Part 3 値の変換

Part 4 Flux のマージ

Part 5 リクエスト

Reactor API Hands-on

Part 6 その他の操作

Part 7 Reactive -> Blocking 処理の変換

Part 8 RxJava との相互運用

Part 9 Blocking -> Reactive 処理の変換

Page 57: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Flux#mergeWith

Reactor API Hands-on

Page 58: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Flux#concatWith

Reactor API Hands-on

Page 59: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Part 1 Flux の作成

Part 2 Mono の作成

Part 3 値の変換

Part 4 Flux のマージ

Part 5 リクエスト

Reactor API Hands-on

Part 6 その他の操作

Part 7 Reactive -> Blocking 処理の変換

Part 8 RxJava との相互運用

Part 9 Blocking -> Reactive 処理の変換

Page 60: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor API Hands-onFlux#zip

Page 61: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor API Hands-onMono#first

Page 62: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor API Hands-onflux#onErrorResumeWith

Page 63: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Part 1 Flux の作成

Part 2 Mono の作成

Part 3 値の変換

Part 4 Flux のマージ

Part 5 リクエスト

Reactor API Hands-on

Part 6 その他の操作

Part 7 Reactive -> Blocking 処理の変換

Part 8 RxJava との相互運用

Part 9 Blocking -> Reactive 処理の変換

Page 64: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor API Hands-onMono#block

Page 65: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Reactor API Hands-onFlux#defer

Page 66: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・セッション概要

・”Reactive”

・Reactive Streams

・Reactor

・Reactor and Spring 5

・Reactor API Hands-on

・Notes

もくじ

Page 67: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

・安定的な動作、予測可能なキャパシティと引き換えに、オーバーヘッドはある

・非同期処理特有の複雑さ、デバッグのしづらさはある

Notes

Page 68: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Notes

Page 69: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

Notes

Page 70: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

おわりに

・”Reactive” なシステムを実現するための標準仕様として Reactive Streams が存在する

・Reactive なシステムを実現するライブラリとして Reactor という選択肢がある

・Non-blocking + backpressure を備えリソース効率性が高い Reactive API Library

・Java 8 / Spring 5 と統合されている

・Mono / Flux により操作を行う

・依然として銀の弾丸ではない

Page 71: SpringOne Platform 2016 報告会「A Lite Rx API for the JVM」/ 井口 貝 @ SmartNews, Inc

http://about.smartnews.com/ja/careers/

We’re hiring!!

Web Application / iOS / Android / SRE / Ad-tech / Machine-learning / NLP