SlideShare a Scribd company logo
Copyright©2016 NTT corp. All Rights Reserved.
SpringOne Platform報告会
〜Reactive APIの設計・実装・使⽤〜
2016年9⽉3⽇
岩塚 卓弥
NTT ソフトウェアイノベーションセンタ
2Copyright©2016 NTT corp. All Rights Reserved.
• 名前:岩塚 卓弥
• 所属:NTT ソフトウェアイノベーションセンタ
• NTTの研究所のうちソフトウェアを専⾨に扱う
• ⾃部署ではソフトウェア⼯学を研究
• Springベースのグループ共通フレームワークの整備を担当
• SpringOneには⼆年連続での参加
⾃⼰紹介
3Copyright©2016 NTT corp. All Rights Reserved.
• Designing, Implementing, and Using Reactive
APIs
• Ben Hale - Cloud Foundry Java Experience Lead
• Paul Harris - Engineer of Cloud Foundry Java Client
• Stephane Maldini - Project Reactor Lead
• スライドは既に公開済み
• http://www.slideshare.net/SpringCentral/designing-
implementing-and-using-reactive-apis
今⽇の元ネタ
このセッションの特徴
実⽤経験に基づいたReactive APIの設計,実装,使⽤法を紹介
• https://github.com/cloudfoundry/cf-java-client
Reactorを使った活きたコード例が豊富!
具体的にどんなコードを書いていくのか知りたい⼈にオススメ!
4Copyright©2016 NTT corp. All Rights Reserved.
• Reactive APIの戻り値
• Functional Style の推奨
• 条件分岐
• テスト⾟い問題
アウトライン
5Copyright©2016 NTT corp. All Rights Reserved.
• Reactive APIの戻り値
• Functional Style の推奨
• 条件分岐
• テスト⾟い問題
アウトライン
6Copyright©2016 NTT corp. All Rights Reserved.
• Mono または Flux
• Mono<T> : ⾼々1つのTを返す
• Flux<T> : 0以上の任意の個数のTを返す
Ractive APIの戻り値
TはCollectionでも構わない
e.g. Mono<List<String>>
7Copyright©2016 NTT corp. All Rights Reserved.
• subscribeするまではただの「設計書」にすぎない
• 作った設計書を戻り値として返してやる必要がある
• Mono<Void>やFlux<Void>を返すのはOK
戻り値を void にしてはいけない
8Copyright©2016 NTT corp. All Rights Reserved.
• Reactive APIの戻り値
• Functional Style の推奨
• 条件分岐
• テスト⾟い問題
アウトライン
9Copyright©2016 NTT corp. All Rights Reserved.
• 副作⽤がない,単純で⼩さなメソッドをつくる
✔ 動作を検証しやすい
✔ バグを作り込みにくい
✔ 再利⽤しやすい
• ⼩さなメソッドを組み合わせて⼤きな処理を⾏う
• 組み合わせの道具:⾼階関数
• map
• filter
• flatMap
• concatMap
• …
Functional Styleの推奨
関数を引数や戻り値とする関数
10Copyright©2016 NTT corp. All Rights Reserved.
おさらい – map / flatMap
Mono<T> / Flux<T> における各要素に
T から V への関数を適⽤し
Mono<V> / Flux<V> を返す
Mono<T> / Flux<T> における各要素に
T から Publisher<R> への関数を適⽤し
Flux<R>を返す
11Copyright©2016 NTT corp. All Rights Reserved.
Functional Styleの例
再利⽤性の⾼いメソッド
12Copyright©2016 NTT corp. All Rights Reserved.
• mapやflatMapを持つクラスは他にもある
• StreamやOptionalなど
• これは偶然ではなく,抽象化すると同じ形になっていることに気づく
• map : F<T>に,T→Vの関数を適⽤して,F<V>を返す
• flatMap : M<T>に,T→M<R>の関数を適⽤して,M<R>を返す
余談:Mono / Flux はMonad?
Functor Monad
条件:
・以下の関数を持つ
・fmap : (T → V) → F<T> → F<V>
・Mono / Flux それぞれのmapが
fmapに該当する
・Functor則を満たす(略)
条件:
・以下の関数を持つ
・bind : M<T> → (T → M<R>) → M<R>
・unit : T → M<T>
・Mono の then, Flux の flatMap /
concatMap がbindに該当する
・Mono / Flux それぞれの just が
unitに該当する
・Monad則を満たす(略)
13Copyright©2016 NTT corp. All Rights Reserved.
メソッド参照による組み⽴て
⾼階関数にメソッド参照を渡して繋いでいく
複数引数をとるメソッドには Tuple と補助関数を利⽤
14Copyright©2016 NTT corp. All Rights Reserved.
• 順序付けられた値の組
• e.g. (“Text”, 12), (“abc”, “def”, 0.3) etc.
• メンバ名のない構造体のようなイメージ
• 新たに型をつくるまでもないが,値を組にしたいときに有⽤
• 複数の値を返す関数の作成など
• Reactorには2〜8個組を作るためのTuple型が⽤意さ
れている
• Tuple2<T1, T2>, Tuple3<T1, T2, T3>, …
• ちなみに Scala には Tuple22 まであったりする
• 前スライドの補助関数を再確認
• 2引数の関数から,2つ組のタプルを引数に取る関数に変換
Tuple
15Copyright©2016 NTT corp. All Rights Reserved.
• 仮引数を使わずに関数を定義していくコーディングスタ
イル
• Haskell由来の⽤語
• https://wiki.haskell.org/Pointfree
• 定義が簡潔になり,可読性が上がる (やりすぎると逆効果…)
• f x = x + 1
• f = (+ 1)
• Reactive APIを使⽤する際におすすめらしい
• データではなく関数中⼼に考える上での助けになるとのこと
• おそらく本来の意味とは異なった意味で使われていたが…
Pointfree Style の推奨
Point
Pointfree
16Copyright©2016 NTT corp. All Rights Reserved.
Point Free Style とされていた例
17Copyright©2016 NTT corp. All Rights Reserved.
• Reactive APIの戻り値
• Functional Style の推奨
• 条件分岐
• テスト⾟い問題
アウトライン
18Copyright©2016 NTT corp. All Rights Reserved.
• Mono / Flux に値ではなくエラーが流れる場合もある
• エラーを扱う⽅法が⾊々⽤意されている
• doOnError
• mapError
• otherwise
• …
エラーによる条件分岐
19Copyright©2016 NTT corp. All Rights Reserved.
エラーによる条件分岐の例
発⽣したエラーを捨てて別のレスポンスを返却
20Copyright©2016 NTT corp. All Rights Reserved.
• Mono / Flux に何も値が流れずにCompleteする場合
もある
• Emptyの場合を扱う⽅法が⽤意されている
• defaultWithEmpty
• otherwiseIfEmpty / switchIfEmpty
• repeatWhenEmpty
Emptyによる条件分岐
21Copyright©2016 NTT corp. All Rights Reserved.
Emptyによる条件分岐の例
getPrivateDomanId, getSharedDomainIdの
両⽅が Empty の場合にエラーを投げる
22Copyright©2016 NTT corp. All Rights Reserved.
• エラーでも Empty でもなく単に値で分岐したい場合も
ある
• if⽂を使って命令的に書けば良い
• Mono / Flux のメソッドで頑張っても良いが,直感的に理解し
難くなる可能性が⾼い
値による条件分岐
23Copyright©2016 NTT corp. All Rights Reserved.
値による条件分岐の例 - Imperative
24Copyright©2016 NTT corp. All Rights Reserved.
値による条件分岐の例
25Copyright©2016 NTT corp. All Rights Reserved.
• Reactive APIの戻り値
• Functional Style の推奨
• 条件分岐
• テスト⾟い問題
アウトライン
26Copyright©2016 NTT corp. All Rights Reserved.
テスト⾟い問題
• もちろんテストはRedに…?
• ならない!
• ⾮同期の罠 メインスレッド ⾮同期スレッド
この仕事頼む!
任せろ!
任務完了…
ちょ待てよ
27Copyright©2016 NTT corp. All Rights Reserved.
CountDownLatch
• 他のスレッドの終了を待つための仕組み
• Reactor特有のクラスではない
• java.util.concurrent.CountDownLatch
メインスレッド ⾮同期スレッド
CountDownLatchを1にセット
任せろ!
この仕事頼む!
CountDownLatchが
0になるまで待つよ
CountDownLatchを
カウントダウンするよ
終わった!
完了!
28Copyright©2016 NTT corp. All Rights Reserved.
同期による問題解決
CountDownLatchを使って,⾮同期スレッドの処理が済むのを待つ
すべてのテストにブロックの処理書くのは⾟すぎる…
29Copyright©2016 NTT corp. All Rights Reserved.
TestSubscriber
同期させるためのコードを⾃分で書く必要がない
30Copyright©2016 NTT corp. All Rights Reserved.
• 設計変更のために3.0.0.RELEASEから除かれた模様
• Re-evaluate TestSubscriber API
• https://github.com/reactor/reactor-core/issues/135
• Cloud Foundry Java Clientでは独⾃に実装したものを使⽤
Reactor では依然準備中…
31Copyright©2016 NTT corp. All Rights Reserved.
• Reactive APIの戻り値
• 必ず Mono か Fluxを返そう
• Functional Style の推奨
• ⼤きな処理は⼩さな関数を組み合わせて作る
• 条件分岐
• エラーやEmptyを特別扱いするためのメソッドがある
• if⽂を使っても問題ない
• テスト⾟い問題
• TestSubscriber待機…?
まとめ
32Copyright©2016 NTT corp. All Rights Reserved.
• Designing, Implementing, and Using Reactive
APIs
• http://www.slideshare.net/SpringCentral/designing-
implementing-and-using-reactive-apis
• Project Reactor リファレンス
• https://projectreactor.io/core/docs/api/
• Cloud Foundry Java Client
• https://github.com/cloudfoundry/cf-java-client/
参考⽂献

