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.8k
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
810
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
55
8.3k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
260
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
3k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
170
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.9k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
210
Optimising Largest Contentful Paint
csswizardry
37
3.9k
Mind Mapping
helmedeiros
PRO
1
320
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Designing for Performance
lara
611
70k
Utilizing Notion as your number one productivity tool
mfonobong
4
550
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