複数のサービス・プロセスにまたがるシステムをどう設計するかに関するパターン群。単一アプリケーション内部の構造は application/ を参照。
分散は最後の手段¶
分散システムは モジュラモノリス にはない複雑さを持ち込む:ネットワーク分断、 部分障害、結果整合性、デプロイの複雑化。アーキテクチャ特性 の観点では、 拡張性やチームの独立デプロイ性と引き換えに、シンプルさ・強い整合性・デバッグのしやすさを犠牲にする。
「マイクロサービス にすればスケールする」という理由だけで分散化するのではなく、 モジュラモノリスとして境界を明確にした上で、実際にチームや負荷特性がボトルネックになった箇所から段階的に 切り出すのが定石とされる。
分散化した場合に向き合うことになる主な論点:
| 論点 | 関連ページ |
|---|---|
| サービスをどう分割するか | マイクロサービス |
| サービス間の連携をどう疎結合にするか | イベント駆動アーキテクチャ |
| 読み書きの負荷特性が異なるモデルをどう分けるか | CQRS |
| 状態変化の履歴をどう扱うか | イベントソーシング |
| サービスをまたぐトランザクションをどう扱うか | Saga・分散トランザクション |
| クライアントとサービス群の間をどう仲介するか | API Gateway・BFF |