More Related Content

What's hot

趣味と仕事の違い、現場で求められるアプリケーションの可観測性
趣味と仕事の違い、現場で求められるアプリケーションの可観測性趣味と仕事の違い、現場で求められるアプリケーションの可観測性
趣味と仕事の違い、現場で求められるアプリケーションの可観測性
LIFULL Co., Ltd.
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
chibochibo
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
 
Kafka Summit NYCに見るストリーミングデータETLの話 #streamdatajp
Kafka Summit NYCに見るストリーミングデータETLの話 #streamdatajpKafka Summit NYCに見るストリーミングデータETLの話 #streamdatajp
Kafka Summit NYCに見るストリーミングデータETLの話 #streamdatajp
Yahoo!デベロッパーネットワーク
 
試験にでるSpring
試験にでるSpring試験にでるSpring
試験にでるSpring土岐 孝平
 
Spring social の基礎
Spring social の基礎Spring social の基礎
Spring social の基礎
Takuya Iwatsuka
 
Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報
Takuya Iwatsuka
 
SpringOne Platform 2018 全体報告
SpringOne Platform 2018 全体報告SpringOne Platform 2018 全体報告
SpringOne Platform 2018 全体報告
Takuya Iwatsuka
 
Spring知っておきたい
Spring知っておきたいSpring知っておきたい
Spring知っておきたい
Yuichi Hasegawa
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo!デベロッパーネットワーク
 
