4-2 アーキテクチャ設計

Architecture Design

アーキテクチャはシステムの骨格であり、 後から変更することが困難な重要な決定事項である。 本節では、代表的なアーキテクチャパターン、設計上の考慮事項、 そしてアーキテクチャ決定の方法について解説する。

1. ソフトウェアアーキテクチャとは

1.1 アーキテクチャの定義

ソフトウェアアーキテクチャとは、システムの基本的な構造であり、 コンポーネント、コンポーネント間の関係、そしてそれらの設計・進化を 導く原則で構成される。ISO/IEC/IEEE 42010では「システムの基本的な 概念または特性を、その要素、関係、設計・進化の原則で具体化したもの」 と定義されている。

1.2 アーキテクチャの重要性

アーキテクチャはシステム全体の品質に大きな影響を与える。

観点 アーキテクチャの影響
品質特性 性能、可用性、セキュリティなどの実現方法を決定
開発体制 チーム分割、並行開発の可能性を左右
技術選定 使用する技術スタック、フレームワークの選択
コスト 開発・運用コストに大きく影響
リスク 技術的リスクの識別と対策
アーキテクチャは後から変えにくい
アーキテクチャの変更は、システム全体に影響する大規模な作業になる。 初期段階での適切なアーキテクチャ選択が、プロジェクトの成否を左右する。 ただし、「完璧な設計」を追求しすぎて分析麻痺に陥らないことも重要である。

2. アーキテクチャパターン

2.1 レイヤードアーキテクチャ

システムを複数の層(レイヤー)に分割するパターン。 最も一般的なアーキテクチャパターンの1つである。

レイヤー 責務
プレゼンテーション層 ユーザーインターフェース 画面、API
ビジネスロジック層 業務ルール、処理ロジック サービス、ドメインモデル
データアクセス層 データの永続化 DAO、リポジトリ
データベース層 データ保存 RDBMS、NoSQL

2.2 MVCパターン

Model-View-Controllerの3つのコンポーネントに分離するパターン。 Webアプリケーションで広く採用されている。

コンポーネント 責務
Model データとビジネスロジック
View ユーザーへの表示
Controller ユーザー入力の処理、ModelとViewの調整

2.3 マイクロサービスアーキテクチャ

システムを小さな独立したサービスの集合として構築するパターン。 各サービスは独立してデプロイ・スケール可能である。

特性 モノリシック マイクロサービス
構造 単一のアプリケーション 複数の小さなサービス
デプロイ 全体を一括デプロイ サービス単位でデプロイ
スケーリング 全体をスケール 必要なサービスのみスケール
技術選択 統一された技術スタック サービスごとに最適な技術を選択可能
複雑性 コード内の複雑性 運用・インフラの複雑性
適用 中小規模システム 大規模、高頻度デプロイ
マイクロサービスの適用判断
マイクロサービスは万能ではない。運用の複雑性、分散システムの難しさ、 チーム体制との適合など、多くの考慮事項がある。 「モノリスファースト」の考え方で、まずモノリシックに構築し、 必要に応じてサービス分割していくアプローチも有効である。

2.4 イベント駆動アーキテクチャ

イベント(状態変化の通知)を中心にシステムを構築するパターン。 疎結合で拡張性の高いシステムを実現できる。

コンポーネント 役割
イベントプロデューサー イベントを発生させる
イベントブローカー イベントの仲介・配信
イベントコンシューマー イベントを受信して処理

3. クラウドアーキテクチャ

3.1 クラウドネイティブの原則

クラウドネイティブアプリケーションは、クラウドの特性を 最大限に活用するよう設計される。

原則 説明
コンテナ化 アプリケーションをコンテナとしてパッケージング
動的オーケストレーション Kubernetesなどによる自動管理
マイクロサービス 小さな独立したサービスの集合
宣言的API 望ましい状態を宣言的に定義

3.2 Twelve-Factor App

Herokuが提唱したSaaS開発のベストプラクティス。 クラウドネイティブアプリケーションの設計指針として広く参照される。

Factor 説明
1. コードベース バージョン管理される1つのコードベース
2. 依存関係 依存関係を明示的に宣言
3. 設定 設定を環境変数に格納
4. バックエンドサービス バックエンドサービスをリソースとして扱う
5. ビルド、リリース、実行 ビルド・リリース・実行を厳密に分離
6. プロセス ステートレスなプロセスとして実行
7. ポートバインディング ポートバインディングでサービスを公開
8. 並行性 プロセスモデルでスケールアウト
9. 廃棄容易性 高速な起動とグレースフルシャットダウン
10. 開発/本番一致 開発・ステージング・本番を可能な限り一致
11. ログ ログをイベントストリームとして扱う
12. 管理プロセス 管理タスクを1回限りのプロセスとして実行

4. アーキテクチャ設計のプロセス

4.1 アーキテクチャドライバー

アーキテクチャ設計は、以下のドライバー(駆動要因)に基づいて行われる。

ドライバー
機能要件 主要なユースケース、機能
品質属性 性能、可用性、セキュリティ、拡張性
制約 技術制約、予算、スケジュール、法規制
原則 組織の技術方針、標準

4.2 アーキテクチャ決定記録(ADR)

重要なアーキテクチャ決定は、ADR(Architecture Decision Record)として 文書化する。

項目 内容
タイトル 決定内容を簡潔に表現
ステータス 提案中、承認済み、廃止など
コンテキスト 決定が必要になった背景
決定 何を決定したか
選択肢 検討した代替案
結果 この決定による影響、トレードオフ

ADRの例

タイトル:認証にOAuth 2.0 + OpenID Connectを採用
コンテキスト:複数のクライアント(Web、モバイル)から APIにアクセスする必要があり、外部IDプロバイダとの連携も求められている。
決定:認証基盤としてOAuth 2.0 + OpenID Connectを採用し、 KeycloakをIDプロバイダとして使用する。
結果:標準プロトコルにより外部連携が容易になる一方、 Keycloakの運用・保守が必要になる。

次のステップ
アーキテクチャ設計を学んだら、次は「4-3 データベース設計」で データの構造設計について学習しよう。
参考文献
[1] Richards, M. (2015). Software Architecture Patterns.
[2] Newman, S. (2015). Building Microservices.
[3] Wiggins, A. (2017). The Twelve-Factor App.