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.8k
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
2k
Delegatesと拡張関数・拡張プロパティその合わせ技
chimerast
0
770
Kotlin Coroutines と Ktor HTTP Client で作るスケールするタスク実行
chimerast
1
2k
UZABASE創業期から10年いるエンジニアから見た「BtoB SaaSのUI/UXってなんだろう?」
chimerast
1
870
暗号通貨の鍵を安全に管理するアーキテクチャを作ってみようとしている話
chimerast
0
420
WhitestormJSを触ってみた
chimerast
0
520
この素晴らしい Vue.js に祝福を!
chimerast
16
11k
RxJava + Vert.x + jOOλ で Microservice的な何かを作ってみた
chimerast
0
2.7k
40億レコード以上のSPEEDA大規模データを超高速に表示するElasticsearch活用法
chimerast
1
4k
Other Decks in Programming
See All in Programming
いま中途半端なSwift 6対応をするより、Default ActorやApproachable Concurrencyを有効にしてからでいいんじゃない?
yimajo
2
440
Server Side Kotlin Meetup vol.16: 内部動作を理解して ハイパフォーマンスなサーバサイド Kotlin アプリケーションを書こう
ternbusty
3
220
20251016_Rails News ~Rails 8.1の足音を聴く~
morimorihoge
2
570
なぜあの開発者はDevRelに伴走し続けるのか / Why Does That Developer Keep Running Alongside DevRel?
nrslib
3
410
XP, Testing and ninja testing ZOZ5
m_seki
3
750
テーブル定義書の構造化抽出して、生成AIでDWH分析を試してみた / devio2025tokyo
kasacchiful
0
210
What's new in Spring Modulith?
olivergierke
1
160
NixOS + Kubernetesで構築する自宅サーバーのすべて
ichi_h3
0
1.1k
AI Agent 時代的開發者生存指南
eddie
3
2k
釣り地図SNSにおける有料機能の実装
nokonoko1203
0
190
AI駆動で0→1をやって見えた光と伸びしろ
passion0102
1
530
ALL CODE BASE ARE BELONG TO STUDY
uzulla
25
6.4k
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.5k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Speed Design
sergeychernyshev
32
1.2k
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
The Power of CSS Pseudo Elements
geoffreycrofte
79
6k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.7k
The Straight Up "How To Draw Better" Workshop
denniskardys
238
140k
Site-Speed That Sticks
csswizardry
13
910
How STYLIGHT went responsive
nonsquared
100
5.8k
Building a Scalable Design System with Sketch
lauravandoore
463
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Ͱ σʔλՄࢹԽʹڵຯ͕͋ΔΤϯδχΞΛ ืू͍ͯ͠·͢ • ڵຯ͕͋Δํੋඇ͓͕͚Λɻ͘͘ձࢀՃͰɻ
ఏ ڙ