アプリと API を拡張するためのアプリ配信パターン

今日のアプリと API のスケーリングは、適切な負荷分散アルゴリズムを選択することではありません。 20 年以上にわたるアプリ配信の進化の中で、ほぼ一定のまま残っているのが負荷分散アルゴリズムです。 主な利点は可用性の維持です。 パフォーマンスへの影響は、せいぜい最小限です。 

これは、アルゴリズムの選択が無関係であると言っているのではありません。 結局のところ、ラウンドロビンは API やアプリケーションにとって最良の選択となることはほとんどありませんが、最小の接続数最速の応答の間の選択は、デジタル サービスの全体的なパフォーマンスと可用性に、そのアーキテクチャよりも影響を与える可能性は低くなります。 

これは、デジタル サービスの設計と運用に必要な6 つの主要機能の 1 つとしてアプリ配信が重視されていることに対応した、アプリ配信に関するアーキテクチャの観点になります。 

負荷分散アルゴリズムとは何ですか?

負荷分散アルゴリズムは、リソース プール全体に負荷を分散して可用性を確保し、パフォーマンスを向上させるプログラム的なアプローチです。

負荷分散アルゴリズムは、特定のリソースがどのように選択されるか、およびどの変数が考慮されるかを指定します。

ラウンドロビンは最も単純なアルゴリズムであり、既知のリソース セットを順番に反復するだけです。 A、B、C の 3 つのリソースがある場合、ラウンドロビンでは最初のリクエストが A に、2 番目のリクエストが B に、3 番目のリクエストが C にルーティングされます。その後、選択プロセスが再び開始されます。

最小接続は、「負荷が増加するとパフォーマンスが低下する」という 2 番目の運用公理に基づいたアルゴリズムです。 したがって、最小接続アルゴリズム 接続 (負荷) が最も少ないリソースを選択します。 このアルゴリズムにはさまざまなバリエーションがあり、最も顕著なのは、リソース間の容量の違いを許容する重み付け最小接続です

パフォーマンスが最優先される場合は、最速の応答時間が使用されます。 ロード バランサは、受動的または能動的に各リソースからの応答時間を決定し、すべての要求に対して最も速いものを選択します。 このアルゴリズムはラストマイルやユーザーネットワークの状態に影響を与えないため、ユーザー応答時間を保証するものではありません。

ソース IP は、ソース (クライアント) IP の単純なハッシュ値を使用してリソースを選択する、ネットワーク負荷分散から残ったアルゴリズムです。 このアルゴリズムは、特定のソース IP に対して常に同じリソースを選択します。 このアルゴリズムは、単一のプロキシ/IP アドレスから発信されたすべてのユーザーが同じリソースに誘導される「メガ プロキシ」問題の影響を受けるため、人気がなくなりました。 これにより、ターゲット リソースが過負荷になり、パフォーマンスが低下し、最終的には障害が発生する傾向があります。

負荷分散アルゴリズムは、アプリ配信アーキテクチャの重要な部分ですが、全体的なアーキテクチャアプローチに比べると、アプリやデジタル サービスのパフォーマンスと規模に与える影響は小さくなります。

アプリ配信とは何ですか?

アプリ配信は、アプリ、API、デジタル サービス向けにスケーラブルで高性能なアーキテクチャを設計する分野です。 コアコンポーネントとして負荷分散に大きく依存していますが、レイヤー 7 ルーティングなどの最新機能を組み込み、一般的なアーキテクチャ パターンを活用してパフォーマンスを最適化し、リソースを効率的に利用します。

私たちは、実装の詳細である負荷分散と、設計プロセスであるアーキテクチャの間に意図的に線を引くために、「アプリ配信」という用語を使用しています。

なぜスケールするのか?

スケールとは、ビジネス成果に対する技術的な対応です。 つまり、顧客満足度スコア、コンバージョン率、収益の創出を向上させるために、デジタル サービスを構成するワークロードの可用性とパフォーマンスを維持する必要があるということです。 この最後の部分は特に重要です。当社の調査によると、現在、企業の大多数 (58%) が収益の少なくとも半分をデジタル サービスから得ているからです。

