ひとことで言うと#
ソフトウェアの全体構造を決める設計の型。レイヤード、マイクロサービス、イベント駆動、モノリシックなど、代表的なパターンの特徴と適用場面を理解し、プロジェクトの要件に最適な構造を選ぶための知識体系。
押さえておきたい用語#
- モノリシック(Monolithic)
- アプリケーション全体を1つのデプロイ単位にまとめるアーキテクチャのこと。小〜中規模では最も開発効率が高い。
- マイクロサービス(Microservices)
- 機能ごとに独立したサービスに分割し、それぞれを個別にデプロイするアーキテクチャを指す。チームの自律性とスケーラビリティに優れる。
- レイヤードアーキテクチャ(Layered Architecture)
- プレゼンテーション→ビジネスロジック→データアクセスのように層(レイヤー)ごとに責務を分離する設計パターンのこと。最も一般的で理解しやすい。
- ADR(Architecture Decision Record)
- アーキテクチャの意思決定の背景・選択肢・理由を記録するドキュメントのこと。将来「なぜこの構造なのか」に答えるための記録。
- コンウェイの法則(Conway’s Law)
- 「組織のコミュニケーション構造がシステムの構造に反映される」という法則である。アーキテクチャ選定ではチーム構造も考慮が必要。
ソフトウェアアーキテクチャパターンの全体像#
こんな悩みに効く#
- 新しいプロジェクトで「どのアーキテクチャにすべきか」判断できない
- モノリスからマイクロサービスに移行すべきか迷っている
- アーキテクチャの選択理由をチームや経営層に説明できない
基本の使い方#
まず主要なアーキテクチャパターンを把握する。
- レイヤードアーキテクチャ: プレゼンテーション→ビジネスロジック→データアクセスの階層構造。最も一般的で理解しやすい
- マイクロサービス: 機能ごとに独立したサービスに分割。チームの自律性とスケーラビリティを重視
- イベント駆動アーキテクチャ: イベントの発行と購読でコンポーネントを疎結合に接続
- モノリシック: 単一のデプロイ単位にすべてを集約。小〜中規模では最も効率的
ポイント: 「最良のアーキテクチャ」は存在しない。要件とコンテキストに応じて最適解は変わる。
システムに求められる品質特性に基づいてパターンを絞り込む。
- スケーラビリティ重視: マイクロサービス、イベント駆動
- 開発速度重視: モノリシック、レイヤード
- 耐障害性重視: イベント駆動、マイクロサービス+サーキットブレーカー
- シンプルさ重視: モノリシック、レイヤード
ポイント: 品質特性はトレードオフの関係にある。すべてを同時に最適化することはできないので、優先順位を明確にする。
技術的な最適解だけでなく、チームの現実的な能力と組織構造も判断材料に入れる。
- チームが10人以下ならモノリシックの方が効率的な場合が多い
- コンウェイの法則: システム構造はチーム構造を反映する
- 運用力が十分でなければ、マイクロサービスは負担になる
ポイント: 技術的に正しいが組織に合わないアーキテクチャは失敗する。チームが運用できる範囲で選択する。
選定の意思決定プロセスを文書化する。
- コンテキスト: なぜこの判断が必要になったか
- 選択肢: 検討したパターンとそれぞれのPros/Cons
- 決定: 選んだパターンと理由
- 結果: 予想されるトレードオフ
ポイント: ADRを残すことで、将来「なぜこの構造なのか」という疑問に即座に答えられる。
具体例#
状況: 5人のエンジニアチームで新規SaaSプロダクトを立ち上げる。初期ユーザー数は少ないが、成長したらスケールさせたい。
検討:
| パターン | メリット | デメリット | 判定 |
|---|---|---|---|
| マイクロサービス | スケールしやすい | 5人には運用負荷が高すぎる | 却下 |
| イベント駆動 | 疎結合 | 初期の開発速度が落ちる | 時期尚早 |
| モジュラーモノリス | 速度とスケールの両立 | 規律が必要 | 採用 |
設計:
- ドメインごとにモジュールを分離(ユーザー管理、決済、通知など)
- モジュール間はインターフェース経由で通信(直接DB参照を禁止)
- 将来の分割ポイントをモジュール境界として設計しておく
結果: 開発速度を維持しつつ、1年後にトラフィックが増えた決済モジュールだけを独立サービスに切り出すことに成功。リリース頻度は週3回を維持。最初からマイクロサービスにしていたら、運用で疲弊していた。
リリース頻度週3回を維持したまま、1年後に決済モジュールだけを切り出すことに成功。最初からマイクロサービスにしていたら運用で疲弊していた。
状況: 従業員200名のEC企業。7年前に作ったRails製モノリスが巨大化し、デプロイに45分かかる。エンジニア40名が同一コードベースで作業しており、コンフリクトが頻発。1回のリリースで平均2.3件の障害が発生。
選定プロセス:
- 品質特性の優先: ①デプロイ速度 ②チーム自律性 ③耐障害性
- チーム: 5チーム×8名に分割済み。各チームが独立してリリースしたい
- コンウェイの法則を意識: チーム単位でサービスを分割
結果:
| 指標 | Before(モノリス) | After(マイクロサービス移行2年後) |
|---|---|---|
| デプロイ時間 | 45分 | 平均3分/サービス |
| リリース頻度 | 週1回 | チームあたり日2〜3回 |
| リリース起因障害 | 月9.2件 | 月1.8件 |
| 新機能リードタイム | 平均6週間 | 平均2週間 |
リリース起因障害、月9.2件→1.8件。新機能リードタイム6週→2週。40名以上の組織では、コンウェイの法則に沿ったサービス分割が効く。
状況: 人口30万人の地方自治体。防災情報配信システムを刷新する。地震・津波・豪雨の警報を住民にリアルタイム配信する必要があり、可用性99.99%(年間ダウンタイム約53分)が要件。
選定理由:
- 耐障害性が最優先: 1つのサービスが落ちても警報配信は止められない
- 非同期処理: メール・SMS・アプリ通知・防災無線を並列に発信する必要がある
- スパイク耐性: 平常時は秒間10リクエスト、災害時は秒間5,000リクエストに急増
設計:
- 警報受信 → メッセージキュー(Amazon SQS) → 各配信チャネルが独立に処理
- メール配信が遅延しても、SMS・アプリ通知は影響を受けない
- 配信失敗時は自動リトライ+Dead Letter Queue
結果: 初年度の可用性は99.97%(目標の99.99%にわずかに未達だが、前システムの99.2%から大幅改善)。豪雨警報時に秒間3,200リクエストが発生した際も、全チャネルで平均12秒以内に配信完了。
秒間3,200リクエストの豪雨警報時も、全チャネルで平均12秒以内に配信完了。「1つが壊れても他が動く」イベント駆動の疎結合設計が、人命に関わる場面で機能した。
やりがちな失敗パターン#
- 流行に乗ってマイクロサービスを選ぶ — 「みんなやっているから」でマイクロサービスを選ぶと、小さなチームが運用地獄に陥る。チーム規模と運用力を冷静に評価してから決める
- アーキテクチャを変更不可能なものと考える — 最初の選択が永久に続くわけではない。進化的アーキテクチャの考え方で、段階的に変更できる設計にする
- 非機能要件を後回しにする — 機能要件だけで選ぶと、本番で性能や可用性の問題が噴出する。品質特性を最初に定義してからパターンを選定する
- ADRを書かずに暗黙知で進める — 半年後に「なぜこの構造にしたのか」が誰もわからなくなる。選定理由を必ずADRとして記録し、チーム全体で共有する
まとめ#
ソフトウェアアーキテクチャパターンは 「銀の弾丸」 ではなく「道具箱」。プロジェクトの要件、チームの能力、組織構造を総合的に考慮して最適なパターンを選ぶ。迷ったらシンプルな方から始め、必要に応じて進化させていくのが、失敗しないアーキテクチャ選定の王道だ。