Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

513 views

Published on

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

  1. 1. A Lite Rx API for the JVM 井口 貝 @ SmartNews, Inc. SpringOne Platform 2016 報告会
  2. 2. 自己紹介 名前 井口 貝 (いのくち かい) @kainoque 所属   サーバサイドエンジニア @ SmartNews, Inc. ref: SmartNews, Inc. | Team http://about.smartnews.com/ja/team/
  3. 3. 自己紹介
  4. 4. 自己紹介
  5. 5. SmartNews のニュース配信システム構成
  6. 6. ・SpringOne 2016 のセッション報告を通じて、Reactive Streams の実装である Reactor を紹介  ・Reactor API の紹介  ・Spring 5 との関連性  ・注意点など はじめに
  7. 7. ・セッション概要 ・”Reactive” ・Reactive Streams ・Reactor ・Reactor and Spring 5 ・Reactor API Hands-on ・Notes もくじ
  8. 8. ・セッション概要 ・”Reactive” ・Reactive Streams ・Reactor ・Reactor and Spring 5 ・Reactor API Hands-on ・Notes もくじ
  9. 9. タイトル 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) セッション概要
  10. 10. ・セッション概要 ・”Reactive” ・Reactive Streams ・Reactor ・Reactor and Spring 5 ・Reactor API Hands-on ・Notes もくじ
  11. 11. “Reactive” 広義には、「non-blocking で event-driven なシステム」を形容する言葉 Reactive Manifesto にてその必要要件が定義されている ・Responsive (即応性) ・Resilent (耐障害性) ・Elastic (弾力性) ・Message-Driven (メッセージ駆動) ref: The Reactive Manifesto http://www.reactivemanifesto.org/
  12. 12. よりスケールし、安定的に動作し、キャパシティプランニングを容易にすることを標榜す る場合、システムの Reactive 化は一つの選択肢となる ユースケース ・BigData processsing ・外部サービスに依存する webapp ・データ生成側と利用側の処理速度に非対称性があるシステム ・大量のクライアントをさばく必要があるシステム “Reactive”
  13. 13. もくじ ・セッション概要 ・”Reactive” ・Reactive Streams ・Reactor ・Reactor and Spring 5 ・Reactor API Hands-on ・Notes
  14. 14. 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 Updates http://openjdk.java.net/jeps/266 ref: reactive-streams-jvm https://github.com/reactive-streams/reactive-streams-jvm
  15. 15. ・Publisher と Subscriber の間のコミュニケーション ・Subscriber が受け取るデータの個数を、自身でコントロール可能(backpressure) ・Publisher は Subscriber の要求数より多いデータを送らない ・Publisher は Subscriber から要求されるまでデータを送らない Reactive Streams
  16. 16. 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()
  17. 17. Reactive Streams Publisher 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()
  18. 18. Reactive Streams Subscriber 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()
  19. 19. public interface Subscription { void request(long n); void cancel(); } Reactive Streams Subscription Subscriber Publisher Subscription Subscriber Publisher Subscription subscribe(this) generate onSubscribe(s) s request(1) request something onNext(data) onComplete()
  20. 20. public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {} Reactive Streams Processor Component A Component C Component B Subscriber of A / Publisher of C Processor<T1, T2> T1 T2
  21. 21. Reactive Streams Subscriber Publisher Subscription Subscriber Publisher Subscription subscribe(this) generate onSubscribe(s) s request(1) request something onNext(data) onComplete()
  22. 22. ・Reactive Streams 自体は直接開発者に触られることを必ずしも想定していない ・通常は Reactive Streams を実装した Reactive API Library を使用する ・実装 Library ・RxJava 2.0 (JVM) ・Akka-Stream (JVM) ・Reactor 3.0 (JVM) ・RxJS (JavaScript) などなど Reactive Streams
  23. 23. ・セッション概要 ・”Reactive” ・Reactive Streams ・Reactor ・Reactor and Spring 5 ・Reactor API Hands-on ・Notes もくじ
  24. 24. Reactor Reactive Streams を実装した JVM 向け API ライブラリの一つ ・buffer, merge, concatenate, filter, map などの API を提供する ・RxJava の project lead である David Karnok や  Spring Framework の commiter が中心となって contribute している
  25. 25. 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
  26. 26. Reactor
  27. 27. Reactor ・API 紹介 ・Mono ・Flux ・Schedulers ・各型の比較 ・RxJava との相互運用
  28. 28. ・API 紹介 ・Mono ・Flux ・Schedulers ・各型の比較 ・RxJava との相互運用 Reactor
  29. 29. Reactor Mono ・1 個 (または 0 個) の値のみを emit する Publisher 実装 ・reactor.core.publisher.Mono
  30. 30. Mono Reactor
  31. 31. Mono Reactor
  32. 32. Flux ・複数の値を emit する Publisher 実装 ・reactor.core.publisher.Flux Reactor
  33. 33. Flux Reactor
  34. 34. Flux Reactor
  35. 35. Scheduler ・publish / subscribe を行うスレッドのスレッドプールの factory ・Schedulers.single(), parallel(), elastic() 等で生成 ・publish / subscribe は、デフォルトでは呼び出し側スレッドで行われる Reactor
  36. 36. Scheduler ・Slow-Publisher, Fast-Subscriber ・someFlux.subscribeOn(Schedulers.elastic()) Reactor
  37. 37. Scheduler ・Fast-Publisher, Slow-Subscriber ・someFlux.publishOn(Schedulers.elastic()) Reactor
  38. 38. Reactor ・API 紹介 ・Mono ・Flux ・Schedulers ・各型の比較 ・RxJava との相互運用
  39. 39. No value Single value Multiple Values Blocking void T Future<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
  40. 40. Reactor ・API 紹介 ・Mono ・Flux ・Schedulers ・各型の比較 ・RxJava との相互運用
  41. 41. 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
  42. 42. ・セッション概要 ・”Reactive” ・Reactive Streams ・Reactor ・Reactor and Spring 5 ・Reactor API Hands-on ・Notes もくじ
  43. 43. Reactor and Spring 5 Spring 5 における Reactive サポートの導入に際して、 Reactor Core がその基礎となっている ・例: ・Flux/Mono を受け取り、返却可能な Controller の導入 ・Flux/Mono を返却可能な HTTP Client 実装の導入 ref: Reactive Programming with Spring 5.0 M1 https://spring.io/blog/2016/07/28/reactive-programming-with-spring-5-0-m1
  44. 44. Controller Reactor and Spring 5
  45. 45. Reactive HTTP Client in org.springframework.web.client.reactive Reactor and Spring 5
  46. 46. Spring Initializr で手軽に試すことができる Dependencies から Reactive Web を選択 (Spring Boot のバージョンは 1.4.1 (SNAPSHOT)) Reactor and Spring 5 ref: SPRING INITIALIZR bootstrap your application now https://start.spring.io/
  47. 47. ・セッション概要 ・”Reactive” ・Reactive Streams ・Reactor ・Reactor and Spring 5 ・Reactor API Hands-on ・Notes もくじ
  48. 48. Reactor の各 API を理解するためのハンズオン Part 1 から 9 まで、各 API を利用した JUnit テストが書かれている それをグリーンにしながら進めていく Reactor API Hands-on ref: Lite Rx API Hands-on https://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 処理の変換
  49. 49. 例 Reactor API Hands-on
  50. 50. 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 処理の変換
  51. 51. Mono#just Reactor API Hands-on
  52. 52. Flux#fromIterable Reactor API Hands-on
  53. 53. 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 処理の変換
  54. 54. {Mono,Flux}#map Reactor API Hands-on
  55. 55. {Mono,Flux}#flatMap Reactor API Hands-on
  56. 56. 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 処理の変換
  57. 57. Flux#mergeWith Reactor API Hands-on
  58. 58. Flux#concatWith Reactor API Hands-on
  59. 59. 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 処理の変換
  60. 60. Reactor API Hands-on Flux#zip
  61. 61. Reactor API Hands-on Mono#first
  62. 62. Reactor API Hands-on flux#onErrorResumeWith
  63. 63. 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 処理の変換
  64. 64. Reactor API Hands-on Mono#block
  65. 65. Reactor API Hands-on Flux#defer
  66. 66. ・セッション概要 ・”Reactive” ・Reactive Streams ・Reactor ・Reactor and Spring 5 ・Reactor API Hands-on ・Notes もくじ
  67. 67. ・安定的な動作、予測可能なキャパシティと引き換えに、オーバーヘッドはある ・非同期処理特有の複雑さ、デバッグのしづらさはある Notes
  68. 68. Notes
  69. 69. Notes
  70. 70. おわりに ・”Reactive” なシステムを実現するための標準仕様としてReactive Streams が存在する ・Reactive なシステムを実現するライブラリとしてReactor という選択肢がある ・Non-blocking + backpressure を備えリソース効率性が高いReactive API Library ・Java 8 / Spring 5 と統合されている ・Mono / Flux により操作を行う ・依然として銀の弾丸ではない
  71. 71. http://about.smartnews.com/ja/careers/ We’re hiring!! Web Application / iOS / Android / SRE / Ad-tech / Machine-learning / NLP

×