また、たとえば、ビジネス継続性 (BC) のためにパブリック クラウドを使用することも検討してください。 BC はパブリック クラウドの主な用途であり、その中核となるのはグローバル スケールの実装、つまりグローバル ロード バランシングです。 フェイルオーバーは、アプリ配信のコア機能であり、サイト全体に適用すると、ある場所から別の場所にリクエストを迅速にリダイレクトできるようになります。  企業のデジタルプレゼンスの継続的な可用性は、技術的な対応によって実現されるビジネス成果です。

どのようにスケールするのでしょうか?

この質問に答えることから、アプリ配信アーキテクチャに関する技術的な旅が始まります。 スケールには、垂直 (上) と水平 (外) の 2 つのモデルがあります。

垂直スケールは、システムに処理能力を追加すると容量が増加するという原則に基づいています。 このスケーリング方法は、主にモノリシック アプリケーションと自己完結型のシステムに役立ちます。 インフラストラクチャとは別に、ほとんどの組織は、CPU や RAM の追加、ネットワーク容量の拡張など、物理環境の変更が必要になるため、垂直スケールには依存しなくなりました。 仮想化によって垂直方向の拡張は大幅に高速化されますが、特にパブリック クラウド環境では、ソフトウェアとシステムを新しい仮想マシンに移行する必要性によって混乱が生じる可能性があります。

水平スケールは、利用可能なリソースの合計を増やすことで処理能力を高めるアーキテクチャ上のアプローチです。 これは、アプリケーション、サービス、またはシステムの複数のインスタンスに処理能力を分散することによって実現されます。 これは、リソースを移行するのではなく複製することに依存するため、現在最も一般的なスケーリング方法です。 さらに、水平スケールでは垂直スケールよりも多様なアーキテクチャ オプションが提供されるため、すべてのアプリケーションと API に適しています。  

したがって、最新のアプリ配信パターンが水平スケールの原則に基づいていることは驚くべきことではありません。

アプリ配信パターン

単に水平スケールを選択するだけでは議論は終わりません。

決定が下されると (通常はデフォルトの決定です)、追加の考慮事項に基づいて実装に関するアーキテクチャ上の決定が行われる必要があります。 その決定に取り組む最も簡単な方法は、 『The Art of Scalability』という本で説明されているスケール キューブのレンズを使用することです。

簡単に言えば、スケール キューブには x、y、z の 3 つの軸があります。 それぞれが負荷分散アーキテクチャ パターンにマッピングされます。 これらの各パターンは、さまざまな種類のアプリケーションと API を前提として、パフォーマンスと可用性に関連する特定の結果を満たすのに適しています。

デジタル サービスでは、パフォーマンスとリソース消費を同時に最適化するために、複数のパターンを組み込んだアーキテクチャが使用される可能性があります。 このアプローチでは、すべてのコンポーネント、それらの相互作用、ユーザーからアプリへのリクエストの流れ方などを考慮する必要があるため、システム思考が必要です。

X 軸スケール

X 軸パターンは最も基本的なパターンです。 これは水平複製に基づいており、作業の大部分は負荷分散アルゴリズムによって実行されます。 これは最も単純なパターンであり、私が「Plain Old Load Balancing (POLB)」と呼んでいる結果になります。

このように呼ぶのは、アーキテクチャが単純で、アプリケーション層でリクエストやレスポンスとやり取りする最新のロード バランサーの高度な機能を活用していないためです。

このパターンでは、アプリケーションが複製され、構成された負荷分散アルゴリズムの決定に基づいてリクエストがインスタンスに転送されます。 

このパターンは TCP (レイヤー 4) と組み合わせて使用されることが多いため、HTTP (レイヤー 7) の検査に依存する他のパターンよりもパフォーマンス上の利点があります。 主に、接続はプロキシされるのではなく、つなぎ合わされるので、最初の接続後にロード バランサーが実質的にネットワーク ホップになります。 これにより、全体的なパフォーマンスは向上しますが、最初の接続後にロード バランサーが要求と応答を検査したり、それに基づいて処理したりする機能が失われます。 X 軸アーキテクチャは可用性の確保に優れ、パフォーマンスも高いため、ファイアウォールやアプリケーション ゲートウェイなどのインフラストラクチャやセキュリティ サービスを拡張するためによく使用されます。 

