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
700
Kotlin Coroutines と Ktor HTTP Client で作るスケールするタスク実行
chimerast
1
1.8k
UZABASE創業期から10年いるエンジニアから見た「BtoB SaaSのUI/UXってなんだろう?」
chimerast
1
780
暗号通貨の鍵を安全に管理するアーキテクチャを作ってみようとしている話
chimerast
0
380
WhitestormJSを触ってみた
chimerast
0
510
この素晴らしい Vue.js に祝福を!
chimerast
16
11k
RxJava + Vert.x + jOOλ で Microservice的な何かを作ってみた
chimerast
0
2.6k
40億レコード以上のSPEEDA大規模データを超高速に表示するElasticsearch活用法
chimerast
1
3.9k
Other Decks in Programming
See All in Programming
ATDDで素早く安定した デリバリを実現しよう!
tonnsama
1
1.9k
Stackless и stackful? Корутины и асинхронность в Go
lamodatech
0
1.3k
AWS re:Invent 2024個人的まとめ
satoshi256kbyte
0
100
週次リリースを実現するための グローバルアプリ開発
tera_ny
1
1.2k
“あなた” の開発を支援する AI エージェント Bedrock Engineer / introducing-bedrock-engineer
gawa
4
390
Androidアプリの One Experience リリース
nein37
0
1.2k
はてなにおけるfujiwara-wareの活用やecspressoのCI/CD構成 / Fujiwara Tech Conference 2025
cohalz
3
2.8k
混沌とした例外処理とエラー監視に秩序をもたらす
morihirok
13
2.3k
Lookerは可視化だけじゃない。UIコンポーネントもあるんだ!
ymd65536
1
130
令和7年版 あなたが使ってよいフロントエンド機能とは
mugi_uno
10
5.2k
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
0
150
Асинхронность неизбежна: как мы проектировали сервис уведомлений
lamodatech
0
1.4k
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
335
57k
Visualization
eitanlees
146
15k
Bash Introduction
62gerente
610
210k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
365
25k
Product Roadmaps are Hard
iamctodd
PRO
50
11k
RailsConf 2023
tenderlove
29
970
KATA
mclloyd
29
14k
VelocityConf: Rendering Performance Case Studies
addyosmani
327
24k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
19
2.3k
Practical Orchestrator
shlominoach
186
10k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
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Ͱ σʔλՄࢹԽʹڵຯ͕͋ΔΤϯδχΞΛ ืू͍ͯ͠·͢ • ڵຯ͕͋Δํੋඇ͓͕͚Λɻ͘͘ձࢀՃͰɻ
ఏ ڙ