⚖️

ソフトウェアアーキテクチャと特性評価

2022/09/12に公開

https://www.oreilly.co.jp/books/9784873119823/
「ソフトウェアアーキテクチャの基礎」に記載される各アーキテクチャとそれぞれの特性評価の早見表

※ 星が多いほどベターであることを表す

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

アーキテクチャ特性 評価
分割タイプ 技術
量子数 1
デプロイ容易性
弾力性
進化性
耐障害性
モジュール性
全体的なコスト ★★★★★
パフォーマンス ★★
信頼性 ★★★
スケーラビリティ
シンプルさ ★★★★★
テスト容易性 ★★
  • 本質的にモノリシックであるため、分散アーキテクチャの複雑性を持たず、シンプルである
  • アプリケーションが大きくなっていくと複雑性は増していく
  • レイヤーごとにインターフェースに依存するため、テストスタブやモックを利用しやすく、テスタビリティが高い
  • モノリシックなデプロイが必要であり、デプロイ容易性、スケーラビリティが低い
  • モノリス中の特定のコンポーネントだけスケールさせることは可能ではあるが、マルチスレッディングやメッセージングなどとの相性が悪く、複雑な設計が求められる
  • 障害分離もできておらず、一部がクラッシュすると全体がダウンするため、耐障害性も低い

パイプラインアーキテクチャ

アーキテクチャ特性 評価
分割タイプ 技術
量子数 1
デプロイ容易性 ★★
弾力性
進化性 ★★★
耐障害性
モジュール性 ★★★
全体的なコスト ★★★★★
パフォーマンス ★★
信頼性 ★★★
スケーラビリティ
シンプルさ ★★★★★
テスト容易性 ★★★
  • モジュール性と組み合わさったシンプルさと全体的なコストが強み
  • モノリシックなため、分散アーキテクチャの複雑性がない
  • フィルターとアダプターの間で関心ごとを分離できる
    • モジュール性やテスト容易性、デプロイ容易性がレイヤードアーキテクチャより高い
  • モノリシックなデプロイを前提としているため、その点のデメリットはレイヤードアーキテクチャと同様である

マイクロカーネルアーキテクチャ

アーキテクチャ特性 評価
分割タイプ ドメインと技術
量子数 1
デプロイ容易性 ★★★
弾力性
進化性 ★★★
耐障害性
モジュール性 ★★★
全体的なコスト ★★★★★
パフォーマンス ★★★
信頼性 ★★★
スケーラビリティ
シンプルさ ★★★★
テスト容易性 ★★★
  • ドメインと技術による分割の両方が可能な唯一のアーキテクチャ
    • ユーザーのカスタマイズや機能拡張性を重視したプロダクトによくマッチする
  • 機能を独立したプラグインコンポーネントに分離できるため、テスト容易性、デプロイ容易性、信頼性が高くなる
  • コンポーネントの付け外しによって機能の変更を行えるため、モジュール性と拡張性も高い
  • 不要な機能を取り除くことができるので、パフォーマンスが良い

サービスベースアーキテクチャ

アーキテクチャ特性 評価
分割タイプ ドメイン
量子数 1以上
デプロイ容易性 ★★★★
弾力性 ★★
進化性 ★★★
耐障害性 ★★★★
モジュール性 ★★★★
全体的なコスト ★★★★
パフォーマンス ★★★
信頼性 ★★★★
スケーラビリティ ★★★
シンプルさ ★★★
テスト容易性 ★★★★
  • 各サービスでデータベースやユーザーインターフェースを共有するか否かで量子数が変わる
  • 分割してデプロイできるので、より早く、より高頻度で変更を適用できる
  • ドメインの範囲が限定されているため、テストカバレッジを向上できる
  • サービスごとに障害分離できる可能性があるため、耐障害性も高い
  • サービスの粒度が粗いので、スケーラビリティは星3つ、弾力性は星2つ
  • 粒度の細かいマイクロサービスに比べ、サービス間トラフィックが減り、分散トランザクションが減るため、全体的な信頼性は比較的高い

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

アーキテクチャ特性 評価
分割タイプ 技術
量子数 1以上
デプロイ容易性 ★★★
弾力性 ★★★
進化性 ★★★★★
耐障害性 ★★★★★
モジュール性 ★★★★
全体的なコスト ★★★
パフォーマンス ★★★★★
信頼性 ★★★
スケーラビリティ ★★★★★
シンプルさ
テスト容易性 ★★
  • 非同期を前提としているが、データベースを共有している場合や、リクエストリプライの即時性が求められる場合は量子数は1となる
  • 非同期通信と高度に並列化された処理の組み合わせが強み
    • 高パフォーマンス
    • 高スケーラビリティ
    • 高耐障害性
  • イベントフロー(ツリー)が複雑でパターン数が多い場合、テストの難易度が上がる
  • 新しい機能を追加するために新規のインフラを用意したり、既存のイベントプロセッサーに変更を加える必要がなく、簡単に機能追加できる

スペースベースアーキテクチャ

