web-dev-qa-db-ja.com

Azure関数とキャッシュ

入力トリガーがサービスバスメッセージで、出力がblobストレージになるAzure関数を開発する予定です。サービスバスメッセージには画像のURLが含まれ、関数は画像のサイズを事前定義された解像度に変更し、Azure BLOBストレージにアップロードします。

画像のサイズを変更する解像度はデータベースに保存され、Azure関数はデータベースを呼び出して、入力メッセージ内の画像に使用されるはずの解像度を知る必要があります。解像度は、実際には、入力メッセージのソースに基づいて構成されたマスターデータになります。

データベース呼び出しは、呼び出しごとにデータベースにアクセスする必要があるため、高価な呼び出しになります。データベースを呼び出さずにデータをキャッシュして使用する方法はありますか。メモリキャッシュのように?

14
Silly John

他の.NETアプリケーションで使用する通常のアプローチを自由に使用できます。

  • メモリにキャッシュできます。最も簡単な方法は、静的なディクショナリを宣言し、データベース値を内部に配置することです(必要に応じて並行ディクショナリを使用します)。キャッシュされた値は、同じインスタンスで実行される後続のすべての関数実行に再利用されます。インスタンスが5分間アイドル状態になった場合、またはアプリが追加のインスタンスにスケールアウトした場合、データベースを再度読み取る必要があります。

  • 分散キャッシュを使用できます。 Redis、機能コードからSDKを使用します。関数のステートレスな性質を保持しているため、少し良いかもしれませんが、もう少し費用がかかるかもしれません。テーブルストレージはRedisの実行可能な代替手段ですが、APIがより制限されています。

Azure Functions自体の「キャッシュ」機能はありません。追加のコードなしですぐに使用できます。

20
Mikhail Shilkov

Azure Cacheサービス( https://Azure.Microsoft.com/en-us/services/cache/ )を使用してデータをキャッシュできます。基本的に、データベースを常に呼び出すのではなく、Azure Functionで、Azureキャッシュを呼び出して、有効期限が切れていない場合に使用し、有効期限が切れているか設定されていない場合は、データベースを呼び出して値を取得し、適切な有効期限ロジックをキャッシュに追加します(タイムアウト後固定時間またはその他のカスタムロジック)。

5
user862268

Durable Functionsを使用して、アクティビティまたはサブオーケストレーションを介してデータベース呼び出しを行うことができます。戻り値は基本的にキャッシュされ、関数がリプレイされるたびに基本的な呼び出しを行わずに返されます。

4
Dennis

Redisはインメモリキャッシュであり、関数をクリーンに保つために使用できるカスタム出力バインディングがあります。

[FunctionName("SetPoco")]
public static async Task<IActionResult> SetPoco(
    [HttpTrigger("POST", Route = "poco/{key}")] HttpRequest request,
    [Redis(Key = "{key}")] IAsyncCollector<CustomObject> collector)
{
    string requestBody;
    using (var reader = new StreamReader(request.Body))
    {
        requestBody = reader.ReadToEnd();
        var value = JsonConvert.DeserializeObject<CustomObject>(requestBody);
        await collector.AddAsync(value);
    }
    return new OkObjectResult(requestBody);
}

プロジェクトへのリンク: https://github.com/daulet/Indigo.Functions#redis

ただし、メモリ内キャッシュによって関数のメモリ内を意味する場合、関数はステートレスであり、関数を実行している複数のホスト間でそのメモリを共有することはできないため、そうでない場合は強くお勧めします。これは Azure Functionsのベストプラクティス でも推奨されていません

2

CloudfrontやCloudflareなどを検討してください。 Microsoftが提供しているものが正確にはわかりません。

これは、APIおよびキャッシュリクエストの上に置かれ、それらを世界中に配信します。

これは、他のソリューションがここに提示されているものに加えて使用できますが、食べる方法で最も簡単なファの1つになる必要があります

0
Simon_Weaver