この記事では、クラウド コンピューティングとソフトウェア アーキテクチャ パターンの概要とそしてそれを使う理由について説明します。
1.まず、ソフトウェア設計に於ける課題のうちソフトウェア アーキテクチャ パターンが解決できるものについて説明します。
2.その後、よく知られているソフトウェア デザイン パターンとこの記事で説明するソフトウェア アーキテクチャ パターンの違いを確認します。
3.そしてクラウド上でのアーキテクチャの観点から見た時の、クラウド コンピューティングの利点について短く話しますそしてこれらの利点をうまく活用する方法を説明します。そしてその逆のクラウド コンピューティングを利用するにあったて気を付けなければならない側面も説明します。

新しいソフトウェア製品を構築するにあたって色々な要件が存在します。設計時に出てくる課題を見てみましょう。
要件を3 つのカテゴリに分類します。
1.まず製品の機能と特徴を定める機能要件があります。
2.そしてシステムがどの程度きちんと機能するかの品質基準を規定する非機能要件もあります。これには、パフォーマンス、スケーラビリティ、可用性、信頼性などが含まれます。
3.それから、使えるテクノロジや API を限定してしまうシステムの制約もあります。
今回の説明では、この3番目のシステムの制約は無視をします。
この 2 種類の要件:機能と非機能についてですが、機能の部分が実装されるシステムの独特な側面です。
たとえば、新しいライドシェア サービス、ビデオ オン デマンド システムやオンライン ビデオ ゲームを設計している場合、競合他社だけでなく、既存の他のソフトウェア システムと区別できるのは、システムが提供している機能の違いです。機能が違う事が差別化になるのです。顧客エクスペリエンスとビジネス ロジックがそのソフトウェアとは何かと定めるのです。
非機能の部分が機能的に共通点のないソフトウェアを提供する多くの企業がまったく同じ課題に直面している場合が多くあります。同じデザインアーキテクチャでそれら課題の問題解決をできる可能性があります。オンライン ストア、オンライン教育プラットフォーム、オンライン デート などのサービスを見てみると、機能の面でこれらのシステムに共通点はほとんどありません。非機能要件の面では、これら 3 つのソフトウェアはすべて ウェブベースの UI またはモバイル アプリを通じてユーザーとやり取りするため、パフォーマンス要件は似ています。そして、数百万人から数千人のユーザーに対応する場合、スケーラビリティの課題も非常に似通っています。また、ソフトウェアがデータを保存したり画面に表示したりするのは共通していますので処理にアーキテクチャ パターンを使用することで課題を解決できます。
例えば、2つのスタートアップ企業がそれぞれ別々の業界に存在するとします。1 社はユーザー向けのソーシャル メディアを提供しており、もう 1 社は企業に販売するオンライン生産性ツールを提供しているとします。どちらの企業も大きな成長後はスケーラビリティの課題に直面します。どちらの企業もモノリシック アーキテクチャを使ってシステムを設構築したシステムはマイクロサービス アーキテクチャへの移行が必要になり労力がかかります。ということは同時に外部的には共通点がまったくない企業もシステム的には同じスケーラビリティと拡張性のアーキテクチャパターンからメリットを得ることができます。
そして、昨今ではすべての業務システムに高い可用性と信頼性が求められていますので効率的なエラー処理や中断のないサービスを提供しながら新機能を迅速かつ安全にリリースするのに役立つソフトウェア アーキテクチャ パターンは、すべての企業は参考にして、あらゆるシステムのアーキテクチャに簡単に適用できるパターン セットを利用して非機能的な課題をこなし、開発者はシステムを差別化する革新的な機能の設計・構築に集中するべきです。
このブログで学ぶアーキテクチャパターンはすでに多くの企業で効果的に使用されてて普遍的です。これらのアーキテクチャ パターンの最も優れた点は、実装に依存しないことです。そのため、各パターンのアーキテクチャと一般的なガイドラインに重点を置き説明します。一部のパターンをには詳細なシステムを実装するのに役立つ追加情報も提供します。
クラウドソフトウェアアーキテクチャパターンを使う理由がわかったところで、ここで学習するクラウドソフトウェアアーキテクチャパターンと、ほとんどのソフトウェアエンジニアが聞いたことのあるファクトリ パターン、シングルトン パターン戦略などの有名なデザイン パターンとの違いについて簡単に説明します。
いわゆるデザイン パターンはすべて1994 年に出版された「デザインパターン: 再利用可能なオブジェクト指向ソフトウェアの要素」という書籍から生まれました。書籍の名前が示すように、デザインパターンは再利用可能なオブジェクト指向ソフトウェアの重要な要素です。これらのパターンは主に、Java、C-sharp、C++、Python などのオブジェクト指向言語を使用して実装されたスタンドアロン アプリケーションを対象としています。これらのデザイン パターンによって実現できるのは、大規模で複雑なコード ベース内でのコードの整理です。パターンに従うことで、コードの再利用性、拡張性、開発者の生産性を向上させることができます。
しかし、これらのパターンは非常に便利ですが、クラウドが頻繁に使われる前の時代に考えられたパターンです。単一のアプリケーションまたはライブラリのアーキテクチャに限定されており、その上オブジェクト指向言語にのみ適用できます。
現在のクラウドコンピューティングのソフトウェアは複数の独立してデプロイされたサービスを使用して大規模なシステムを設計するあり、サービスはそれぞれ異なるチームと異なるプログラミング言語によって実装されていたり、その一部はオブジェクト指向ではない事が多くあります。その場合これらのデザインパターンは役に立ちません。さらに、これらのデザインパターンは、パフォーマンス、ユーザー エクスペリエンス、エラー処理、大量のデータやネットワーク トラフィックの処理などには対応していません。
したがって、ここでこれから説明するクラウドコンピューティングの領域を対象としているクラウドソフトウェアアーキテクチャパターンとは非常に異なります。
最初のソフトウェア アーキテクチャ パターンの学習を始める前に、クラウドソフトウェアアーキテクチャパターンが依存する最大かつ最も重要なパターンにであるクラウド コンピューティングを説明します。
クラウドコンピューティングは多くの企業がすでに対処しようとしていた課題を解決する為にインフラストラクチャ アズ ア サービス( Infrastracture as a Service: IaaS )を提供します。このサービスは実質的に無限のコンピュート(計算能力)、ストレージ、およびネットワーク容量への即時アクセスです。
企業はこのサービスがなければ基本的なオンライン製品をユーザーに提供しようとすると、インフラストラクチャを構築する為にエンジニアを見つけ、雇い、給料を支払い、そして準備ができるまで数か月を費やす必要があります。
クラウドの価格モデルでは、使用するサービスまたは利用したハードウェアに対してのみ料金が請求されます。これにより、前もって調達しなければならない投資額を抑えることがでるのでスタートアップの参入障壁が取り除かれます。
すなわちクラウド コンピューティングは一般的な問題を解決し、製品に関係なく、あらゆる企業にオンデマンド インフラストラクチャを提供します。クラウド サービス提供企業は、コンピュート、ストレージ デバイス、およびネットワークへのアクセスに加えて、パフォーマンス、スケーラビリティ、および信頼性を向上できる他の多数のツールと機能も提供します。
例は、マルチリージョンとマルチゾーン展開です。クラウドシステムはさまざまなリージョン( 地域 )で利用できます。ソフトウェアが存在する場所を物理的にユーザーに近づけることにより、レイテンシー ( データ転送の際に発生する遅延 )の短縮、パフォーマンスの向上、ユーザー エクスペリエンスの向上になります。
さらに、各リージョンでは、システム リソースを複数のゾーンに分散できます。これは、一般にアベイラビリティ( 可用性 )ゾーンまたはアイソレーション( 分離 )ゾーンと呼ばれます。
アプリケーションまたはデータベース インスタンスを複数のゾーンに分散することにより電源供給や接続に関して分離して一定の供給の保証を提供します。
ある1つのゾーンで電源またはインターネット接続が失われても、ユーザーからするとまるでシステムは何も起こらなかったかのようにサービスを継続して提供できます。そのため、クラウドを利用することでソフトウェア アーキテクチャや実装に特別なことをしなくても、システムのパフォーマンスとアベイラビリティ( 可用性 )やリライアビリティ( 信頼性 )を強化できます。
現在、バーチャル( 仮想 )マシン、ネットワーク ルーター、スイッチ、ストレージ デバイスなどのインフラストラクチャ自体に加えて、クラウド提供企業はソフトウェアをより速く構築するための一般的なプラットフォームも提供しています。これには、データベース、メッセージ ブローカー、ロード バランサー、監視およびロギング サービス、ファンクション・アズ・ ア・サービス( Function as a Service )、および他の即時に利用できる多くのツールが含まれます。
クラウドを使用することで得られる上記の色々なメリットの一方で、気をつけなければならない 2 つの大きなデメリットや制限もあります。
1 つ目は、システムが稼働するインフラストラクチャを所有することが出来ないという事です。従量課金モデルでは当初の参入障壁は低いのですが、サービスを拡大していき保存するデータが増えるにつれて、月々の請求額もどんどん増えて行きます。そのため、ソフトウェア アーキテクトとして、アベイラビリティ( 可用性 )やパフォーマンス( 性能・処理速度 )などの一般的な品質に加えて、コスト効率と収益性も気を付けて管理する必要があります。
そして 2 つ目のデメリットはレンタルするインフラストラクチャが直接的な管理外だという事とです。自社で高性能精高精度のハードウェアを購入せずにクラウド企業からレンタルしていますので、利用しているハードウェアが他の利用顧客によって何年も何ヶ月も24時間体制で使用されている可能性があります。したがって、レンタルするすべてのサーバー、ルーター、データベース インスタンス等はいつでも停止したりフリーズしたり接続が失われたり故障する可能性があります。統計的にはシステムが大きくなればなるほど一部のどこかが故障する可能性が高くなります。
つまりクラウド インフラストラクチャ上で実行される大規模システムを設計する作業は、リライアビリティ( 信頼性 )の低いコンポーネントを使用して( 信頼性 )の高いシステムを構築することなのです。つまり、ソフトウェア アーキテクチャでは、信頼性と障害処理をより真剣に考慮する必要がるのです。
今回の記事で説明した事を以下に簡単にまとめます。
-
-
まず、ソフトウェア アーキテクチャ パターンを利用する理由を理解しました。それが、あらゆるシステムで役立つ一般的な課題と非機能要件に対するソリューション( 解決策 )であると認識しました。
-
そして、それらを、単一のアプリケーションまたはライブラリ内のコード編成という異なるタイプの問題を解決するオブジェクト指向設計パターンと比較しました。
-
その後、クラウド コンピューティングの独自の機能と利点について説明しました。このブログの他の記事でこれらを活用する方法を説明します。
-
また、クラウド コンピューティングの欠点と制限についても触れました。これらに対処するには、ソフトウェア アーキテクチャ パターンを使用します。
-