ソフトウェアアーキテクチャの基礎
ソフトウェアアーキテクチャとは
ソフトウェアアーキテクチャには明確な定義がなく、専門家によって定義が異なることも少なくない。本記事では、以下を包括するものをアーキテクチャと呼ぶことにする。
同期通信か非同期通信か、モジュラーモノリスかマイクロサービスか、データベースを分割するかしないかなどの判断は、システムが動作する環境、企業の予算や期間、開発者のスキルセット、その他多くの要因に依存する。つまり、あらゆるアーキテクチャに関わる問題の答えは「場合による」である。
また、最初からうまくゆくアーキテクチャは存在せず、絶えず分析と改善を繰り返していく必要がある。
ソフトウェアアーキテクチャの法則
ソフトウェアアーキテクチャの範囲は広く、こうすれば良いという統一的な法則はないが、以下の要素は共通している。
アーキテクチャ特性の(部分的)リスト
アーキテクチャ特性に普遍的な標準リストは存在しない。急速に進化するソフトウェアに合わせて、常に新たな概念が生まれている。以下にいくつかの分類とアーキテクチャ特性を示す。
アーキテクチャ特性
分類 | 名称 | 説明 |
アーキテクチャの運用特性 | 可用性 | システムがどのくらいの期間利用できるか(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:ネットワークは均一
ほとんどの企業は、複数のネットワークハードウェアベンダーを使ってインフラを構築している。そしてそれらのハードウェアベンダーはすべてがうまく連携しているわけではない。ときには、ネットワークの信頼性やレイテンシー、帯域幅に影響を与えることもある。
アーキテクチャスタイル
アーキテクチャスタイルは、様々なアーキテクチャ特性をカバーするアーキテクチャの構造を表現するパターンの名前。現在一般的になっているいくつかのアーキテクチャスタイルを紹介する。
アーキテクチャ特性の評価表
アーキテクチャ特性 | レイヤードアーキテクチャ | パイプラインアーキテクチャ | マイクロカーネルアーキテクチャ | サービスベースアーキテクチャ | イベント駆動アーキテクチャ | スペースベースアーキテクチャ | マイクロサービスアーキテクチャ |
デプロイ容易性 | ★ | ★★ | ★★★ | ★★★★ | ★★★ | ★★★ | ★★★★ |
弾性力 | ★ | ★ | ★ | ★★ | ★★★ | ★★★★★ | ★★★★★ |
進化性 | ★ | ★★★ | ★★★ | ★★★ | ★★★★★ | ★★★ | ★★★★★ |
耐障害性 | ★ | ★ | ★ | ★★★★ | ★★★★★ | ★★★ | ★★★★ |
モジュール性 | ★ | ★★★ | ★★★ | ★★★★ | ★★★★ | ★★★ | ★★★★★ |
全体的なコスト | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★ | ★★★ | ★★ | ★ |
パフォーマンス | ★★ | ★★ | ★★★ | ★★★ | ★★★★★ | ★★★★★ | ★★ |
信頼性 | ★★★ | ★★★ | ★★★ | ★★★★ | ★★★ | ★★★★ | ★★★★ |
スケーラビリティ | ★ | ★ | ★ | ★★★ | ★★★★★ | ★★★★★ | ★★★★★ |
シンプルさ | ★★★★★ | ★★★★★ | ★★★★ | ★★★ | ★ | ★ | ★ |
テスト容易性 | ★★ | ★★★ | ★★★ | ★★★★ | ★★ | ★ | ★★★★ |
上記のアーキテクチャスタイルは、様々なアーキテクチャ特性をカバーしているが、「銀の弾丸」などというものはなく、状況に合わせて選択する必要がある。