Upgrade to Pro — share decks privately, control downloads, hide ads and more …

モジュラモノリスのモジュール間通信の話

Ryo Tsukahara
September 11, 2023
2.8k

 モジュラモノリスのモジュール間通信の話

Ryo Tsukahara

September 11, 2023
Tweet

Transcript

  1. © DMM.com リポジトリ構成 5 ./apps ├── account # 会員サービス ├──

    payment # 決済サービス └── modular ├── bootstrap ├── cmd ├── config └── module └── salon # サロンモジュール 現状の組織だと、マイクロサービスに 合わせた組織にすることが難しいため 主要サービスのみマイクロサービス + モジュラモノリスとして運用。 事業状況や組織状況に合わせて、モ ジュラモノリスから、マイクロサービス に切り出す。 構成のPros/Consは一般的なモノレポ のものとほぼ同じ。
  2. © DMM.com モジュール直接呼び出しのメリット/デメリット 9 メリット • ネットワークを経由しないため呼び出しが高速 • (RESTの場合) 関数を呼び出せるため型情報を利用できる

    デメリット • interceptor / middleware を挟むのが難しい • モジュールの結合度が上がる ◦ (gRPCの場合は、Server用のIFを利用することでモジュール間の依存 を減らせる) • マイクロサービスへの切り出しが大変
  3. © DMM.com API呼び出しのメリット/デメリット 11 メリット • モジュール間のコード上の依存がない • モジュール間の通信にinterceptor /

    middlewareを利用できる デメリット • ループバックを行うため若干のオーバーヘッドが発生 ◦ gRPCの場合はシリアライズ/デシリアライズのコストも発生
  4. © DMM.com 検証条件 13 • gRPCを利用 • acount, product, payment,

    orderという4つのモジュールを用意し以下ユー スケースを想定 ◦ orderモジュールに product_id を渡して購入処理 ◦ orderモジュールはproductモジュールに在庫問い合わせ & 在庫消費 ◦ orderモジュールはpaymentに支払い実行 ◦ orderモジュールはアカウントサービスから住所を取得 ◦ orderモジュールは購入情報保存をする • interceptorとacount, product, pacymentモジュールのメソッドは 20 ms の 仮想の処理を実行
  5. © DMM.com どちらを利用することにしたか 18 • ②の API呼び出しを利用 • 理由としては ◦

    マイクロサービスへの切り出しを視野に入れているため疎結合な方が 良い ◦ 内部のサービス間通信には内部用の認証情報を用いているため、 Interceptorが利用できないのが辛い ◦ ネットワークのオーバーヘッドが許容レベル • モノリスの代用としてのモジュラモノリスであれば①も良い