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
モジュラモノリスのモジュール間通信の話
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Ryo Tsukahara
September 11, 2023
3.7k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
モジュラモノリスのモジュール間通信の話
Ryo Tsukahara
September 11, 2023
More Decks by Ryo Tsukahara
See All by Ryo Tsukahara
マイクロサービス・モジュラモノリス化によるシステム負債の解消プロジェクト
trrrrrys
0
790
Featured
See All Featured
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.7k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Writing Fast Ruby
sferik
630
63k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
Unsuck your backbone
ammeep
672
58k
Paper Plane
katiecoart
PRO
1
51k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
The Spectacular Lies of Maps
axbom
PRO
1
790
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
840
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Transcript
© DMM.com モジュラモノリスのモジュール間通信の話
© DMM.com 自己紹介 2 塚原 諒 2022/04中途でDMM.com入社 所属: オンラインサロン開発部 アーキテクトチーム
Twitter: @trrrrrys GitHub: trrrrrys
© DMM.com 話すこと 3 • リポジトリ構成 • モジュール間通信方法を選定した話
© DMM.com 4 リポジトリ構成
© DMM.com リポジトリ構成 5 ./apps ├── account # 会員サービス ├──
payment # 決済サービス └── modular ├── bootstrap ├── cmd ├── config └── module └── salon # サロンモジュール 現状の組織だと、マイクロサービスに 合わせた組織にすることが難しいため 主要サービスのみマイクロサービス + モジュラモノリスとして運用。 事業状況や組織状況に合わせて、モ ジュラモノリスから、マイクロサービス に切り出す。 構成のPros/Consは一般的なモノレポ のものとほぼ同じ。
© DMM.com 6 モジュール間通信方法を選定した話
© DMM.com モジュール間通信方法を選定した話 7 以下の2つの呼び出し方法を検討した。 • モジュールを直接呼び出す • API経由で呼び出す メッセージを利用した非同期呼び出しは対象外。
© DMM.com ①モジュールを直接呼び出す 8 モジュールの中で、呼び出したいモジュールの公開用のIFを利用し呼び出す。 実装例(gRPC)
© DMM.com モジュール直接呼び出しのメリット/デメリット 9 メリット • ネットワークを経由しないため呼び出しが高速 • (RESTの場合) 関数を呼び出せるため型情報を利用できる
デメリット • interceptor / middleware を挟むのが難しい • モジュールの結合度が上がる ◦ (gRPCの場合は、Server用のIFを利用することでモジュール間の依存 を減らせる) • マイクロサービスへの切り出しが大変
© DMM.com API経由で呼び出す 10 gRPC/REST API を利用してモジュールを呼び出す。 実装例(gRPC)
© DMM.com API呼び出しのメリット/デメリット 11 メリット • モジュール間のコード上の依存がない • モジュール間の通信にinterceptor /
middlewareを利用できる デメリット • ループバックを行うため若干のオーバーヘッドが発生 ◦ gRPCの場合はシリアライズ/デシリアライズのコストも発生
© DMM.com 検証 12 以下サンプルを用いて検証。 • API呼び出し https://github.com/trrrrrys/modular-monolith-example • モジュール直接呼び出し
https://github.com/trrrrrys/modular-monolith-example/tree/method-call
© DMM.com 検証条件 13 • gRPCを利用 • acount, product, payment,
orderという4つのモジュールを用意し以下ユー スケースを想定 ◦ orderモジュールに product_id を渡して購入処理 ◦ orderモジュールはproductモジュールに在庫問い合わせ & 在庫消費 ◦ orderモジュールはpaymentに支払い実行 ◦ orderモジュールはアカウントサービスから住所を取得 ◦ orderモジュールは購入情報保存をする • interceptorとacount, product, pacymentモジュールのメソッドは 20 ms の 仮想の処理を実行
© DMM.com 検証条件(シーケンス) 14
© DMM.com メソッド呼び出しのトレース/Duration (100req/min) 15 OrderItemにかかった時間は 95パーセンタイルで 約110ms
© DMM.com API呼び出しのトレース/Duration (100req/min) 16 OrderItemにかかった時間は 95パーセンタイルで 約200ms
© DMM.com 検証結果 17 • Interceptor の回数分処理時間が増える(当たり前) ◦ モジュール直接呼び出しとAPI呼び出しではInterceptorの処理内容も 変わるのでそこを考慮すると結果も変わってくる
• ループバックすることによるオーバーヘッドは 2~3ms程度 ◦ 実行環境によって差異はある
© DMM.com どちらを利用することにしたか 18 • ②の API呼び出しを利用 • 理由としては ◦
マイクロサービスへの切り出しを視野に入れているため疎結合な方が 良い ◦ 内部のサービス間通信には内部用の認証情報を用いているため、 Interceptorが利用できないのが辛い ◦ ネットワークのオーバーヘッドが許容レベル • モノリスの代用としてのモジュラモノリスであれば①も良い
© DMM.com まとめ 19 • マイクロサービスへの分割も見据えてgRPC経由でモジュールの通信を行っ ている • gRPCだとモジュラモノリスの実装が楽
© DMM ご静聴ありがとうございました 20