10个常见的API弹性设计模式与API Gateway
November 1, 2023
APIレジリエンスとは、さまざまな課題に耐えられる堅牢なAPIを構築し、それらが効果的に機能し続けることを保証することです。APIゲートウェイは、外部リクエストのエントリーポイントとして機能し、一般的なAPIレジリエンスパターンを考慮して異なるサービス間の通信を管理することで、この役割を果たします。人気のあるオープンソースのAPIゲートウェイであるApache APISIXは、APIのレジリエンスと堅牢性を強化するためのさまざまな機能を提供します。この記事では、10の一般的なAPIレジリエンス設計パターンと、それらをAPISIXを使用して実装する方法について探っていきます。
以下は、10のAPIレジリエンスパターンのリストです:
- レートリミット
- リトライ
- タイムアウト
- フォールバック
- キャッシュ
- 冗長性
- ヘルスチェック
- サーキットブレーカー
- バルクヘッド
- フォールトインジェクション
APIレジリエンスとは何か?
APIレジリエンスとは、エラー、高トラフィック、または予期しない状況に直面しても、APIが一貫して確実に意図した機能を実行する能力を指します。これは、障害を避けることではなく、障害が発生することを受け入れ、ダウンタイムやデータ損失を回避する方法でそれに対応することです。レジリエンスの目標は、障害の後にアプリケーションを完全に機能する状態に戻すことです。レジリエントなAPIは、API自体、依存サービス、またはネットワークの問題や遅延、APIバージョンの互換性の問題、環境の変化や予期しないユーザーの行動による問題など、外部要因による障害を優雅に処理するように構築されています。
なぜAPIゲートウェイでAPIレジリエンスを実現するのか?
多くの既存のソフトウェア開発フレームワークには、APIが利用可能で応答性が高く、正確であることを保証するための一連のプラクティスとパターンが含まれています。しかし、個々のサービスやシステムの他の部分ではなく、APIゲートウェイレベルでAPIレジリエンスを実装することには、いくつかの戦略的利点があります。
1. 集中管理: APIゲートウェイは、すべてのAPIリクエストの中央エントリーポイントとして機能し、すべてのサービスに対してレジリエンスパターンを統一して管理および適用するユニークな機会を提供します。この集中化により、レジリエンス機能の実装とメンテナンスが簡素化されます。
2. 一貫性: APIゲートウェイでレジリエンスを処理することで、すべてのサービスに対して障害処理、レートリミット、タイムアウト、その他のレジリエンス戦略を一貫して適用できます。この一貫性は、信頼性が高く予測可能なシステム動作を維持するために重要です。
3. 複雑さの軽減: 各マイクロサービスにレジリエンス機能を実装すると、重複した作業と複雑さが増す可能性があります。APIゲートウェイはこれらの懸念を抽象化し、サービス開発者がビジネスロジックに集中できるようにします。
4. リソース利用の改善: APIゲートウェイはリソースを効率的に管理し、トラフィックを分散させることができるため、単一のサービスが過負荷になることを防ぎます。この負荷分散は、システム全体のレジリエンスに貢献します。
5. 監視とログの容易化: すべてのAPIトラフィックが流れる単一のポイントを持つことで、サービスの健全性を監視し、問題をログに記録することが容易になります。この集中化されたビューは、問題を迅速に特定して対応するために非常に貴重です。
6. セキュリティの簡素化: 認証、認可、暗号化などのセキュリティ対策をAPIゲートウェイで一貫して適用することで、すべてのサービスが冗長な設定なしに保護されます。
7. パフォーマンスの向上: APIゲートウェイはキャッシュとレスポンスの集約を実装できるため、バックエンドサービスへの呼び出し回数を減らし、システム全体のパフォーマンスを向上させます。
8. 優雅な劣化: サービス障害が発生した場合、APIゲートウェイはトラフィックをリルートしたり、フォールバックレスポンスを提供したりして、システムが優雅に劣化し、機能を提供し続けることを保証します。
9. 迅速な回復: APIゲートウェイの集中化された性質により、修正や更新を迅速に実装できるため、障害後にシステムを迅速に完全な機能状態に復元できます。
10. クライアントインタラクションの簡素化: クライアントはAPIゲートウェイとのみ対話する必要があり、APIゲートウェイは一貫性と信頼性のあるインターフェースを提供し、基盤となるマイクロサービスの複雑さを抽象化します。
開発の観点から見ても、APIゲートウェイアプローチは、一般的に使用されるレジリエンスパターンを実装するための時間を短縮します。典型的なカンファレンスアプリのサービス間のAPI通信の例を通じて、各パターンを発見し、それらを有効にする方法を理解しましょう。
この投稿は主に理論的な部分に焦点を当てており、関連するドキュメントへの参照を提供します。開発者は各リンクを確認し、提供されたガイドを参照してこれらのパターンを実装できます。APISIXを使用すると、Admin API、静的YAMLファイル、またはAPISIX Dashboardを使用してこれらの設計パターンを設定できます。
1. レートリミット
名前が示すように、レートリミットは、クライアントが特定の期間内にできるリクエストの数を制御します。APISIXは、レートリミットを設定するためのlimit-reqプラグインを提供します。このプラグインを使用すると、個々のリクエストのプロパティ(特定のユーザー、クライアントアプリケーション、または場所からのリクエストが多すぎる場合)に基づいてルールを定義し、APIが過剰なリクエストに圧倒されないようにします。
レートリミットポリシーは、未承認ユーザーへのアクセスを制限するためにも使用できます。プラグインの使用方法を確認して、レートリミットを設定してください。
2. リトライ
リトライパターンは、APIリクエストが失敗した場合に自動的に再試行することを含みます。APISIXでは、Upstreamオブジェクトに対してリトライメカニズムを設定し、再試行回数と再試行を試みる条件を指定できます。
リトライプロパティを設定することで、APISIXは前回のリクエストがタイムアウトした場合やネットワークの問題で失敗した場合に、バックエンドのAttendeeサービスに自動的に再試行リクエストを送信します。
3. タイムアウト
タイムアウトを設定することで、バックエンドサービスが応答しない場合にリクエストが無期限にハングすることを防ぎます。APISIXでは、同じUpstreamオブジェクト設定でAPIのタイムアウトを設定でき、リクエストが応答に時間がかかりすぎた場合に終了することを保証します。
Attendeeサービスが遅い応答を返す場合、APISIXはフェイルファストパターンを適用し、クライアントアプリのリクエストに迅速に応答して、システム全体の応答性を向上させることができます。
4. フォールバック
フォールバックパターンは、サービスが利用できない場合にデフォルトのレスポンスを提供します。APISIXでは、upstreamの優先順位を定義できます。プライマリエンドポイントが失敗した場合、APIゲートウェイはトラフィックをセカンダリサービスにリダイレクトするか、response-rewriteプラグインを使用してHTTP 500などのサービス障害の場合に事前定義されたレスポンスを返すことができます。
または、proxy-cacheプラグインを使用してレスポンスをキャッシュし、バックエンドがダウンしている場合にそれらを提供することもできます。たとえば、Attendeeサービスがダウンしている場合、モバイルアプリはキャッシュされたカンファレンス参加者リストを表示します。
5. キャッシュ
レスポンスをキャッシュすることで、バックエンドサービスの負荷を大幅に軽減できます。APISIXは、proxy-cacheプラグインを提供し、レスポンスをキャッシュしてAPIゲートウェイから直接提供することで、遅延を減らし、パフォーマンスを向上させます。
Cache API responsesチュートリアルを確認して、proxy-cacheプラグインの使用方法を学んでください。
6. 冗長性
すべてのAPIゲートウェイは、ロードバランシングのような共通の機能を提供し、着信APIリクエストを複数のバックエンドサービス(ノードまたはインスタンス)に分散させます。冗長なインスタンスを持つことで、システムは不規則なイベントに対してより堅牢になります。APISIXは、ラウンドロビン、最小接続、一貫性のあるハッシュなど、さまざまなアルゴリズムをサポートしています。
Attendeeサービスの場合、2つのインスタンスを立ち上げることができ、サーバーAがダウンした場合、リクエストは2番目のサーバーによって処理されます。
7. ヘルスチェック
ヘルスチェックは、アップストリームサービスの応答性に基づいて、それらが健全かどうかを判断するメカニズムです。APISIXは、upstream active health checksを使用して、サービスが利用可能かどうかを識別します。ヘルスチェックが有効になっている場合、APISIXは健全と見なされるアップストリームサービスにのみリクエストを転送し、不健全と見なされるサービスにはリクエストを転送しません。
APIの健全性を定期的にチェックするために、APISIXはアップストリームサービスのヘルスエンドポイントのHTTPパスが必要です。したがって、まずAttendeeサービスに/health
エンドポイントを追加する必要があります。
8. サーキットブレーカー
サーキットブレーカーパターンは、システムが失敗する可能性が高いサービスへの呼び出しを行わないようにし、システムを連鎖的な障害から保護します。APISIXは、Route設定でapi-breakerプラグインを使用するか、upstream passive health checksを有効にするかの2つのオプションを提供します。どちらの方法でも、障害を処理し、サービスが失敗したり遅くなったりした場合にアップストリームサービスへの継続的な再試行を防ぎます。
APISIXは、最近発生した障害の数を監視し、この情報を使用して操作を続行するか、すぐに例外を返すかを決定します。
9. バルクヘッド
バルクヘッドパターンは、アプリケーション内の要素を分離し、システムの一部が失敗したり過負荷になった場合でも、システムの他の部分が機能し続けることを保証します。Attendeeサービスからの読み取り操作が重いトラフィックや問題によって、Attendeeサービスへの書き込み操作の可用性とパフォーマンスに影響を与えないようにするために、APISIXを使用してバルクヘッドパターンを実装できます。
APIゲートウェイで2つのアップストリームノードに対して別々のルートエンドポイントを作成し、すべての書き込みリクエストをサービスAに、すべての読み取りリクエストをサービスBに転送します。
10. カオステスト
カオステストは、APIが本番環境でレジリエントであることを保証するのに役立ちます。これを使用して、アプリケーションやマイクロサービスAPIのレジリエンスをさまざまなタイプの障害に対して評価し、強化することができます。この方法では、意図的に遅延を導入したり、指定されたエラーコードでリクエストを強制終了したりして、サービス障害、過剰なサービス需要、重大なネットワーク遅延、ネットワークセグメンテーションなどのさまざまな悪条件をシミュレートできます。
APISIXのFault Injection Pluginも、Attendeeサービスでのエラーや遅延などのさまざまな障害シナリオをシミュレートして、クライアントアプリがそれらにどのように反応するかをテストするための同じメカニズムを提供します。
結論
このブログ投稿では、10の一般的なAPIレジリエンス設計パターンを概説し、それらをAPISIXを使用して効果的に実装する方法をデモンストレーションしました。APIゲートウェイレベルでレジリエンス戦略を集中化することで、組織はAPIトラフィックとエラー処理の一貫性、簡素化、効率的な管理を実現できます。