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
3.9k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RxJava + Vert.x + jOOλ で Microservice 的な何かを作ってみた
2016年2月25日に行われた、Rx Ja Night 2016 #1での発表資料です。
Hideyuki Takeuchi
February 25, 2016
More Decks by Hideyuki Takeuchi
See All by Hideyuki Takeuchi
Ktorで認証付きMCPサーバーを作ってみる
chimerast
0
200
Exposed 応用編 〜内部実装 と 魔拡張〜
chimerast
3
2.2k
Delegatesと拡張関数・拡張プロパティその合わせ技
chimerast
0
820
Kotlin Coroutines と Ktor HTTP Client で作るスケールするタスク実行
chimerast
1
2.1k
UZABASE創業期から10年いるエンジニアから見た「BtoB SaaSのUI/UXってなんだろう?」
chimerast
1
970
暗号通貨の鍵を安全に管理するアーキテクチャを作ってみようとしている話
chimerast
0
470
WhitestormJSを触ってみた
chimerast
0
560
この素晴らしい Vue.js に祝福を!
chimerast
16
11k
RxJava + Vert.x + jOOλ で Microservice的な何かを作ってみた
chimerast
0
2.9k
Other Decks in Programming
See All in Programming
Hono + Inertia + React で LP を構築した話
oukayuka
2
170
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
210
メールのエイリアス機能を履き違えない
isshinfunada
0
250
Cloudflare is Agents
chimame
0
180
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
Introducing Stack Pull Request in GitHub
kkamegawa
0
100
FastAPI の並行処理モデルを完全に理解する
hoto17296
8
3k
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.8k
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
260
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
210
go-spidermonkeyでAIエージェントのCode Modeを実装する
syumai
2
1.2k
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.2k
Featured
See All Featured
エンジニアに許された特別な時間の終わり
watany
108
250k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
450
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
280
SEO for Brand Visibility & Recognition
aleyda
0
4.7k
Claude Code のすすめ
schroneko
67
230k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
390
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
Agile that works and the tools we love
rasmusluckow
331
22k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
The Cult of Friendly URLs
andyhume
79
7k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
480
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Ͱ σʔλՄࢹԽʹڵຯ͕͋ΔΤϯδχΞΛ ืू͍ͯ͠·͢ • ڵຯ͕͋Δํੋඇ͓͕͚Λɻ͘͘ձࢀՃͰɻ
ఏ ڙ