このエントリは2019/06/19現在の情報に基づいています。将来の機能追加・廃止に伴い、記載内容との乖離が発生する可能性があります。また、外部キャッシュ機能は本日現在パブリック・プレビューです。
先日のエントリにおけるキャッシュ・ポリシーの設定情報を記載しておく。
Azure API Managementと外部キャッシュ (1)
https://logico-jp.io/2019/06/19/external-cache-for-azure-api-management-part1/
応答キャッシュ
応答キャッシュの場合、Query Parameterで指定した値はキーにできるが、Path Parameterで指定した値をキーにできない点に注意。以下の例では、inboundのcache-lookupでcodeというQuery Parameterをキーとして利用し、キャッシュに問い合わせしている。
キャッシュから取得 / Get from cache
https://docs.microsoft.com/azure/api-management/api-management-caching-policies#GetFromCache
outboundのcache-storeでは、有効期限が3600秒、つまり1時間と指定しているだけで、値に対して何も指定をしていない。このことからも、応答キャッシュではレスポンスをそのままキャッシュに格納していることがわかる。
キャッシュに格納 / Store to cache
https://docs.microsoft.com/azure/api-management/api-management-caching-policies#StoreToCache
<policies>
<inbound>
<base />
<set-backend-service id="apim-generated-policy" backend-id="domestic" />
<cache-lookup vary-by-developer="false" vary-by-developer-groups="false" downstream-caching-type="none" caching-type="external">
<vary-by-query-parameter>code</vary-by-query-parameter>
</cache-lookup>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<cache-store duration="3600" />
</outbound>
<on-error>
<base />
</on-error>
</policies>
値キャッシュ
先日のエントリでは、値キャッシュで応答キャッシュのような振る舞いをさせるために、以下のようなロジックを構成した。
- inbound
- コードをPath Parameterから取得
- コードをキーとしてキャッシュに問い合わせる。
- 値がある場合、取得した値を使ってInboundパイプラインで応答を返す
- 値がない場合、バックエンドサービスを呼び出す
- Outbound
- バックエンドの応答をキャッシュに文字列として格納。このとき、後続でもバックエンドサービスからの応答を利用できるよう、preserveContentフラグはONを指定
- 呼び出し側に応答を返す
<policies>
<inbound>
<base />
<set-backend-service id="apim-generated-policy" backend-id="domestic" />
<set-variable name="code" value="@(context.Request.MatchedParameters["code"])" />
<cache-lookup-value key="@((string)(context.Variables["code"]))" default-value="" variable-name="response" caching-type="external" />
<choose>
<when condition="@(context.Variables["response"] != "")">
<return-response>
<set-status code="200" />
<set-body>@((string)context.Variables["response"])</set-body>
</return-response>
</when>
</choose>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<cache-store-value key="@((string)context.Variables["code"])" value="@(context.Response.Body.As<string>(preserveContent: true))" caching-type="external" duration="3600" />
</outbound>
<on-error>
<base />
</on-error>
</policies>