アーキテクチャ特性 評価
分割タイプ ドメインと技術
量子数 1以上
デプロイ容易性 ★★★
弾力性 ★★★★★
進化性 ★★★
耐障害性 ★★★
モジュール性 ★★★
全体的なコスト ★★
パフォーマンス ★★★★★
信頼性 ★★★★
スケーラビリティ ★★★★★
シンプルさ
テスト容易性
  • インメモリデータベースを活用し、制約としてのデータベースを削除することで以下を担保する
    • 高弾力性
    • 高スケーラビリティ
    • 高パフォーマンス
  • キャッシュの使用やデータの結果整合性担保のために非常に複雑なアーキテクチャとなる
    • 可動部分が多く、そのどれかがクラッシュしてもデータがロストしないようにする必要がある
  • ピーク時の負荷テストとして、何十万人もの同時接続ユーザーを再現するのは、非常に複雑でコストもかかるため、テストしにくい
  • 多くのマシンリソースが必要なためコストが高い
  • 量子数はユーザーインターフェースの設計方法や処理ユニット間の通信方法に依存する
    • 処理ユニットはデータべースと同期的に通信しないため、データベース自体は量子方程式の一部にはならない

オーケストレーション駆動サービス指向アーキテクチャ

アーキテクチャ特性 評価
分割タイプ 技術
量子数 1
デプロイ容易性
弾力性 ★★★
進化性
耐障害性 ★★★
モジュール性 ★★★
全体的なコスト
パフォーマンス ★★
信頼性 ★★
スケーラビリティ ★★★★
シンプルさ
テスト容易性
  • 分散アーキテクチャであるにもかかわらず、以下の点から量子数は1となる
    • 一般的に単一のデータベースに依存し、多くの異なる関心ごとにまたがってアーキテクチャ内に連結点を生む
    • オーケストレーションエンジン自体が巨大な連結点となる
  • サポートが不十分であったこと、当時はあまり重要な指標ではなかったことから、デプロイ容易性やテスト容易性は低い
  • 各ビジネスリクエストがアーキテクチャの多くの部分に分散されているため、パフォーマンスは高くない

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

アーキテクチャ特性 評価
分割タイプ ドメイン
量子数 1以上
デプロイ容易性 ★★★★
弾力性 ★★★★★
進化性 ★★★★★
耐障害性 ★★★★
モジュール性 ★★★★★
全体的なコスト
パフォーマンス ★★
信頼性 ★★★★
スケーラビリティ ★★★★★
シンプルさ
テスト容易性 ★★★★
  • 高度に分離された非常に小さなデプロイメントユニットを持つことで、ビジネスの急速な変化に対応するスピードを手にすることができる
  • サービス間通信を多用すると、耐障害性や信頼性に影響が生じるが、それはアーキテクチャの傾向を示しているに過ぎず、サービスディスカバリによる冗長性やスケーリングによって、そうした問題の多くは解決できる
    • また、一般には独立した単一目的にサービスは高い障害性をもたらす
  • 自動化やオペレーションとの高度な統合に大きく依存するため、開発者はアーキテクチャに弾力性のサポートを組み込める
  • 高度な分離を漸進的に進めていくのに適しているため、進化的な変化という現代のビジネス慣行をサポートする
  • サービス間通信はローカル呼び出しよりも通信コストが高く、パフォーマンスは低い
    • ただし、データキャッシュやレプリケーションを有効活用すれば、軽減できる
  • 各サービスはドメインごとに境界づけられており、ドメイン中心のアーキテクチャである
  • 現代のあらゆるアーキテクチャのなかで、最もはっきりした量子を持つ
    • マイクロサービスにおける分離の哲学は、多くの点でアーキテクチャ量子を測る基準との整合性が取れている

おまけ

統合図

アーキテクチャ特性 レイヤードアーキテクチャ パイプラインアーキテクチャ マイクロカーネルアーキテクチャ サービスベースアーキテクチャ イベント駆動アーキテクチャ スペースベースアーキテクチャ オーケストレーション駆動サービス指向アーキテクチャ マイクロサービスアーキテクチャ
分割タイプ 技術 技術 ドメインと技術 ドメイン 技術 ドメインと技術 技術 ドメイン
量子数 1 1 1 1以上 1以上 1以上 1 1以上
デプロイ容易性 ★★ ★★★ ★★★★ ★★★ ★★★ ★★★★
弾力性 ★★ ★★★ ★★★★★ ★★★ ★★★★★
進化性 ★★★ ★★★ ★★★ ★★★★★ ★★★ ★★★★★
耐障害性 ★★★★ ★★★★★ ★★★ ★★★ ★★★★
モジュール性 ★★★ ★★★ ★★★★ ★★★★ ★★★ ★★★ ★★★★★
全体的なコスト ★★★★★ ★★★★★ ★★★★★ ★★★★ ★★★ ★★
パフォーマンス ★★ ★★ ★★★ ★★★ ★★★★★ ★★★★★ ★★ ★★
信頼性 ★★★ ★★★ ★★★ ★★★★ ★★★ ★★★★ ★★ ★★★★
スケーラビリティ ★★★ ★★★★★ ★★★★★ ★★★★ ★★★★★
シンプルさ ★★★★★ ★★★★★ ★★★★ ★★★
テスト容易性 ★★ ★★★ ★★★ ★★★★ ★★ ★★★★

Discussion