Nous prévoyons de développer une fonction Azure pour laquelle le déclencheur d'entrée est un message de bus de service et la sortie sera le stockage d'objets blob. Le message du bus de service contiendra une URL d'image et la fonction redimensionnera l'image à une résolution prédéfinie et sera téléchargée sur le stockage d'objets blob Azure.
La résolution à laquelle l'image doit être redimensionnée est stockée dans la base de données et la fonction Azure doit appeler la base de données pour connaître la résolution censée être utilisée pour l'image dans le message d'entrée. La résolution serait en réalité une donnée principale configurée en fonction de la source du message d'entrée.
Faire un appel à la base de données serait un appel coûteux, car il faudrait aller à la base de données pour chaque appel. Existe-t-il un moyen de mettre en cache les données et de les utiliser sans appeler la base de données. Comme dans la mémoire cache?
Vous êtes libre d'utiliser les approches habituelles que vous utiliseriez dans d'autres applications .NET:
Vous pouvez le mettre en cache en mémoire. Le moyen le plus simple consiste simplement à déclarer un dictionnaire statique et à y insérer les valeurs de la base de données (utilisez un dictionnaire simultané si nécessaire). Les valeurs mises en cache seront réutilisées pour toutes les exécutions de fonctions ultérieures exécutées sur la même instance. Si une instance devient inactive pendant 5 minutes ou si App passe à une instance supplémentaire, vous devrez relire la base de données.
Vous pouvez utiliser le cache distribué, par exemple. Redis, en utilisant son SDK à partir du code de fonction. Peut-être un peu plus agréable, puisque vous gardez la nature sans état de Functions, mais peut coûter un peu plus cher. Le stockage sur table est une alternative viable à Redis, mais avec une API plus limitée.
Il n’existe pas de fonctionnalité de "mise en cache" d’Azure Functions, qui serait prête à être utilisée sans code supplémentaire.
Vous pouvez utiliser Durable Functions et effectuer l'appel de la base de données via une activité ou une sous-orchestration. La valeur de retour est alors mise en cache pour vous et sera renvoyée sans effectuer à nouveau l'appel sous-jacent à chaque relecture de la fonction.
Vous pouvez utiliser le service Azure Cache ( https://Azure.Microsoft.com/en-us/services/cache/ ) pour mettre vos données en cache. Fondamentalement, dans votre fonction Azure au lieu d'appeler constamment la base de données, appelez le cache Azure et utilisez-le s'il n'est pas expiré et s'il a expiré ou n'est pas défini, appelez la base de données pour obtenir la valeur et remplir le cache avec la logique heure fixe ou une autre logique personnalisée).
Redis est un cache en mémoire et il existe une liaison de sortie personnalisée que vous pouvez utiliser pour garder votre fonction propre:
[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);
}
Lien vers le projet: https://github.com/daulet/Indigo.Functions#redis
Cependant, si par cache en mémoire, vous voulez dire en mémoire de la fonction, je le recommande vivement, car les fonctions sont censées être sans état et vous ne pourrez pas partager cette mémoire sur plusieurs hôtes exécutant votre fonction. Cela n'est également pas recommandé dans Meilleures pratiques Azure Functions
Pensez à quelque chose comme Cloudfront ou Cloudflare. Je ne sais pas exactement ce que propose Microsofts.
Cela placera au-dessus de votre API et de vos requêtes en cache, ainsi que de les distribuer dans le monde entier pour vous.
Ceci peut être utilisé en complément de toutes les autres solutions présentées ici, mais il doit être l’un des moyens les plus faciles à utiliser