モジュラーモノリス

モノリスの内部をモジュールに分割し、マイクロサービスの利点を取り入れたアーキテクチャ

アーキテクチャ設計

モジュラーモノリスとは

モジュラーモノリスは、単一のデプロイ単位 (モノリス) の内部を明確なモジュール境界で分割し、マイクロサービスの利点 (疎結合、独立した開発) をモノリスの利点 (シンプルなデプロイ、トランザクション) と両立させるアーキテクチャである。

モノリス vs モジュラーモノリス vs マイクロサービス

モノリスとモジュラーモノリス vs マイクロサービスの違いを以下にまとめる。

観点モノリスモジュラーモノリスマイクロサービス
デプロイ1 つ1 つサービスごと
モジュール境界曖昧明確プロセス境界
通信関数呼び出し公開 API 経由ネットワーク
トランザクション容易容易分散トランザクション
運用の複雑さ低い低い高い

モジュールの設計

モジュールの設計を図で示す。

my-app/
├── modules/
│   ├── orders/
│   │   ├── api.ts        # 公開 API (他モジュールからのアクセス点)
│   │   ├── service.ts    # ビジネスロジック (内部)
│   │   └── repository.ts # データアクセス (内部)
│   ├── users/
│   │   ├── api.ts
│   │   ├── service.ts
│   │   └── repository.ts
│   └── payments/
│       ├── api.ts
│       ├── service.ts
│       └── repository.ts
└── shared/               # 共通の型、ユーティリティ

モジュール間の通信ルール

モジュール間の通信ルールのコード例を示す。

// ✅ 公開 API 経由でアクセス
import { getUserById } from '../users/api';

// ❌ 内部の実装に直接アクセス (禁止)
import { userRepository } from '../users/repository';

イベントによる疎結合

イベントによる疎結合のコード例を示す。

// orders モジュール: イベントを発行
eventBus.emit('order.created', { orderId: '123', userId: 'abc' });

// payments モジュール: イベントを購読
eventBus.on('order.created', async (event) => {
  await createPayment(event.orderId);
});
// モジュール間の直接依存がない

いつモジュラーモノリスを選ぶか

いつモジュラーモノリスを選ぶかの判断基準を以下にまとめる。

ケース推奨
新規プロジェクトモジュラーモノリスから始める
チーム 1〜3 人モジュラーモノリス
ドメイン境界が不明確モジュラーモノリス (後で分割)
チーム 10 人以上、独立デプロイが必要マイクロサービス

モジュラーモノリスについては関連書籍でも詳しく扱われている。

この記事は役に立ちましたか?

関連用語

関連する記事