2017-01-12 7 views
2

azure apiマネージャポリシーで特定の値をキャッシュしている場合、キャッシュをクリーンアップしてAPIから値を取得するためにアイテムを削除します。Azure Apiマネージャのcache-remove-valueポリシーでキャッシュアイテムが削除されない

cache-remove-valueポリシーを使用して値を削除しても、次回のAPIコールでキャッシュ内の値が検出されることがあります。ここでのサンプルコードは、次のとおり

<cache-store-value key="Key123" value="123" duration="300" /> 
    <cache-lookup-value key="Key123" variable-name="CacheVariable" /> 
    <cache-remove-value key="Key123" /> 
    <cache-lookup-value key="Key123" default-value="empty" variable-name="CacheVariable2" /> 
    <return-response> 
     <set-status code="504" reason="" /> 
     <set-body>@(context.Variables.GetValueOrDefault<string>("CacheVariable2"))</set-body> 
    </return-response> 

このコードは、基本的にキーKey123とキャッシュ項目が削除された後かが判明した場合に基づいて身体内の空の返し又は「123」。これは、常にキャッシュされた項目「123」の値を返します。

誰でもこの問題を経験したか、キャッシュをクリーンアップする方法を見つけましたか?

リトライを連続してチェックすると、2秒後、時には1分後にアイテムがクリーニングされることがあります。私はdelete呼び出しがバックグラウンドで非同期または待ち行列に入れられたコールだと思うので、継続的にチェックすることなくきれいにされているかどうかわからない。

UPDATE:今の実際の溶液として

、代わりに削除、Iは実際に1秒の持続時間及びダーティ値キャッシュ項目を更新します。

+0

。ほとんどの場合、この種の操作をブロックする必要はありません。これは、Redisキャッシュへの分散呼び出しを行うためです。興味深いことに、私は更新キャッシュが同じように動作することを期待しています。なぜ回避策で異なる動作が見られるのかわかりません。 –

+0

続行する前にcache-remove-valueが完了するまでポリシー処理は待機しませんが、cache-storeは実行します。だから、回避策は機能しますが、もっと良い方法があるはずです。 –

答えて

0

これは、キャッシュの削除要求がリクエスト処理パイプラインに関して非同期である、つまりAPIMがリクエストを続行する前にキャッシュ項目が削除されるのを待たず、削除要求の直後に引き続き検索できるためですまだ送られていません。

はあなたのシナリオに基づいて更新:なぜあなたは、このような何かをしようとしません。私はそれが非同期であるかどうかをチェックしますが、それは私は驚かないだろう

<policies> 
<inbound> 
    <base /> 
</inbound> 
<backend> 
    <retry condition="@(context.Response.StatusCode == 200)" count="10" interval="1"> 
     <choose> 
      <when condition="@(context.Variables.GetValueOrDefault("calledOnce", false))"> 
       <send-request mode="new" response-variable-name="response"> 
        <set-url>https://EXTERNAL-SERVICE-URL</set-url> 
        <set-method>GET</set-method> 
       </send-request> 
       <cache-store-value key="externalResponse" value="EXPRESSION-TO-EXTRACT-DATA" duration="300" /> 
       <!--... or even store whole response ...--> 
       <cache-store-value key="externalResponse" value="@((IResponse)context.Variables["response"])" duration="300" /> 
      </when> 
      <otherwise> 
       <cache-lookup-value key="externalResponse" variable-name="externalResponse" /> 

       <choose> 
        <when condition="@(context.Variables.ContainsKey("externalResponse"))"> 
         <!-- Do something with cached data --> 
        </when> 
        <otherwise> 
         <!-- Call extenal service and store in cache again --> 
        </otherwise> 
       </choose> 

       <set-variable name="calledOnce" value="@(true)" /> 
      </otherwise> 
     </choose> 
     <forward-request /> 
    </retry> 
</backend> 
<outbound> 
    <base /> 
</outbound> 

+0

この問題は、APIMが非同期アクションとしてキャッシュ削除アクションを再浮上させていないことです。キャッシュの削除に関する「待機」ポリシーを設定すると、「待機」句に非同期/待機可能なアクションのみを入れることができるという例外が発生します。 –

+0

待機ポリシーは、ポリシーを並行して実行し、いずれかまたはすべてが完了したときに続行する方法です。待機以外のこのようなポリシーは依然としてリクエスト処理をブロックします。一方、キャッシュの削除は、リクエスト処理をブロックすることはなく、途中でストア値をキャッシュすることもありません。あなたのシナリオは何ですか?このリクエスト処理中に生成された値でキャッシュを更新したため、値はすでに使用可能であり、取得するためにキャッシュに移動する必要はありません。 –

+0

私の場合: バックエンドの要求で使用される外部サービスからデータを取得します。値が有効かどうかわかりません。 呼び出しが成功すると、次の5分間に複数の呼び出しに必要となるため、値をキャッシュします。私が毎回外部サービスを呼び出すと、2秒のオーバーヘッドが加わり、私は落とそうとしています。 バックエンドエンジンが無効な応答を返した場合、キャッシュを消去して呼び出し側のアプリケーションに「再試行」を返して、次の呼び出しが行われ、更新された値を取得するために外部サービスを再度呼び出します。 –

関連する問題