さまざまな従来のアプリケーション (モノリス、3 層 Web、クライアント サーバー) は、このパターンを使用してスケーリングされる傾向があります。これは、これらのアプリケーションが、最新のアプリケーション配信アーキテクチャに活用できるより個別のコンポーネントに分解されることはまれであるためです。

Y 軸スケール

このパターンは機能分解に基づいており、アプリ配信のアプリケーション層 (レイヤー 7) 機能を活用して、システム全体ではなく機能に基づいてスケーリングします。 Y 軸パターンは、レイヤー 7 ルーティングがアプリ配信アーキテクチャ ツールボックスの重要なツールとなる最初のパターンです。

一般に、y ベースおよび z ベースのパターンでは、レイヤー 7 ルーティングを利用してプールを選択し、次に負荷分散アルゴリズムを使用して特定のリソースを選択します。 これは、レイヤー 7 ルーティングが使用されない基本的な x パターンとは異なります。

このパターンは、レイヤー 7 (通常は HTTP) での操作を想定しており、何らかの変数を使用して、アプリケーションまたはサービスの特定のインスタンスにトラフィックを分散します。 たとえば、URI に/login というパターンが見つかった場合、ロード バランサーは、構成された負荷分散アルゴリズムに基づいて、ログイン要求のみを処理するアプリ インスタンスのプールからインスタンスを選択します。 変数は、リクエスト ヘッダーまたはリクエストのペイロード内の任意のものになります。 これにより、エージェントベースのルーティング、API ルーティング、コンテンツベースのルーティング (イメージ、スクリプトなど) が可能になります。

アプリケーション インスタンスはクローンである場合があります。 これは、リクエスト内の変数によって識別できるアプリの使用状況に差異がある場合によく発生します。 たとえば、ログイン機能チェックアウト機能 URI に基づくリクエスト、HTTP ヘッダーの値、またはリクエスト ペイロードの値によって識別される場合があります。 Y 軸パターンを適用すると、従来のアプリケーションを機能に基づいて拡張できるようになります。これにより、他の機能の期待されるパフォーマンスを維持しながら、大量の機能の処理に多くのリソースを割り当てることができるため、リソースの使用効率が向上します。  

従来のアプリケーションを機能的に拡張するために Y 軸パターンを使用するようになったのは、現在アプリケーションを機能的に分解するマイクロサービスが普及する前からのことです。 Y 軸パターンはマイクロサービスにも適用可能であり、実際、このパターンは現在、イングレス コントローラーによって実装されています。 賢明な読者は、このパターンが API にも適用可能であることに気付くでしょう。API は HTTP (レイヤー 7) 構造に依存しているため、API ゲートウェイがこの基本パターンを活用するのは当然のことです。

このパターンは、Web 2.0 の初期にeBay によって普及しました。 そのスケーラビリティ アーキテクチャには、機能を個別のアプリケーション プールに分割することが含まれていました。 販売機能は 1 セットのアプリケーション サーバーによって提供され、入札は別のセットによって、検索はさらに別のセットによって提供されていました。 合計で、約 16,000 台のアプリケーション サーバーを 220 個の異なるプールに編成しました。 これにより、機能の需要とリソース消費に応じて、各プールを互いに独立して拡張できるようになりました。 さらに、リソースの依存関係を分離して合理化することも可能になりました。たとえば、販売プールはバックエンド リソースの比較的小さなサブセットとのみ通信すれば済みます。

Y 軸パターンは、画像などの異なるタイプのコンテンツ要求を 1 つのリソース プールに分散し、他のコンテンツ タイプを他のリソース プールに分散するなど、異なるタイプのコンテンツ要求を分散するためにも使用できます。

Y 軸を使用して負荷を分散すると、デジタル サービスのコンポーネントを個別に拡張できるようになり、リソース使用率の点では X 軸パターンよりもはるかに効率的になります。 これにより、サービス層またはアプリケーション層での構成の最適化が可能になり、Web サーバーまたはアプリケーション サーバーの特定の変数を調整して特定のコンテンツ タイプを最適化することで、パフォーマンスを向上させることができます。  

Z 軸スケール

Z 軸パターンは、ソーシャル メディアとインターネット全体の爆発的な成長により、必要性から人気が出ました。 これは本質的には、通常はユーザー名やデバイス識別子などの特定の変数に基づいて追加のセグメンテーションが適用された Y 軸のスケーリング パターンです。