SCM, CI and Maven Repo
SCM, CI and Maven RepoSCM, CI and Maven Repo
SCM, CI and Maven Repo
Hideaki Ishijima
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjug
Yuji Kubota
 
SpringIO2019報告_Kotlin関連
SpringIO2019報告_Kotlin関連SpringIO2019報告_Kotlin関連
SpringIO2019報告_Kotlin関連
ShingoKurihara1
 
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能
kimulla
 
Spring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVCSpring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVC
Yuichi Hasegawa
 
Apache NiFi 流れるデータにもスキーマを
Apache NiFi 流れるデータにもスキーマをApache NiFi 流れるデータにもスキーマを
Apache NiFi 流れるデータにもスキーマを
Koji Kawamura
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④
Yahoo!デベロッパーネットワーク
 
PlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.keyPlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.key
泰 増田
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
Takeshi Ogawa
 
Twilio API を PHP で触ってみよう
Twilio API を PHP で触ってみようTwilio API を PHP で触ってみよう
Twilio API を PHP で触ってみよう
Masashi Shinbara
 

What's hot (20)

趣味と仕事の違い、現場で求められるアプリケーションの可観測性
趣味と仕事の違い、現場で求められるアプリケーションの可観測性趣味と仕事の違い、現場で求められるアプリケーションの可観測性
趣味と仕事の違い、現場で求められるアプリケーションの可観測性
 
ビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streamingビッグじゃなくても使えるSpark Streaming
ビッグじゃなくても使えるSpark Streaming
 
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
 
Kafka Summit NYCに見るストリーミングデータETLの話 #streamdatajp
Kafka Summit NYCに見るストリーミングデータETLの話 #streamdatajpKafka Summit NYCに見るストリーミングデータETLの話 #streamdatajp
Kafka Summit NYCに見るストリーミングデータETLの話 #streamdatajp
 
