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
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
800
Featured
See All Featured
Designing Experiences People Love
moore
143
24k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
650
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Building the Perfect Custom Keyboard
takai
2
810
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Evolving SEO for Evolving Search Engines
ryanjones
0
230
The browser strikes back
jonoalderson
0
1.4k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
750
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
180
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Accessibility Awareness
sabderemane
1
150
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