Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

モジュラモノリス(Modular Monolith)

単一のデプロイ単位(モノリス)を維持しながら、内部を疎結合なモジュールに明確に分割するアーキテクチャスタイル。 マイクロサービス ほどの運用コストをかけずに、モノリスが陥りがちな 「密結合の塊(Big Ball of Mud)」を避けることを狙う。

構造

モジュールの境界は、DDDの境界づけられたコンテキスト に 沿って引かれることが多い。各モジュールは独立したパッケージ(ディレクトリ)として構成され、モジュール間の呼び出しは 公開されたインターフェース経由に限定し、内部実装への直接アクセスを禁止する。

src/
├── ordering/          # 注文モジュール
│   ├── domain/
│   ├── application/
│   └── public_api.py  # 他モジュールに公開するインターフェース
├── inventory/          # 在庫モジュール
│   ├── domain/
│   ├── application/
│   └── public_api.py
└── shared_kernel/       # 共有カーネル(最小限に留める)

「垂直スライス・アーキテクチャ(Vertical Slice Architecture)」も近い発想で、レイヤー(技術的関心事)ではなく 機能・ユースケース単位でコードをまとめる編成方法として語られることが多い。

マイクロサービスとの比較

モジュラモノリスマイクロサービス
デプロイ単位1つサービスごと
モジュール間通信プロセス内呼び出し(速い、トランザクションを跨ぎやすい)ネットワーク越し(Saga 等が必要)
運用コスト低い(単一デプロイ・単一DB)高い(分散システムの複雑さ、観測性投資が必須)
境界の緩みやすさモジュール間の呼び出しがコンパイラでは強制しにくく、規律が必要プロセス境界が物理的に強制する
チームの独立性デプロイは共有されるサービスごとに独立してデプロイ可能

多くのプロジェクトにとって、最初からマイクロサービスに分割するよりも、モジュラモノリスとして境界を明確にしておき、 実際に必要になった時点で特定のモジュールだけをサービスとして切り出す方が、リスクとコストのバランスが良いことが多い。