試験にでるSpring
試験にでるSpring試験にでるSpring
試験にでるSpring
 
Spring social の基礎
Spring social の基礎Spring social の基礎
Spring social の基礎
 
Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報
 
SpringOne Platform 2018 全体報告
SpringOne Platform 2018 全体報告SpringOne Platform 2018 全体報告
SpringOne Platform 2018 全体報告
 
Spring知っておきたい
Spring知っておきたいSpring知っておきたい
Spring知っておきたい
 
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
Yahoo! JAPANのコンテンツプラットフォームを支えるSpring Cloud Streamによるマイクロサービスアーキテクチャ #jsug #sf_52
 
SCM, CI and Maven Repo
SCM, CI and Maven RepoSCM, CI and Maven Repo
SCM, CI and Maven Repo
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjug
 
SpringIO2019報告_Kotlin関連
SpringIO2019報告_Kotlin関連SpringIO2019報告_Kotlin関連
SpringIO2019報告_Kotlin関連
 
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能
 
Spring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVCSpring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVC
 
Apache NiFi 流れるデータにもスキーマを
Apache NiFi 流れるデータにもスキーマをApache NiFi 流れるデータにもスキーマを
Apache NiFi 流れるデータにもスキーマを
 
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④
Yahoo! JAPAN MeetUp #8 (インフラ技術カンファレンス)セッション④
 
PlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.keyPlaySQLAlchemyORM2017.key
PlaySQLAlchemyORM2017.key
 
Spring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
 
Twilio API を PHP で触ってみよう
Twilio API を PHP で触ってみようTwilio API を PHP で触ってみよう
Twilio API を PHP で触ってみよう
 

Viewers also liked

Password validation with Passay
Password validation with PassayPassword validation with Passay
Password validation with Passay
Takuya Iwatsuka
 
Installing mule
Installing muleInstalling mule
Installing mule
JavierMarRas
 
Developer Infrastructure in Devlove Kansai
Developer Infrastructure in Devlove KansaiDeveloper Infrastructure in Devlove Kansai
Developer Infrastructure in Devlove Kansai
Kodai Sakabe
 
AWSによるWindowsクラサバ環境構築ハンズオン資料
AWSによるWindowsクラサバ環境構築ハンズオン資料AWSによるWindowsクラサバ環境構築ハンズオン資料
AWSによるWindowsクラサバ環境構築ハンズオン資料
Yoshinori Yamanouchi
 
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글
라한사 아
 
My social representation
My social representationMy social representation
My social representation
Socialconsulting.gr
 
3 d pie chart circular puzzle with hole in center pieces 8 stages style 1 pow...
3 d pie chart circular puzzle with hole in center pieces 8 stages style 1 pow...3 d pie chart circular puzzle with hole in center pieces 8 stages style 1 pow...
3 d pie chart circular puzzle with hole in center pieces 8 stages style 1 pow...SlideTeam.net
 
Aimia: The Big Deal About Big Data -- How It Will Transform Pharma Meeting an...
Aimia: The Big Deal About Big Data -- How It Will Transform Pharma Meeting an...Aimia: The Big Deal About Big Data -- How It Will Transform Pharma Meeting an...
Aimia: The Big Deal About Big Data -- How It Will Transform Pharma Meeting an...
David Nickelson, PsyD, JD
 
Naturalismo
NaturalismoNaturalismo
Naturalismo
Club_Agustinas
 
Church. Got an app for that?
Church. Got an app for that?Church. Got an app for that?
Church. Got an app for that?
ASDSVV
 
Greythorn Market Insights - February 2013
Greythorn Market Insights - February 2013Greythorn Market Insights - February 2013
Greythorn Market Insights - February 2013GreythornAU
 
Local sensitive hashing &amp; minhash on facebook friend
Local sensitive hashing &amp; minhash on facebook friendLocal sensitive hashing &amp; minhash on facebook friend
Local sensitive hashing &amp; minhash on facebook friend
Chengeng Ma
 
Neighborhood Watch prototype (storyboard narrative)
Neighborhood Watch prototype (storyboard narrative)Neighborhood Watch prototype (storyboard narrative)
Neighborhood Watch prototype (storyboard narrative)JosephHowerton
 
Лесной_план_региона_как_ориентир_для_инвестора
Лесной_план_региона_как_ориентир_для_инвестораЛесной_план_региона_как_ориентир_для_инвестора
Лесной_план_региона_как_ориентир_для_инвестора
Fedor Grabar
 
