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
From π to Pie charts
rasagy
0
240
Building Adaptive Systems
keathley
44
3.1k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
390
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
400
We Have a Design System, Now What?
morganepeng
55
8.2k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
520
Measuring & Analyzing Core Web Vitals
bluesmoon
9
930
Deep Space Network (abreviated)
tonyrice
0
240
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
430
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
160
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
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