Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
RxJava + Vert.x + jOOλ で Microservice 的な何かを作ってみた
Search
Hideyuki Takeuchi
February 25, 2016
Programming
1
3.7k
RxJava + Vert.x + jOOλ で Microservice 的な何かを作ってみた
2016年2月25日に行われた、Rx Ja Night 2016 #1での発表資料です。
Hideyuki Takeuchi
February 25, 2016
Tweet
Share
More Decks by Hideyuki Takeuchi
See All by Hideyuki Takeuchi
Exposed 応用編 〜内部実装 と 魔拡張〜
chimerast
3
1.8k
Delegatesと拡張関数・拡張プロパティその合わせ技
chimerast
0
710
Kotlin Coroutines と Ktor HTTP Client で作るスケールするタスク実行
chimerast
1
1.8k
UZABASE創業期から10年いるエンジニアから見た「BtoB SaaSのUI/UXってなんだろう?」
chimerast
1
800
暗号通貨の鍵を安全に管理するアーキテクチャを作ってみようとしている話
chimerast
0
390
WhitestormJSを触ってみた
chimerast
0
510
この素晴らしい Vue.js に祝福を!
chimerast
16
11k
RxJava + Vert.x + jOOλ で Microservice的な何かを作ってみた
chimerast
0
2.7k
40億レコード以上のSPEEDA大規模データを超高速に表示するElasticsearch活用法
chimerast
1
3.9k
Other Decks in Programming
See All in Programming
コードを読んで理解するko build
bells17
1
110
[JAWS DAYS 2025] 最近の DB の競合解決の仕組みが分かった気になってみた
maroon1st
0
160
ML.NETで始める機械学習
ymd65536
0
240
SwiftUI Viewの責務分離
elmetal
PRO
2
280
GoとPHPのインターフェイスの違い
shimabox
2
210
Kotlinの開発でも AIをいい感じに使いたい / Making the Most of AI in Kotlin Development
kohii00
5
1.8k
Drawing Heighway’s Dragon- Recursive Function Rewrite- From Imperative Style in Pascal 64 To Functional Style in Scala 3
philipschwarz
PRO
0
150
自力でTTSモデルを作った話
zgock999
0
120
Ça bouge du côté des animations CSS !
goetter
2
160
良いコードレビューとは
danimal141
9
5.8k
楽しく向き合う例外対応
okutsu
0
720
Honoのおもしろいミドルウェアをみてみよう
yusukebe
1
240
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.2k
Side Projects
sachag
452
42k
Gamification - CAS2011
davidbonilla
80
5.2k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
650
The Language of Interfaces
destraynor
156
24k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
13
1k
Java REST API Framework Comparison - PWX 2021
mraible
29
8.4k
The Invisible Side of Design
smashingmag
299
50k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Optimizing for Happiness
mojombo
377
70k
For a Future-Friendly Web
brad_frost
176
9.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
Transcript
RxJava + Vert.x + jOOλ Ͱ MicroserviceతͳԿ͔Λ ࡞ͬͯΈͨ ͚ͨ͏ͪɹͻͰΏ͖
͚ͨ͏ͪɹͻͰΏ͖ @chimerast ৬ۀ: ӬԕͷNEET झຯ: ϓϩάϥϜͷຐվ (ϝλϓϩάϥϛϯάͱ͔)
ੈΛͿԾͷ࢟ גࣜձࣾϢʔβϕʔε νʔϑςΫϊϩδετ / Πϊϕʔγϣϯ୲ࣥߦһ ϥΠϑΠζςοΫגࣜձࣾ ཹֶCTO ΦʔϓϯιʔεϓϩδΣΫτ E2D3 νʔϑΠϊϕʔγϣϯΦϑΟαʔ(?)
ࠓͷ͓ Ͱͷࣄྫ
None
اۀɾۀքੳͷ ใϓϥοτϑΥʔϜ શੈք300ສࣾ / 550ۀքͷσʔλ ੈք࠷େڃͷM&Aσʔλ
ܦࡁใʹಛԽͨ͠ ιʔγϟϧܦࡁχϡʔε αʔϏε ܦࡁχϡʔεΛ ղઆίϝϯτ͖Ͱ ·ͱΊಡΈ 120ສϢʔβ͙Β͍
ຊ
RxJava + Vert.x + jOOλ Ͱ࡞ͬͨͷ νϟʔτඳը༻ͷRESTfulͳAPIαʔϏε • D3.jsͰνϟʔτΛඳը͢ΔͨΊʹ ձࣾใΒ౷ܭใΒ
ඞཁͳσʔλΛ͍ΖΜͳͱ͜Ζ͔Β ͔͖ूΊ͖ͯͯJSONͰฦ͢
͜ΕΛੜ͍ͨ͠ D3.jsͰඳը
αʔϏεߏ Companies API Stats API Media API Chart API ϒϥβ
MicroservicesతͳԿ͔
αʔϏεొਓ Companies API اۀ໊শࡒɾגՁใσʔλΛѻ͏αʔϏε Stats API ౷ܭ໊শ౷ܭใσʔλΛѻ͏αʔϏε Media API νϟʔτͷૉͱͳΔใΛѻ͏αʔϏε
νϟʔτͷૉ ʹ ͲͷاۀͷͲͷצఆՊͰνϟʔτΛ࡞Δ͔ͷࢦఆ
νϟʔτ༻JSON͕ฦΔ·ͰͷྲྀΕ 1. Media API ͔ΒνϟʔτͷૉΛऔಘ͢Δ 2. νϟʔτͷૉͰࢦఆ͞ΕͨσʔλΛ Companies API
Stats APIʹ ෳճϦΫΤετΛ͛ͯऔಘ͢Δ 3. ݁ՌΛ·ͱΊͯJSONʹͯ͠ϒϥβʹฦ͢
None
σʔλͷऔಘ Companies API Stats API Media API Chart API ϒϥβ
ᶃ ᶄ, ᶅ, ᶆ, ᶇ, ᶈ, …
AWS ΦϯϓϨϛε σʔληϯλʔͷน Companies API Stats API Media API Chart
API ϒϥβ
ࠓճͷ 1. σʔληϯλʔͷนΛӽ͑ͯ 2. ෳճಠཱͳϦΫΤετΛ͛ͯσʔλΛऔಘ 3. ͦΕΛ·ͱΊ্͛ͯJSONͱͯ͠ฦ͢
ࠓճͷબ
Vert.x + Vert.x-Web • ϊϯϒϩοΩϯάI/OͳߴϨϕϧϑϨʔϜϫʔΫ • γϯάϧεϨουͰେྔͷίωΫγϣϯΛ͚͞Δ • શ͕ͯίʔϧόοΫͰ݁Ռ͕ฦΔඇಉظAPI •
Node.js + Express తͳଘࡏ (ͱ͍͏͔·Μ·ͦΕ) • ϚϧνεϨουͰಈ͘ Verticleͱ͍͏֓೦ɺEventBusͱ͍͏֓೦
Vert.x-Webͷίʔυͷงғؾ /helloΛHTTP GET͢Δͱ"Hello World!!!"ͱ͍͏ จࣈྻ͕ฦΔ router.get("/hello").handler(routingContext -> { routingContext.response().end("Hello world!!!");
});
ͳͥVert.xΛબ͔ͨ͠ʁ • ̍ϦΫΤετͰɺόοΫΤϯυͷAPIʹෳճ ಠཱͨ͠ϦΫΤετΛ͛Δඞཁ͕͋ͬͨ • ϒϩοΩϯάI/OͰΔͱ ฒྻԽͯ͠εϨου͕ര૿͔ ྻԽͯ͠Ϩεϙϯε͕ܹ͘ͳΔ͔
RxJava • ࠓճͷษڧձͷओ • ͨͿΜ୭͔͕ৄ͘͠આ໌ͯ͠ ͘Ε͍ͯΔͣ(رత؍ଌ) • ษڧ͠ʹ͜͜ʹདྷ·ͨ͠ʂ
ͳͥRxJavaΛબ͔ͨ͠ʁ • Vert.x ୯ମͩͱίʔϧόοΫࠈʹؕΔ • SQLͰτϥϯβΫγϣϯ͍ͭͭͷSelect&Updateͱ͔ ϚδͰࠈ • ҰʹෳͷHTTPϦΫΤετΛฒྻͰ͛ ͦΕΛΤϨΨϯτʹཧ͔ͨͬͨ͠
• ͿͬͪΌ͚PromiseతͳԿ͔͕ཉ͔ͬͨ͠
RxJavaΛΘͳ͔ͬͨ߹(Πϝʔδ) client.getConnection(result1 -> { SQLConnection connection = result1.result(); connection.setAutoCommit(false, result2
-> { connection.queryWithParams("SELECT ...", params3, result3 -> { connection.updateWithParams("UPDATE ...", params4, result4 -> { connection.commit(result5 -> { connection.close(result6 -> { successCallback(); }); }); }); }); }); }); ΤϥʔॲཧΛೖΕΔͱͬͱͻͲ͍͜ͱʹɻɻɻ
RxJavaΛͬͨ߹(Πϝʔδ) client.getConnectionObservable().flatMap(connection -> { return connection.setAutoCommitObservable(false) .flatMap(result -> connection.queryWithParamsObservable("SELECT ...",
params1)) .flatMap(result -> connection.updateWithParamsObservable("UPDATE ...", params2))) .flatMap(result -> connection.commitObservable()) .flatMap(result -> connection.closeObservable()); }); ΤϥʔॲཧsubscribeͰҰճॻ͚ͩ͘ʂ
Vert.x + Vert.x-Web + RxJava ≒ Node.js + Express +
Promise (bluebird)
ࠓճͷ։ൃͰΑͬͨؔ͘ • observable.map() • observable.flatMap() • Observable.zip() • observable.onErrorReturn()
observable.map() • ͋ΔϦΫΤετͷ݁ՌΛผͷܗʹม͢Δ observableA .map(responseA -> { .. responseAからresponseZを作る ..
return responseZ; });
observable.flatMap() • ͋ΔϦΫΤετͷ݁ՌΛͱʹ ผͷϦΫΤετΛ͛Δ࣌ʹ͏ observableA .flatMap(responseA -> { .. responseAからobervableBを構築する
.. return observableB; });
Observable.zip() • ෳͷಠཱͨ͠ϦΫΤετΛฒྻͰ ͛Δͱ͖ʹ͏ Observable.zip( observableA, observableB, (responseA, responseB) ->
{ .. responseAとresponseBでzipの返り値を作る .. });
observable.onErrorReturn() • 404Τϥʔͩͬͨ߹ʹޙଓͷॲཧΛ ଓߦ͍ͨ͠ͱ͖ʹ͏ observable .map(Optional::of) .onErrorReturn(e -> Optional.empty());
࣮ࡍͷྑ͋ͬͨ͘ίʔυ(งғؾ) observableA // Media APIからチャートの素を取得 .flatMap(responseA -> { .. responseAからobservableB,
C, D (企業B, C, D)を生成 .. return Observable.zip( observableB.map(Optional::of).onErrorReturn(e -> Optional.empty()), observableC.map(Optional::of).onErrorReturn(e -> Optional.empty()), observableD.map(Optional::of).onErrorReturn(e -> Optional.empty()), (optionalResponseB, optionalResponseC, optionalResponseD) -> { .. responseAとoptionalResponseB, C, DからresponseZを生成 .. return responseZ; // チャートのモデル }); });
jOOλ • Java8 SDKͰ͔Ώ͍ͱ͜Ζʹख͕ಧ͍͍ͯͳ͍෦Λ ิͯ͘͠ΕΔͪͬͪΌͳϥΠϒϥϦ • Observable.zip()ͷͨΊʹTuple͕ཉ͔͔ͬͨ͠Β ͬͨ • Stream͕ඍົʹΓͯͳ͍ͱ͜ΖΛิ͢ΔSeq
Seq.zipWithIndex()ͱ͔ͨ·ʹͬͨΓ͢Δ
Vert.x-Rx • Vert.xͷ֤ϞδϡʔϧΛRxJavaԽ͢ΔϞδϡʔϧ • ͨ·ʹ༻ҙ͞Ε͍ͯͳ͍ϝιου͕͋ΔͷͰࠔΔ • ͨͩͷwrapperͳͷͰ్த͔ΒVert.x-RxΛ͑Δ JDBCClient.createShared( // JDBCClientはRxのもの
new io.vertx.rxjava.core.Vertx(vertx), // vertxは非Rx config.getJsonObject("jdbc").getJsonObject(db), db);
Vert.x Rest client • https://github.com/hubrick/vertx-rest-client • όοΫΤϯυͷRESTͳAPIΛୟ͘ͷʹͬͨ • RxJavaʹରԠ͍͍͍ͯͯ͢͠ •
ϨεϙϯεΛJacksonͰσγϦΞϥΠζͨ͠T͕ɺ Ovservable<T>ͷܗͰऔಘͰ͖Δ
FAQ Q. ࠓServletͬͯΔΜ͚ͩͲɺRxJava͏ͱ όοΫΤϯυͷAPIʹฒྻͰϦΫΤετ͛ΒΕΔͷʁ A. RxJava୯ମͰͰ͖·ͤΜɻ ExecutorServiceͱFutureͰΓ͍ͬͯͩ͘͞ (εϨουফඅ͢Δ͚Ͳ)ɻ
·ͱΊ • Vert.xΛ͏ͱϊϯϒϩοΩϯάI/OͰ όοΫΤϯυͷAPIʹฒྻʹϦΫΤετΛ͛ΒΕΔΑ • RxJavaΛ͏ͱVert.xͷίʔϧόοΫࠈ͔Β ൈ͚ग़ͤΔΑ • jOOλ͋Δͱͪΐͬ͜ͱศརͳϥΠϒϥϦͩΑ
ײ • Vert.x + RxJava ͱͯ૬ੑ͕͍͍ɻແ͍ͱࢮ͵ • ฒྻɺฒྻɺฒྻ • Java8ʹରԠ͍ͯͯ͠ϥϜμ͍ࣜ·͘ΓͰؾ͍͍࣋ͪ
• όοΫΤϯυAPIΛ͍͡Ί͍ͯΔײ͕ग़ͯؾ͍͍࣋ͪ Զ·ͩ·͍͚ͩΔͧతͳ
ΤϯδχΞืू • גࣜձࣾϢʔβϕʔεɺגࣜձࣾχϡʔζϐοΫεͰ MicroservicesతͳԿ͔Λ࡞Γ͍ͨΤϯδχΞΛ ืू͍ͯ͠·͢ • ڵຯ͕͋Δํੋඇ͓͕͚ΛɻWantedly͔ΒͰɻ
ΤϯδχΞืू • ϥΠϑΠζςοΫגࣜձࣾͰ JavaͰDDDΛΓ͍ͨΤϯδχΞΛ ืू͍ͯ͠·͢ • ڵຯ͕͋Δํੋඇ͓͕͚ΛɻWantedly͔ΒͰɻ
ΤϯδχΞืू • ΦʔϓϯιʔεϓϩδΣΫτE2D3Ͱ σʔλՄࢹԽʹڵຯ͕͋ΔΤϯδχΞΛ ืू͍ͯ͠·͢ • ڵຯ͕͋Δํੋඇ͓͕͚Λɻ͘͘ձࢀՃͰɻ
ఏ ڙ