Publish
PublishPublish
Bia
BiaBia
Les Grossman's Pro Tips for Local SEO
Les Grossman's Pro Tips for Local SEOLes Grossman's Pro Tips for Local SEO
Les Grossman's Pro Tips for Local SEO
Greg Gifford
 
PrivateWave - sales presentation_en
PrivateWave - sales presentation_enPrivateWave - sales presentation_en
PrivateWave - sales presentation_enMarco Pissarello
 
Econ214 macroeconomics chapter 19
Econ214 macroeconomics chapter 19Econ214 macroeconomics chapter 19
Econ214 macroeconomics chapter 19
BHUOnlineDepartment
 
Symbiosis international university
Symbiosis international universitySymbiosis international university
Symbiosis international university
yunus khan
 

Viewers also liked (20)

Password validation with Passay
Password validation with PassayPassword validation with Passay
Password validation with Passay
 
Installing mule
Installing muleInstalling mule
Installing mule
 
Developer Infrastructure in Devlove Kansai
Developer Infrastructure in Devlove KansaiDeveloper Infrastructure in Devlove Kansai
Developer Infrastructure in Devlove Kansai
 
AWSによるWindowsクラサバ環境構築ハンズオン資料
AWSによるWindowsクラサバ環境構築ハンズオン資料AWSによるWindowsクラサバ環境構築ハンズオン資料
AWSによるWindowsクラサバ環境構築ハンズオン資料
 
스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글스프링시큐리티와 소셜연습 이해를 위한 글
스프링시큐리티와 소셜연습 이해를 위한 글
 
My social representation
My social representationMy social representation
My social representation
 
3 d pie chart circular puzzle with hole in center pieces 8 stages style 1 pow...
3 d pie chart circular puzzle with hole in center pieces 8 stages style 1 pow...3 d pie chart circular puzzle with hole in center pieces 8 stages style 1 pow...
3 d pie chart circular puzzle with hole in center pieces 8 stages style 1 pow...
 
Aimia: The Big Deal About Big Data -- How It Will Transform Pharma Meeting an...
Aimia: The Big Deal About Big Data -- How It Will Transform Pharma Meeting an...Aimia: The Big Deal About Big Data -- How It Will Transform Pharma Meeting an...
Aimia: The Big Deal About Big Data -- How It Will Transform Pharma Meeting an...
 
Naturalismo
NaturalismoNaturalismo
Naturalismo
 
Church. Got an app for that?
Church. Got an app for that?Church. Got an app for that?
Church. Got an app for that?
 
Greythorn Market Insights - February 2013
Greythorn Market Insights - February 2013Greythorn Market Insights - February 2013
Greythorn Market Insights - February 2013
 
Local sensitive hashing &amp; minhash on facebook friend
Local sensitive hashing &amp; minhash on facebook friendLocal sensitive hashing &amp; minhash on facebook friend
Local sensitive hashing &amp; minhash on facebook friend
 
Neighborhood Watch prototype (storyboard narrative)
Neighborhood Watch prototype (storyboard narrative)Neighborhood Watch prototype (storyboard narrative)
Neighborhood Watch prototype (storyboard narrative)
 
Лесной_план_региона_как_ориентир_для_инвестора
Лесной_план_региона_как_ориентир_для_инвестораЛесной_план_региона_как_ориентир_для_инвестора
Лесной_план_региона_как_ориентир_для_инвестора
 
Publish
PublishPublish
Publish
 
Bia
BiaBia
Bia
 
Les Grossman's Pro Tips for Local SEO
Les Grossman's Pro Tips for Local SEOLes Grossman's Pro Tips for Local SEO
Les Grossman's Pro Tips for Local SEO
 
PrivateWave - sales presentation_en
PrivateWave - sales presentation_enPrivateWave - sales presentation_en
PrivateWave - sales presentation_en
 
Econ214 macroeconomics chapter 19
Econ214 macroeconomics chapter 19Econ214 macroeconomics chapter 19
Econ214 macroeconomics chapter 19
 
Symbiosis international university
Symbiosis international universitySymbiosis international university
Symbiosis international university
 

Similar to SpringOne 2016 報告 Reactive APIの設計・実装・使用

Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
Kota Mizushima
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
Shumpei Shiraishi
 
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
Takashi Sogabe
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
infinite_loop
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題
Kota Mizushima
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
David Buck
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
Yuta Shimakawa
 
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive ProgrammingScalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive Programming
Tomoharu ASAMI
 
