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.7k
Delegatesと拡張関数・拡張プロパティその合わせ技
chimerast
0
690
Kotlin Coroutines と Ktor HTTP Client で作るスケールするタスク実行
chimerast
1
1.7k
UZABASE創業期から10年いるエンジニアから見た「BtoB SaaSのUI/UXってなんだろう?」
chimerast
1
750
暗号通貨の鍵を安全に管理するアーキテクチャを作ってみようとしている話
chimerast
0
370
WhitestormJSを触ってみた
chimerast
0
500
この素晴らしい Vue.js に祝福を!
chimerast
16
11k
RxJava + Vert.x + jOOλ で Microservice的な何かを作ってみた
chimerast
0
2.6k
40億レコード以上のSPEEDA大規模データを超高速に表示するElasticsearch活用法
chimerast
1
3.8k
Other Decks in Programming
See All in Programming
Micro Frontends Unmasked Opportunities, Challenges, Alternatives
manfredsteyer
PRO
0
110
カンファレンスの「アレ」Webでなんとかしませんか? / Conference “thing” Why don't you do something about it on the Web?
dero1to
1
110
TypeScriptでライブラリとの依存を限定的にする方法
tutinoko
3
710
Pinia Colada が実現するスマートな非同期処理
naokihaba
4
230
Functional Event Sourcing using Sekiban
tomohisa
0
110
as(型アサーション)を書く前にできること
marokanatani
10
2.7k
AI時代におけるSRE、 あるいはエンジニアの生存戦略
pyama86
6
1.2k
Click-free releases & the making of a CLI app
oheyadam
2
120
EMになってからチームの成果を最大化するために取り組んだこと/ Maximize team performance as EM
nashiusagi
0
100
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
260
TypeScript Graph でコードレビューの心理的障壁を乗り越える
ysk8hori
3
1.2k
Hotwire or React? ~アフタートーク・本編に含めなかった話~ / Hotwire or React? after talk
harunatsujita
1
120
Featured
See All Featured
Docker and Python
trallard
40
3.1k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
A better future with KSS
kneath
238
17k
Designing on Purpose - Digital PM Summit 2013
jponch
115
7k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Building Your Own Lightsaber
phodgson
103
6.1k
We Have a Design System, Now What?
morganepeng
50
7.2k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
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Ͱ σʔλՄࢹԽʹڵຯ͕͋ΔΤϯδχΞΛ ืू͍ͯ͠·͢ • ڵຯ͕͋Δํੋඇ͓͕͚Λɻ͘͘ձࢀՃͰɻ
ఏ ڙ