このパターンでは、データシャーディングから派生した手法を使用してアーキテクチャの差別化が可能になります。

このパターンは、データベースで使用される原則を適用し、リクエスト内のデータの一部に基づいてリクエストを分散します。 これは、データ層のボトルネックの解決を支援するだけでなく、データ主権ルールへの準拠を保証する手段としても使用できます。 識別可能な(通常は一意の)変数を使用して、水平にスケーリングされたリソース プール全体にリクエストをルーティングします。 このパターンは通常、特定のサービスまたはアプリケーションに対する大量のリクエストなど、高いスループットが必要な場合に使用されます。

Z 軸パターンは、数百万台に及ぶエッジ デバイスや IoT デバイスの管理に特に役立ちます。 デバイス識別子をシャーディング要求の基本パターンとして使用することで、データ転送速度を大幅に向上させることができます。 このデータはデバイスに固有であり、安全に分割できるため、リモート (クラウドまたはデータ センター) の場所に構成を保存するデバイスに特に役立ちます。

高負荷時のデータアクセスはパフォーマンスを大幅に低下させる可能性があるため、このパターンではパフォーマンスが向上する傾向があります。 したがって、データ アクセスを複数のインスタンスに分割することで、負荷が軽減され、パフォーマンスが向上します。 これにはデータの整合性に対する細心の注意が必要であり、共有データを分割するために使用すると一貫性の問題が発生する可能性があります。 Meta は、全体的なアーキテクチャの一部としてサービス シャーディングを開発したときに、シャーディングの話題を高めました。 高性能でスケーラブルなアプリ配信アーキテクチャの開発に細心の注意を払っていることは、アプリ配信を大規模なアーキテクチャ内の正式な層として認識することで大きなメリットが得られることを示す優れた例です。

プライマリ以外のデータ ソースにアクセスするサービスの場合、Z 軸パターンを使用すると、システム全体のデータ品質に大きな影響を与えることなく、スループットを向上させることができます。 このアプローチにより、アプリケーションまたは API の特定のインスタンスをデータ ソースに結び付けるためのコードを追加する必要性が軽減され、代わりにインスタンス レベルでのデータ コネクタの構成とアプリ配信ルーティングの組み合わせに依存して、適切なデータ ソースが使用されるようになります。

スケールの秘訣はアプリ配信アーキテクチャです

デジタル サービスが提供される今日の世界では、単一のアプリ配信パターンのみを使用して、高性能で信頼性の高いデジタル サービスを構築することはまれです。 これは、デジタル サービス自体の複雑さと、デバイス、人間、ソフトウェアにまたがる「ユーザー」の多様性の増大によるものです。

したがって、アーキテクチャ上のアプローチでは、デジタル サービス全体でアプリ配信パターンを最大限に活用して、ユーザーに最適なエクスペリエンスを提供することが検討されます。

アーキテクチャソリューションは、デジタルサービスを構成するサービスやアプリケーションに大きく依存するため、「正しい」または「間違った」というソリューションは存在しません。ただし、そのようなソリューションは、負荷分散アルゴリズムのみに基づくべきではありません。

実際、負荷分散パターン内で負荷をどのように分散するかの選択は、特定のアプリまたは API に対して適切なアーキテクチャの選択を行うことほど重要ではないため、アルゴリズムの選択については言及されていないことに注意する必要があります。

これは、アプリ配信を分野として推進する要因の 1 つです。 今日、アプリの配信とセキュリティが使用され、実装される方法は、Web サーバーの単純な規模をはるかに超えています。 その実装はパフォーマンスや可用性に影響を与え、最終的にはビジネス成果を左右する可能性があります。 したがって、組織は、設計ツールボックス内の戦略的かつアーキテクチャ的なツールとしてアプリ配信に取り組むことが重要です。

負荷分散は、スケールのための中核的な技術要件であり続けます。 アプリの配信パターンと、それが負荷分散をどのように活用するかを理解することで、デジタル サービスのスケールとパフォーマンスの設計について、より良い視点が得られます。特に、これらのサービスがハイブリッドであり、API と最新のアプリと従来のアプリの両方が混在している場合に、その可能性が高まります。