serverless openstack 101
serverless openstack 101serverless openstack 101
serverless openstack 101
Naoto Gohko
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
Takahisa Iwamoto
 
TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介
Takeo Imai
 
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介Shintaro Hosoai
 
OpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR OpsOpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR Ops
NTT Communications Technology Development
 
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)irix_jp
 
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
Rescale Japan株式会社
 
R超入門機械学習をはじめよう
R超入門機械学習をはじめようR超入門機械学習をはじめよう
R超入門機械学習をはじめよう
幹雄 小川
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
Akira Tanaka
 
今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門
VirtualTech Japan Inc./Begi.net Inc.
 

Similar to SpringOne 2016 報告 Reactive APIの設計・実装・使用 (20)

Scalaでのプログラム開発
Scalaでのプログラム開発Scalaでのプログラム開発
Scalaでのプログラム開発
 
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶjQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
jQueryの先に行こう!最先端のWeb開発トレンドを学ぶ
 
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
アプリケーションエンジニアのためのクラウドインフラ再入門 (2/3)
 
ゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せますゲームのインフラをAwsで実戦tips全て見せます
ゲームのインフラをAwsで実戦tips全て見せます
 
Scalaの現状と課題
Scalaの現状と課題Scalaの現状と課題
Scalaの現状と課題
 
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
Lambda: A Peek Under The Hood [Java Day Tokyo 2015 6-3]
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
Scalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive ProgrammingScalaz-StreamによるFunctional Reactive Programming
Scalaz-StreamによるFunctional Reactive Programming
 
serverless openstack 101
serverless openstack 101serverless openstack 101
serverless openstack 101
 
Terraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as CodeTerraformで始めるInfrastructure as Code
Terraformで始めるInfrastructure as Code
 
TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介TVMの次期グラフIR Relayの紹介
TVMの次期グラフIR Relayの紹介
 
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
テキスト型Domain Specific Language (DSL) 開発フレームワークXtext の紹介
 
OpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR OpsOpenStack Summit Vancouver YVR Ops
OpenStack Summit Vancouver YVR Ops
 
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
Interop2014 - OpenStackの概要と最新技術動向(Icehouse)
 
Lithium Labo #1
Lithium Labo #1Lithium Labo #1
Lithium Labo #1
 
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
GTC Japan 2016 Rescaleセッション資料「クラウドHPC ではじめるDeep Learning」- Oct/5/2016 at GTC ...
 
R超入門機械学習をはじめよう
R超入門機械学習をはじめようR超入門機械学習をはじめよう
R超入門機械学習をはじめよう
 
Eclipse xtext 紹介
Eclipse xtext 紹介Eclipse xtext 紹介
Eclipse xtext 紹介
 
今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門今さら聞けない人のためのDevOps超入門
今さら聞けない人のためのDevOps超入門
 

