モジュラモノリス徹底解剖 〜実践者から学ぶ Lunch LT〜 に行ってきた #モジュラモノリス_findy

モジュラモノリス徹底解剖 〜実践者から学ぶ Lunch LT〜 に参加しました。オンライン参加。簡単に所感をまとめます。

findy.connpass.com

所感

モジュラーモノリス検討中ですっていうひとが思ってたより多かった気がする。Go の Workspace mode はモジュラーモノリスを実現しやすい仕組みなんだろうか。言語レベルでそういうのサポートしているのよさそう。

モジュールの依存関係はコンテキストマップを踏襲する。あと、DB を分割しておくとマイクロサービスにも移行しやすい。なるほど。

マイクロサービスが負債になるっていうのは心に留めておきたい😇

以下、メモから抜粋。

非モジュラーモノリスからモジュラーモノリスへのステップ

  • チーム分割しても生産性を維持したい
  • 分散トランザクション
  • モジュラーモノリス構成
    • モジュールごとにディレクトリ切る
    • モジュール API 公開
    • 少しずつモジュール化する
  • BFF
  • モジュール間は循環依存しないように
  • モジュール間の RDB 分離
    • 外部キー張ってたりするので難しい
  • モジュール間のトランザクション
    • 基本的にはないように
    • 仕様見直し
  • モジュール粒度
    • 最初はなるべく小さく
    • 小さいモジュールをまとめてモジュール化

RDRAとDDDでGoのモジュラーモノリスアプリを設計してみた話

  • RDRA
  • 戦略的DDD
  • コンテキストマップごとの設計資料
  • Workspace mode (Go)
    • モジュール間の依存解決
  • コンテキストマップと同じ粒度で Go Module を作成する
  • マイクロサービス
  • 新規なのでDB分割はやりやすかった

TypeScript・モジュラーモノリスによる型安全なWebサービス開発

  • 複雑なサービスをシンプルなモジュールを組み合わせて作り上げる
  • 垂直分割=ドメインごとに分割
  • 水平分割=レイヤごとに分割
  • コアロジックを外に抽出
    • 凝集度が高い
    • FE/BEにロジックが分散しないように
  • Turborepo
  • 関数を export する
    • モジュール間は関数呼び出し
  • ドメインロジックを書くべきところに書く
  • ビルド, Lint はパフォーマンスわるい
  • 初期構築の難易度が高い
  • モノリポと相性いい

マイクロサービスではなくモジュラモノリスを採用した理由

  • 既存システムの技術負債
    • 新機能を別システムで作る
    • 既存システムを少しずつ移行
  • マイクロサービス
    • 整合性担保が難しい
    • マイクロサービスが負債になる
  • モノリス
    • 内部品質を保つには設計スキルが必要
    • 将来的にマイクロサービスに移行しづらい
  • モジュラーモノリス
  • モジュール境界はサービス境界に比べて戻しやすい
    • サービス境界を探る

モノリスとマイクロサービスを経てモジュラモノリスを導入した実践事例

tech.asoview.co.jp

eh-career.com

  • マイクロサービス
    • 認知負荷/コミュニケーションコスト軽減
    • 自立自走
  • モノリス
    • プロダクト全体にわたる変更
  • モジュール境界
    • RDRA
    • DDD (境界づけられたコンテキスト)
    • リソース/可用性などの非機能面の観点
    • 組織構造を意識しすぎると組織変更についていけなくなる
    • 組織構造が変わっても大丈夫なように
  • DB分割
  • トランザクション分割
  • ランタイムは同一
  • 可用性
    • 単一障害点
    • シングルバイナリ/マルチモード
  • アプリケーションレベルのリファクタリングが可