適用対象: すべての API Management レベル
API 要求と関連情報に対する応答を格納および取得するように Azure API Management でキャッシュを構成します。 バックエンド サービスからの応答を格納することで、API Management は後続の同じ要求をキャッシュから直接処理できるため、バックエンド サービスを繰り返し呼び出す必要が減ります。 キャッシュにより、API のパフォーマンスが向上し、バックエンドの負荷が軽減され、API Management を使用して API を呼び出すお客様の全体的なエクスペリエンスが向上します。
この記事では、API Management のキャッシュ オプションについて説明し、主要なシナリオと構成に関する考慮事項について説明します。
Important
キャッシュには、キャッシュ サービス (API Management サービスの一部として自動的にデプロイされる内部キャッシュ、またはユーザーがデプロイした外部キャッシュ) と、API 要求にキャッシュを適用する方法を指定するための キャッシュ ポリシー の構成の両方が必要です。
キャッシュ サービスのオプション
Azure API Management には、さまざまなパフォーマンスとアーキテクチャの要件を満たすために、次のキャッシュ サービス オプションが用意されています。
内部 (組み込み): 内部 (組み込み) キャッシュは、( 従量課金 レベルを除く) すべての API Management サービス レベルで自動的にプロビジョニングされます。 内部キャッシュの実装は、クラシック レベル (Developer、 Basic、 Standard、 Premium) と v2 レベル (Basic v2、 Standard v2、 Premium v2) で異なります。 v2 レベルの組み込みキャッシュにより、信頼性が向上します。 組み込みキャッシュを使用したキャッシュの詳細について説明します。
外部 キャッシュ: パフォーマンスと永続化を強化するために、必要に応じて、任意の API Management サービス レベルまたはゲートウェイで使用するように、 Azure Managed Redis などの外部 Redis と互換性のあるキャッシュを構成します。 Azure Managed Redis を使用した外部キャッシュの設定の詳細について説明します。
次の表は、内部キャッシュと外部キャッシュの機能を比較しています。
| 能力 | 内部 | External |
|---|---|---|
| 自動プロビジョニングと管理 | ✔️ | ❌ |
| 追加コスト | ❌ | ✔️ |
| カスタム構成 | ❌ | ✔️ |
| すべての層とゲートウェイでの可用性 | 従量課金レベルまたはセルフホステッド ゲートウェイでは使用できません | ✔️ |
| リージョンストレージ | API Management インスタンスと同じリージョンで提供され、スケール ユニット間で共有されるキャッシュ。 複数リージョンのデプロイでは、各リージョンに独自のキャッシュがあります。 |
お客様の好みに応じて |
| 永続的ストレージ | v2 層での永続性。 クラシック レベル (Developer、 Basic、 Standard、 Premium) では、サービスの更新が行われるとキャッシュ コンテンツは保持 されません 。 |
✔️ |
| レベルごとの制限 | キャッシュ サイズ はサービス レベルによって異なります | 制限されない |
| 複数の API Management インスタンスによる共有アクセス | ❌ | ✔️ |
| セマンティック キャッシュの サポート | ❌ | ✔️ |
| データのプリロードと消去のサポート | ❌ | ✔️ |
キャッシュのシナリオ
次の表のようなシナリオでは、Azure API Management でキャッシュを使用します。
| Scenario | Description | キャッシュの種類 | キャッシュの可用性または接続性が失われた動作 |
|---|---|---|---|
| クライアント エクスペリエンスを最適化する | クライアントの繰り返し要求処理を高速化します。 | 内部または外部 | バックエンドは要求を処理し、キャッシュが使用できない場合はフル ロードを処理する必要があります。 |
| コストとバックエンドのスケーリングを制御する | バックエンドが完全なトラフィックに対してスケーリングされていない場合のバックエンドの負荷とコストを削減します。 | External | キャッシュとサービスの構成によって異なります。 推奨事項: 信頼性が最も高いキャッシュ サービス レベルを選択し、パフォーマンスを監視します。 |
| メタデータ ストア | cache-store-value を使用して、任意のデータをキャッシュに格納します。 | 内部または外部 | キャッシュとサービスの構成によって異なります。 |
Considerations:
キャッシュのシナリオでは、キャッシュの可用性または接続が失われる可能性を考慮してください。 API Management では、"ベスト エフォート" アプローチを使用して可用性をキャッシュします。 構成されたキャッシュを使用できない場合、キャッシュ ミスが発生し、既定ではバックエンド サービスへの要求が続行されます。
API Management クラシック レベルでは、内部キャッシュは揮発性であり、サービスの更新間で保持されません。 サービスの更新中、内部キャッシュは、一度に最大 50% のキャッシュを含む段階的なプロセスでクリアされます。
注
サービス 更新プログラムの設定 (更新プログラムのメンテナンス期間など) を構成して、内部キャッシュの損失などの潜在的な顧客の影響を最小限に抑えることができます。
外部キャッシュを構成する場合は永続的である可能性がありますが、可用性と接続性を確保する責任があります。
キャッシュが使用できないときに過負荷になる可能性があるトラフィックの急増からバックエンド サービスを保護するには、キャッシュ参照ポリシーの直後にレート制限ポリシー (レート制限 または キーごとのレート制限) を構成します。
キャッシュ ポリシー
キャッシュ ポリシーを構成して、Azure API Management で API 応答をキャッシュおよび取得する方法を制御します。
キャッシュ ポリシーの既定では、API Management は構成されている場合は外部キャッシュを使用し、それ以外の場合は組み込みキャッシュにフォールバックします。
API Management では、次の表に示すように、キャッシュ ポリシーがペアで提供されます。 ポリシー定義で、キャッシュされた応答を確認するために
inboundセクションでキャッシュ参照ポリシーを構成し、成功した応答をキャッシュに格納するキャッシュ ストア ポリシーをoutboundセクションに構成します。
| Policies | Description | Usage |
|---|---|---|
| cache-lookup / cache-store | - キャッシュから応答を取得する - 応答をキャッシュ要求に格納する |
- 同一の GET 要求に対してキャッシュから完全な API 応答を取得するために使用します |
| キャッシュ検索値 / キャッシュ保存値 | - キャッシュから特定の値を取得する - キャッシュに特定の値を格納する |
- 特定のキャッシュ キーを使用するカスタム キャッシュ シナリオに使用する |
| azure-openai-semantic-cache-lookup / azure-openai-semantic-cache-store | - 意味的に類似した応答が Azure OpenAI API 要求のキャッシュに存在するかどうかを確認する - Azure OpenAI API 要求の応答を格納する |
- Azure OpenAI チャット完了 API 要求に対する同様の応答を取得するために使用する |
| llm-セマンティックキャッシュルックアップ / llm-セマンティックキャッシュストア | - LLM API 要求のキャッシュにセマンティックに似た応答が存在するかどうかを確認する - LLM API 要求の応答を格納する |
- LLM チャット完了 API 要求に対する同様の応答を取得するために使用します |
ヒント
- キャッシュにエントリを格納するポリシーには、キャッシュされたエントリが保持される期間を指定する
duration属性が含まれます。 - キャッシュからキーによって識別される特定の値を削除するには、 cache-remove-value を使用します。
キャッシュ ポリシーの例
API Management のキャッシュ ポリシーの基本的な例を次に示します。 その他の例については、 キャッシュ ポリシー のリファレンス記事を参照してください。
応答のキャッシュ
バックエンド呼び出しなしで同じ要求を処理するために、完全な API 応答を内部キャッシュにキャッシュします。 この例では、キャッシュは 7 日間応答を格納します。
<policies>
<inbound>
<base />
<cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none" must-revalidate="true" caching-type="internal" >
<vary-by-query-parameter>version</vary-by-query-parameter>
</cache-lookup>
</inbound>
<outbound>
<cache-store duration="604800" />
<base />
</outbound>
</policies>
値のキャッシュ
複数の要求間で再利用するために、特定のデータ値をキャッシュします。
<policies>
<inbound>
<cache-lookup-value key="user-preferences" default-value="none" variable-name="preferences" />
<choose>
<when condition="@(context.Variables["preferences"].ToString() == "none")">
<!-- Load preferences from backend -->
<send-request mode="new" response-variable-name="prefsResponse">
<set-url>https://backend.api/user/preferences</set-url>
</send-request>
<cache-store-value key="user-preferences" value="@(((IResponse)context.Variables["prefsResponse"]).Body.As<string>())" duration="1800" />
</when>
</choose>
</inbound>
</policies>
レート制限保護
ベスト プラクティスとして、キャッシュ参照とレート制限を組み合わせてバックエンド サービスを保護します。
<policies>
<inbound>
<cache-lookup-value key="@("data-" + context.Request.IpAddress)" variable-name="cachedData" />
<choose>
<when condition="@(!context.Variables.ContainsKey("cachedData"))">
<rate-limit calls="10" renewal-period="60" />
<!-- Proceed to backend -->
</when>
<otherwise>
<!-- Return cached data without rate limiting -->
<return-response>
<set-body>@((string)context.Variables["cachedData"])</set-body>
</return-response>
</otherwise>
</choose>
</inbound>
</policies>
セキュリティに関する考慮事項
- 機密データ: 機密情報または個人情報を含む応答のキャッシュを回避する
- キャッシュ キー: キャッシュ キーがログや診断で機密情報を公開しないようにする
- アクセス制御: 外部キャッシュには、適切なネットワーク セキュリティとアクセス制御が必要です
- 暗号化: 外部キャッシュ インスタンスへの接続に TLS/SSL を使用する
関連コンテンツ
- API Management の キャッシュ ポリシーの 詳細
- Azure Managed Redis を使用して外部キャッシュを設定する
- 高度なシナリオでのカスタム キャッシュの例
- API Management の パフォーマンスとキャッシュ メトリックを監視する