SpringOne 2016 報告 Reactive APIの設計・実装・使用

  • 1. Copyright©2016 NTT corp. All Rights Reserved. SpringOne Platform報告会 〜Reactive APIの設計・実装・使⽤〜 2016年9⽉3⽇ 岩塚 卓弥 NTT ソフトウェアイノベーションセンタ
  • 2. 2Copyright©2016 NTT corp. All Rights Reserved. • 名前:岩塚 卓弥 • 所属:NTT ソフトウェアイノベーションセンタ • NTTの研究所のうちソフトウェアを専⾨に扱う • ⾃部署ではソフトウェア⼯学を研究 • Springベースのグループ共通フレームワークの整備を担当 • SpringOneには⼆年連続での参加 ⾃⼰紹介
  • 3. 3Copyright©2016 NTT corp. All Rights Reserved. • Designing, Implementing, and Using Reactive APIs • Ben Hale - Cloud Foundry Java Experience Lead • Paul Harris - Engineer of Cloud Foundry Java Client • Stephane Maldini - Project Reactor Lead • スライドは既に公開済み • http://www.slideshare.net/SpringCentral/designing- implementing-and-using-reactive-apis 今⽇の元ネタ このセッションの特徴 実⽤経験に基づいたReactive APIの設計,実装,使⽤法を紹介 • https://github.com/cloudfoundry/cf-java-client Reactorを使った活きたコード例が豊富! 具体的にどんなコードを書いていくのか知りたい⼈にオススメ!
  • 4. 4Copyright©2016 NTT corp. All Rights Reserved. • Reactive APIの戻り値 • Functional Style の推奨 • 条件分岐 • テスト⾟い問題 アウトライン
  • 5. 5Copyright©2016 NTT corp. All Rights Reserved. • Reactive APIの戻り値 • Functional Style の推奨 • 条件分岐 • テスト⾟い問題 アウトライン
  • 6. 6Copyright©2016 NTT corp. All Rights Reserved. • Mono または Flux • Mono<T> : ⾼々1つのTを返す • Flux<T> : 0以上の任意の個数のTを返す Ractive APIの戻り値 TはCollectionでも構わない e.g. Mono<List<String>>
  • 7. 7Copyright©2016 NTT corp. All Rights Reserved. • subscribeするまではただの「設計書」にすぎない • 作った設計書を戻り値として返してやる必要がある • Mono<Void>やFlux<Void>を返すのはOK 戻り値を void にしてはいけない
  • 8. 8Copyright©2016 NTT corp. All Rights Reserved. • Reactive APIの戻り値 • Functional Style の推奨 • 条件分岐 • テスト⾟い問題 アウトライン
  • 9. 9Copyright©2016 NTT corp. All Rights Reserved. • 副作⽤がない,単純で⼩さなメソッドをつくる ✔ 動作を検証しやすい ✔ バグを作り込みにくい ✔ 再利⽤しやすい • ⼩さなメソッドを組み合わせて⼤きな処理を⾏う • 組み合わせの道具:⾼階関数 • map • filter • flatMap • concatMap • … Functional Styleの推奨 関数を引数や戻り値とする関数
  • 10. 10Copyright©2016 NTT corp. All Rights Reserved. おさらい – map / flatMap Mono<T> / Flux<T> における各要素に T から V への関数を適⽤し Mono<V> / Flux<V> を返す Mono<T> / Flux<T> における各要素に T から Publisher<R> への関数を適⽤し Flux<R>を返す
  • 11. 11Copyright©2016 NTT corp. All Rights Reserved. Functional Styleの例 再利⽤性の⾼いメソッド
  • 12. 12Copyright©2016 NTT corp. All Rights Reserved. • mapやflatMapを持つクラスは他にもある • StreamやOptionalなど • これは偶然ではなく,抽象化すると同じ形になっていることに気づく • map : F<T>に,T→Vの関数を適⽤して,F<V>を返す • flatMap : M<T>に,T→M<R>の関数を適⽤して,M<R>を返す 余談:Mono / Flux はMonad? Functor Monad 条件: ・以下の関数を持つ ・fmap : (T → V) → F<T> → F<V> ・Mono / Flux それぞれのmapが fmapに該当する ・Functor則を満たす(略) 条件: ・以下の関数を持つ ・bind : M<T> → (T → M<R>) → M<R> ・unit : T → M<T> ・Mono の then, Flux の flatMap / concatMap がbindに該当する ・Mono / Flux それぞれの just が unitに該当する ・Monad則を満たす(略)
  • 13. 13Copyright©2016 NTT corp. All Rights Reserved. メソッド参照による組み⽴て ⾼階関数にメソッド参照を渡して繋いでいく 複数引数をとるメソッドには Tuple と補助関数を利⽤
  • 14. 14Copyright©2016 NTT corp. All Rights Reserved. • 順序付けられた値の組 • e.g. (“Text”, 12), (“abc”, “def”, 0.3) etc. • メンバ名のない構造体のようなイメージ • 新たに型をつくるまでもないが,値を組にしたいときに有⽤ • 複数の値を返す関数の作成など • Reactorには2〜8個組を作るためのTuple型が⽤意さ れている • Tuple2<T1, T2>, Tuple3<T1, T2, T3>, … • ちなみに Scala には Tuple22 まであったりする • 前スライドの補助関数を再確認 • 2引数の関数から,2つ組のタプルを引数に取る関数に変換 Tuple
  • 15. 15Copyright©2016 NTT corp. All Rights Reserved. • 仮引数を使わずに関数を定義していくコーディングスタ イル • Haskell由来の⽤語 • https://wiki.haskell.org/Pointfree • 定義が簡潔になり,可読性が上がる (やりすぎると逆効果…) • f x = x + 1 • f = (+ 1) • Reactive APIを使⽤する際におすすめらしい • データではなく関数中⼼に考える上での助けになるとのこと • おそらく本来の意味とは異なった意味で使われていたが… Pointfree Style の推奨 Point Pointfree
  • 16. 16Copyright©2016 NTT corp. All Rights Reserved. Point Free Style とされていた例
  • 17. 17Copyright©2016 NTT corp. All Rights Reserved. • Reactive APIの戻り値 • Functional Style の推奨 • 条件分岐 • テスト⾟い問題 アウトライン
  • 18. 18Copyright©2016 NTT corp. All Rights Reserved. • Mono / Flux に値ではなくエラーが流れる場合もある • エラーを扱う⽅法が⾊々⽤意されている • doOnError • mapError • otherwise • … エラーによる条件分岐
  • 19. 19Copyright©2016 NTT corp. All Rights Reserved. エラーによる条件分岐の例 発⽣したエラーを捨てて別のレスポンスを返却
  • 20. 20Copyright©2016 NTT corp. All Rights Reserved. • Mono / Flux に何も値が流れずにCompleteする場合 もある • Emptyの場合を扱う⽅法が⽤意されている • defaultWithEmpty • otherwiseIfEmpty / switchIfEmpty • repeatWhenEmpty Emptyによる条件分岐
  • 21. 21Copyright©2016 NTT corp. All Rights Reserved. Emptyによる条件分岐の例 getPrivateDomanId, getSharedDomainIdの 両⽅が Empty の場合にエラーを投げる
  • 22. 22Copyright©2016 NTT corp. All Rights Reserved. • エラーでも Empty でもなく単に値で分岐したい場合も ある • if⽂を使って命令的に書けば良い • Mono / Flux のメソッドで頑張っても良いが,直感的に理解し 難くなる可能性が⾼い 値による条件分岐
  • 23. 23Copyright©2016 NTT corp. All Rights Reserved. 値による条件分岐の例 - Imperative
  • 24. 24Copyright©2016 NTT corp. All Rights Reserved. 値による条件分岐の例
  • 25. 25Copyright©2016 NTT corp. All Rights Reserved. • Reactive APIの戻り値 • Functional Style の推奨 • 条件分岐 • テスト⾟い問題 アウトライン
  • 26. 26Copyright©2016 NTT corp. All Rights Reserved. テスト⾟い問題 • もちろんテストはRedに…? • ならない! • ⾮同期の罠 メインスレッド ⾮同期スレッド この仕事頼む! 任せろ! 任務完了… ちょ待てよ
  • 27. 27Copyright©2016 NTT corp. All Rights Reserved. CountDownLatch • 他のスレッドの終了を待つための仕組み • Reactor特有のクラスではない • java.util.concurrent.CountDownLatch メインスレッド ⾮同期スレッド CountDownLatchを1にセット 任せろ! この仕事頼む! CountDownLatchが 0になるまで待つよ CountDownLatchを カウントダウンするよ 終わった! 完了!
  • 28. 28Copyright©2016 NTT corp. All Rights Reserved. 同期による問題解決 CountDownLatchを使って,⾮同期スレッドの処理が済むのを待つ すべてのテストにブロックの処理書くのは⾟すぎる…
  • 29. 29Copyright©2016 NTT corp. All Rights Reserved. TestSubscriber 同期させるためのコードを⾃分で書く必要がない
  • 30. 30Copyright©2016 NTT corp. All Rights Reserved. • 設計変更のために3.0.0.RELEASEから除かれた模様 • Re-evaluate TestSubscriber API • https://github.com/reactor/reactor-core/issues/135 • Cloud Foundry Java Clientでは独⾃に実装したものを使⽤ Reactor では依然準備中…
  • 31. 31Copyright©2016 NTT corp. All Rights Reserved. • Reactive APIの戻り値 • 必ず Mono か Fluxを返そう • Functional Style の推奨 • ⼤きな処理は⼩さな関数を組み合わせて作る • 条件分岐 • エラーやEmptyを特別扱いするためのメソッドがある • if⽂を使っても問題ない • テスト⾟い問題 • TestSubscriber待機…? まとめ
  • 32. 32Copyright©2016 NTT corp. All Rights Reserved. • Designing, Implementing, and Using Reactive APIs • http://www.slideshare.net/SpringCentral/designing- implementing-and-using-reactive-apis • Project Reactor リファレンス • https://projectreactor.io/core/docs/api/ • Cloud Foundry Java Client • https://github.com/cloudfoundry/cf-java-client/ 参考⽂献