ソフトウェアアーキテクチャパターン

英語名 Software Architecture Patterns
読み方 ソフトウェア アーキテクチャ パターンズ
難易度
所要時間 学習に1〜2週間
提唱者 マーティン・ファウラー、マーク・リチャーズ他
目次

ひとことで言うと
#

ソフトウェアの全体構造を決める設計の型。レイヤード、マイクロサービス、イベント駆動、モノリシックなど、代表的なパターンの特徴と適用場面を理解し、プロジェクトの要件に最適な構造を選ぶための知識体系。

押さえておきたい用語
#

押さえておきたい用語
モノリシック(Monolithic)
アプリケーション全体を1つのデプロイ単位にまとめるアーキテクチャのこと。小〜中規模では最も開発効率が高い。
マイクロサービス(Microservices)
機能ごとに独立したサービスに分割し、それぞれを個別にデプロイするアーキテクチャを指す。チームの自律性とスケーラビリティに優れる。
レイヤードアーキテクチャ(Layered Architecture)
プレゼンテーション→ビジネスロジック→データアクセスのように(レイヤー)ごとに責務を分離する設計パターンのこと。最も一般的で理解しやすい。
ADR(Architecture Decision Record)
アーキテクチャの意思決定の背景・選択肢・理由を記録するドキュメントのこと。将来「なぜこの構造なのか」に答えるための記録。
コンウェイの法則(Conway’s Law)
「組織のコミュニケーション構造がシステムの構造に反映される」という法則である。アーキテクチャ選定ではチーム構造も考慮が必要。

ソフトウェアアーキテクチャパターンの全体像
#

主要アーキテクチャパターンの位置づけ:複雑さとスケーラビリティのトレードオフ
シンプル複雑スケーラビリティ →モノリシック1つのデプロイ単位小規模で最も効率的チーム10人以下に最適レイヤード層ごとに責務を分離最も一般的で理解しやすいモノリス内部の整理に最適イベント駆動非同期メッセージで疎結合耐障害性に優れるデバッグの難易度は高いマイクロサービス独立デプロイ・独立スケールチームの自律性が最大運用の複雑さも最大選定の判断基準品質特性(非機能要件)チーム規模・成熟度組織構造迷ったらシンプルな方からStart Simple, Evolve Gradually
アーキテクチャ選定の進め方フロー
1
パターン理解
主要パターンの特徴とトレードオフを把握
2
品質特性で絞込
スケーラビリティ・速度・耐障害性で優先順位
3
チーム適合性
チーム規模・成熟度・組織構造を考慮
ADRで記録
選定理由とトレードオフを文書化

こんな悩みに効く
#

  • 新しいプロジェクトで「どのアーキテクチャにすべきか」判断できない
  • モノリスからマイクロサービスに移行すべきか迷っている
  • アーキテクチャの選択理由をチームや経営層に説明できない

基本の使い方
#

ステップ1: 代表的なパターンを理解する

まず主要なアーキテクチャパターンを把握する。

  • レイヤードアーキテクチャ: プレゼンテーション→ビジネスロジック→データアクセスの階層構造。最も一般的で理解しやすい
  • マイクロサービス: 機能ごとに独立したサービスに分割。チームの自律性とスケーラビリティを重視
  • イベント駆動アーキテクチャ: イベントの発行と購読でコンポーネントを疎結合に接続
  • モノリシック: 単一のデプロイ単位にすべてを集約。小〜中規模では最も効率的

ポイント: 「最良のアーキテクチャ」は存在しない。要件とコンテキストに応じて最適解は変わる

ステップ2: 品質特性(非機能要件)で絞り込む

システムに求められる品質特性に基づいてパターンを絞り込む。

  • スケーラビリティ重視: マイクロサービス、イベント駆動
  • 開発速度重視: モノリシック、レイヤード
  • 耐障害性重視: イベント駆動、マイクロサービス+サーキットブレーカー
  • シンプルさ重視: モノリシック、レイヤード

ポイント: 品質特性はトレードオフの関係にある。すべてを同時に最適化することはできないので、優先順位を明確にする。

ステップ3: チームの成熟度と組織構造を考慮する

技術的な最適解だけでなく、チームの現実的な能力と組織構造も判断材料に入れる。

  • チームが10人以下ならモノリシックの方が効率的な場合が多い
  • コンウェイの法則: システム構造はチーム構造を反映する
  • 運用力が十分でなければ、マイクロサービスは負担になる

ポイント: 技術的に正しいが組織に合わないアーキテクチャは失敗する。チームが運用できる範囲で選択する。

ステップ4: ADR(Architecture Decision Record)で記録する

選定の意思決定プロセスを文書化する。

  • コンテキスト: なぜこの判断が必要になったか
  • 選択肢: 検討したパターンとそれぞれのPros/Cons
  • 決定: 選んだパターンと理由
  • 結果: 予想されるトレードオフ

ポイント: ADRを残すことで、将来「なぜこの構造なのか」という疑問に即座に答えられる

具体例
#

例1:5人のスタートアップがプロダクトのアーキテクチャを選定する

状況: 5人のエンジニアチームで新規SaaSプロダクトを立ち上げる。初期ユーザー数は少ないが、成長したらスケールさせたい。

検討:

パターンメリットデメリット判定
マイクロサービススケールしやすい5人には運用負荷が高すぎる却下
イベント駆動疎結合初期の開発速度が落ちる時期尚早
モジュラーモノリス速度とスケールの両立規律が必要採用

設計:

  • ドメインごとにモジュールを分離(ユーザー管理、決済、通知など)
  • モジュール間はインターフェース経由で通信(直接DB参照を禁止)
  • 将来の分割ポイントをモジュール境界として設計しておく

結果: 開発速度を維持しつつ、1年後にトラフィックが増えた決済モジュールだけを独立サービスに切り出すことに成功。リリース頻度は週3回を維持。最初からマイクロサービスにしていたら、運用で疲弊していた。

リリース頻度週3回を維持したまま、1年後に決済モジュールだけを切り出すことに成功。最初からマイクロサービスにしていたら運用で疲弊していた。

例2:従業員200名のEC企業がモノリスの限界を打破する

状況: 従業員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名以上の組織では、コンウェイの法則に沿ったサービス分割が効く。

例3:地方自治体の防災システムがイベント駆動アーキテクチャを採用する

状況: 人口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つが壊れても他が動く」イベント駆動の疎結合設計が、人命に関わる場面で機能した。

やりがちな失敗パターン
#

  1. 流行に乗ってマイクロサービスを選ぶ — 「みんなやっているから」でマイクロサービスを選ぶと、小さなチームが運用地獄に陥る。チーム規模と運用力を冷静に評価してから決める
  2. アーキテクチャを変更不可能なものと考える — 最初の選択が永久に続くわけではない。進化的アーキテクチャの考え方で、段階的に変更できる設計にする
  3. 非機能要件を後回しにする — 機能要件だけで選ぶと、本番で性能や可用性の問題が噴出する。品質特性を最初に定義してからパターンを選定する
  4. ADRを書かずに暗黙知で進める — 半年後に「なぜこの構造にしたのか」が誰もわからなくなる。選定理由を必ずADRとして記録し、チーム全体で共有する

まとめ
#

ソフトウェアアーキテクチャパターンは 「銀の弾丸」 ではなく「道具箱」。プロジェクトの要件、チームの能力、組織構造を総合的に考慮して最適なパターンを選ぶ。迷ったらシンプルな方から始め、必要に応じて進化させていくのが、失敗しないアーキテクチャ選定の王道だ。