ソフトウェアアーキテクチャの基礎

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

ソフトウェアアーキテクチャには明確な定義がなく、専門家によって定義が異なることも少なくない。本記事では、以下を包括するものをアーキテクチャと呼ぶことにする。

  • 望まれる製品の特性(要件、パフォーマンス、コスト、セキュリティなど)に対してトレードオフを踏まえた設計判断や設計指針の集合
  • ソフトウェア開発のあらゆるトレードオフに関わる
  • 絶対的な正解はなく、すべてがトレードオフである
  • 現状を分析し、絶えず改善し続ける継続的な取り組み
  • 同期通信か非同期通信か、モジュラーモノリスかマイクロサービスか、データベースを分割するかしないかなどの判断は、システムが動作する環境、企業の予算や期間、開発者のスキルセット、その他多くの要因に依存する。つまり、あらゆるアーキテクチャに関わる問題の答えは「場合による」である。

    また、最初からうまくゆくアーキテクチャは存在せず、絶えず分析と改善を繰り返していく必要がある。

    ソフトウェアアーキテクチャの法則

    ソフトウェアアーキテクチャの範囲は広く、こうすれば良いという統一的な法則はないが、以下の要素は共通している。

  • ソフトウェアアーキテクチャはトレードオフがすべて → もし、トレードオフでない「銀の弾丸」を見出したと思っているなら、まだトレードオフを特定できていないだけの可能性が高い。
  • 「どうやって」より「なぜ」の方がずっと重要 → システムを見ればどう動くかは解明できるが、なぜそのような構造になっているのかは記録しておかなければ理解できない
  • アーキテクチャ特性の(部分的)リスト

    アーキテクチャ特性に普遍的な標準リストは存在しない。急速に進化するソフトウェアに合わせて、常に新たな概念が生まれている。以下にいくつかの分類とアーキテクチャ特性を示す。


    アーキテクチャ特性

    分類名称説明
    アーキテクチャの運用特性可用性システムがどのくらいの期間利用できるか(24時間365日稼働する場合には、障害が発生した場合に迅速にシステムを稼働できるようにするための措置が必要となる)。
    同上継続性障害復旧能力。
    同上パフォーマンスストレステスト、ピーク分析、使われる機能の使用頻度、必要となる容量、応答時間の分析などが含まれる。パフォーマンスの受け入れには、数ヶ月にわたる独自の作業が必要になることもある。
    同上回復性処理の持続性要件(例:災害時にシステムをどれだけ早くオンラインに戻す必要があるか)。これはバックアップ戦略とハードウェアの複製の要件に影響する。
    同上信頼性 / 安全性システムがフェイルセーフである必要があるのか、人命に影響を与えるようなミッションクリティカルなものであるのかを評価する。障害が発生した場合、会社に多額の費用がかかるだろうか?
    同上堅牢性実行中にインターネット接続が切れた場合や、停電やハードウェア障害が発生した場合に、エラーや境界条件を処理できるかどうか。
    同上スケーラビリティユーザー数やリクエスト数が増えてもシステムが動作する能力。
    アーキテクチャの構造特性構成容易性エンドユーザーが(使い勝手の良いインターフェイスを介して)ソフトウェアの設定を簡単に変更できること。
    同上拡張性新しい機能をプラグインで追加可能にすることをどれだけ重視しているか。
    同上インストール容易性必要なすべてのプラットフォームへのインストールの容易さ。
    同上活用性 / 再利用性複数の製品で共通のコンポーネントを利用できること。
    同上ローカライゼーションデータフィールドの入力画面や問い合わせ画面、レポート、マルチバイト文字の要件、単位や通貨などが多言語に対応していること。
    同上メンテナンス容易性変更の適用やシステムの拡張がどれだけ簡単に行えるか。
    同上可搬性システムは複数のプラットフォームで動作する必要があるか?例:フロントエンドはSAP DBだけでなくOracleに対しても動作する必要があるか?
    同上アップグレード容易性サーバーやクライアント上で、このアプリケーション/ソリューションの旧バージョンから新バージョンへのアップグレードを簡単/迅速に行える能力。
    アーキテクチャの横断的特性アクセシビリティ色覚障害や難聴などの障害を持つユーザーも含め、すべてのユーザーのアクセスしやすさ。
    同上長期保存性データは一定期間後にアーカイブまたは削除する必要があるか?(例:顧客のアカウントは3ヶ月後に削除されるか、あるいは廃止されたものとしてマークされ、将来アクセスできるようにセカンダリデータベースにアーカイブされる)。
    同上認証ユーザーが何者かを確認するためのセキュリティ要件。
    同上認可ユーザーが(ユースケース、サブシステム、Webページ、ビジネスルール、フィールドレベルなどによって)アプリケーション内の特定の機能のみアクセスできることを保証するセキュリティ要件。
    同上合法性システムはどのような法的制約の中で運用されているか(データ保護、米企業改革法、GDPRなど)、会社はどのような権利留保を要求しているか?アプリケーションの構築方法やデプロイ方法に関する規約はあるの?
    同上プライバシー従業員から取引を隠せるか(取引が暗号化されていて、DBAやネットワークアーキテクトでさえも取引を見ることができなくなっているか)。
    同上セキュリティデータベース内でデータを暗号化する必要があるか?社内システム間のネットワーク通信を暗号化する必要があるか?リモートユーザーのアクセスにはどのような認証が必要化?
    同上サポート容易性アプリケーションにはどの程度の技術サポートが必要か?システムのエラーをデバッグするには、ログなどをどのようなレベルで整えておく必要があるか?
    同上ユーザビリティ / 達成容易性アプリケーション/ソリューションでユーザーが目標を達成するのに必要なトレーニングのレベル。ユーザビリティの要件は、他のアーキテクチャ上の課題と同様に真剣に扱われる必要がある。

    出典:ソフトウェアアーキテクチャの基礎(表4-1~4-3)


    あらゆるアーキテクチャ特性を同時に満足させるアーキテクチャは存在しない。そのため、状況に応じてトレードオフを分析し、「少なくとも最悪でないアーキテクチャ」を選択をするしかない。

    分散コンピューティングの誤信

    マイクロサービスのような分散アーキテクチャは、パフォーマンス、スケーラビリティ、可用性の点でモノリシックアーキテクチャよりも強力だが、決して「銀の弾丸」などではなく、当然大きなトレードオフが存在する。ここでは、分散コンピューティングの8つの誤信(正しいと信じられているが実際には誤っていること)を紹介する。

    誤信1:ネットワークは信頼できる

    時代とともに向上してはいるが、ネットワークの信頼性は依然として低いままである。分散アーキテクチャでは、すべてのサービス間通信がネットワークに依存するため、ネットワークの問題でレスボンスが得られなくなるなど、信頼性が低下する。

    誤信2:レイテンシーがゼロ

    ローカルでメソッドを呼び出すときにかかる時間はナノ秒またはマイクロ秒単位だが、リモートアクセスでかかる時間はミリ秒単位になる。1回のリクエストの平均レイテンシーが100ミリ秒だとして、特定の機能を実行するのに10回のリクエストが必要になる場合、平均レイテンシーは1000ミリ秒となる。「ロングテール」のレイテンシーを引かされたら、パフォーマンスはさらに低下する。

    誤信3:帯域幅は無限

    分散アーキテクチャでは、すべてのサービス間通信がネットワークに依存する。もし、ユーザー情報を取得する際に、不要な情報を含めてまるごと取得するような仕様になっている場合、すぐにネットワーク帯域を圧迫して、ネットワークの速度低下や信頼性の低下につながる。

    誤信4:ネットワークは安全

    VPNや信頼できるネットワーク、ファイアウォールを使うことに慣れて忘れがちだが、ネットワークは安全ではない。分散アーキテクチャの全ユニットのエンドポイントを悪質なリクエストから保護しなくてはならず、これはパフォーマンスの低下にもつながる。

    誤信5:トポロジーは決して変化しない

    トポロジー(ネットワークの接続形態)には、ルーター、ハブ、スイッチ、ファイアウォール、ネットワーク、アプライアンスすべてが含まれていて、これらは常に変化している。ネットワークの軽微なアップグレードによって、パフォーマンスの低下や信頼性の低下につながる可能性もある。

    誤信6:管理者は一人だけ

    古典的な大企業には、ネットワーク管理者が数十人いることもある。今扱っている分散アーキテクチャが正しく動作するようにするために、誰に何を(一体全体何人と)相談し、調整すればよいのだろうか。

    誤信7:転送コストはゼロ

    ネットワークを経由したサービス間通信にも当然コスト(費用)が発生する。さらに、分散アーキテクチャの構築には、モノリシックアーキテクチャより余分に、ハードウェア、サーバー、ゲートウェイ、ファイアーウォール、サブネット、プロキシなどを用意する必要がある。

    誤信8:ネットワークは均一

    ほとんどの企業は、複数のネットワークハードウェアベンダーを使ってインフラを構築している。そしてそれらのハードウェアベンダーはすべてがうまく連携しているわけではない。ときには、ネットワークの信頼性やレイテンシー、帯域幅に影響を与えることもある。

    アーキテクチャスタイル

    アーキテクチャスタイルは、様々なアーキテクチャ特性をカバーするアーキテクチャの構造を表現するパターンの名前。現在一般的になっているいくつかのアーキテクチャスタイルを紹介する。

  • レイヤードアーキテクチャ システムを複数の層に分離し、それぞれの層が特定の役割を果たすモノリシックなアーキテクチャスタイル。この階層構造によって、システムの複雑さは軽減され、ある層の変更が他の層に与える影響を小さく保つことができる。
  • パイプラインアーキテクチャ データが一連のパイプとフィルタを通して処理されるモノリシックなアーキテクチャスタイル。各フィルターで独立したタスクが実行され、データはパイプを通して次のフィルターへと渡される。
  • マイクロカーネルアーキテクチャ 必要最低限の機能を持つコアシステム(カーネル)と、コアシステムを拡張するプラグインからなるモノリシックなアーキテクチャスタイル。柔軟性が高く、新しい機能を容易に追加できる。
  • サービスベースアーキテクチャ システムを独立したサービスの集合として構築する分散型のアーキテクチャスタイル。後述のマイクロサービスアーキテクチャの要素を含むが、マイクロサービスアーキテクチャよりサービスの粒度が大きく、データベースはモノリシックになる場合が多い。
  • イベント駆動アーキテクチャ イベント発生をトリガーとして処理を実行する分散型のアーキテクチャスタイル。非同期な処理が可能であり、スケーラビリティが高い。
  • スペースベースアーキテクチャ データと処理を複数の処理ユニットに分散する分散型のアーキテクチャスタイル。共有メモリー空間(スペース)を利用して、コンポーネント間でデータをやり取りする。高いスケーラビリティと弾力性を持つ。
  • マイクロサービスアーキテクチャ システムを小さな独立した複数のサービスの集合として構築する分散型のアーキテクチャスタイル。サービスベースアーキテクチャをさらに細分化し、各サービスを独立してデプロイ可能にする。

  • アーキテクチャ特性の評価表

    アーキテクチャ特性レイヤードアーキテクチャパイプラインアーキテクチャマイクロカーネルアーキテクチャサービスベースアーキテクチャイベント駆動アーキテクチャスペースベースアーキテクチャマイクロサービスアーキテクチャ
    デプロイ容易性★★★★★★★★★★★★★★★★★★★
    弾性力★★★★★★★★★★★★★★★
    進化性★★★★★★★★★★★★★★★★★★★★★★
    耐障害性★★★★★★★★★★★★★★★★
    モジュール性★★★★★★★★★★★★★★★★★★★★★★
    全体的なコスト★★★★★★★★★★★★★★★★★★★★★★★★
    パフォーマンス★★★★★★★★★★★★★★★★★★★★★★
    信頼性★★★★★★★★★★★★★★★★★★★★★★★★
    スケーラビリティ★★★★★★★★★★★★★★★★★★
    シンプルさ★★★★★★★★★★★★★★★★★
    テスト容易性★★★★★★★★★★★★★★★★★★

    上記のアーキテクチャスタイルは、様々なアーキテクチャ特性をカバーしているが、「銀の弾丸」などというものはなく、状況に合わせて選択する必要がある。

    参考資料


    著者画像

    ゆうき

    2018/04からITエンジニアとして活動、2021/11から独立。主な使用言語はPython, TypeScript, SAS, etc.