Share via


Utiliser Azure Cosmos DB comme fournisseur d’état de session et de mise en cache ASP.NET

S’APPLIQUE À : NoSQL

La session et le fournisseur de cache de Azure Cosmos DB vous permettent d’utiliser Azure Cosmos DB et de tirer parti de ses capacités de faible latence et de mise à l’échelle globale pour le stockage des données d’état de session et comme un cache distribué au sein de votre application.

Qu’est-ce que l’état de session ?

L'État de session est une donnée utilisateur qui effectue le suivi d’un utilisateur qui parcourt une application Web pendant un certain temps, au sein du même navigateur. L’état de session expire et se limite aux interactions qu’un navigateur particulier a et qui ne s’étend pas entre les navigateurs. Elles sont considérées comme des données éphémères, si elles ne sont pas présentes, elles ne perturberont pas l’application. Toutefois, lorsqu’elles existent, l’expérience est plus rapide pour l’utilisateur, car l’application Web n’a pas besoin de les extraire à chaque demande du navigateur pour le même utilisateur.

Elles sont souvent sauvegardées par un mécanisme de stockage, qui peut, dans certains cas, être externe au serveur Web actuel et permettre l’équilibrage de charge des requêtes du même navigateur sur plusieurs serveurs Web pour obtenir une plus grande évolutivité.

Le fournisseur d’état de session le plus simple est le fournisseur en mémoire qui stocke uniquement les données sur la mémoire du serveur Web local et requiert que l’application utilise leRoutage des demandes d’applications. Cela rend la session de navigateur rémanente sur un serveur Web particulier (toutes les demandes pour ce navigateur doivent toujours se trouver sur le même serveur Web). Le fournisseur fonctionne bien sur des scénarios simples, mais l’exigence d’adhérence peut poser des problèmes d’équilibrage de charge lorsque les applications Web sont mises à l’échelle.

De nombreux fournisseurs de stockage externes sont disponibles, qui peuvent stocker les données de session d’une manière qui peut être lue et accessible par plusieurs serveurs Web sans nécessiter d’adhérence de session et permettre une mise à l’échelle supérieure.

Scénarios d’état de session

Azure Cosmos DB peut être utilisé comme fournisseur d’état de session via le package d’extension Microsoft.Extensions.Caching.Cosmos. Il utilise le kit de développement logiciel (SDK) .NET Azure Cosmos DB, en se servant d’un conteneur comme stockage de session effectif basé sur une approche clé/valeur où la clé est l’identificateur de session.

Une fois le package ajouté, vous pouvez l’utiliser AddCosmosCache dans le cadre de votre processus de démarrage (services. AddSession et aapp.UseSession sont des étapes d’initialisation courantes requises pour tout fournisseur d’état de session) :

public void ConfigureServices(IServiceCollection services)
{
  /* Other service configurations */
  services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
  {
      CosmosClientBuilder clientBuilder = new CosmosClientBuilder("myConnectionString")
        .WithApplicationRegion("West US");
      cacheOptions.ContainerName = "myContainer";
      cacheOptions.DatabaseName = "myDatabase";
      cacheOptions.ClientBuilder = clientBuilder;
      /* Creates the container if it does not exist */
      cacheOptions.CreateIfNotExists = true; 
  });

  services.AddSession(options =>
  {
      options.IdleTimeout = TimeSpan.FromSeconds(3600);
      options.Cookie.IsEssential = true;
  });
  /* Other service configurations */
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    /* Other configurations */

    app.UseSession();

    /* app.UseEndpoints and other configurations */
}

Vous spécifiez la base de données et le conteneur dans lesquels stocker l’état de session, ou les créez facultativement s’ils n’existent pas à l’aide de l’attribut CreateIfNotExists.

Important

Si vous fournissez un conteneur existant au lieu d’utiliser CreateIfNotExists, assurez-vous qu’il a le temps de vivre activé.

Vous pouvez personnaliser la configuration de votre client du kit de développement logiciel (SDK) à l’aide de CosmosClientBuilder ou, si votre application utilise déjà un CosmosClient pour d’autres opérations avec Azure Cosmos DB, vous pouvez également l’injecter dans le fournisseur :

services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
    cacheOptions.ContainerName = "myContainer";
    cacheOptions.DatabaseName = "myDatabase";
    cacheOptions.CosmosClient = preExistingClient;
    /* Creates the container if it does not exist */
    cacheOptions.CreateIfNotExists = true; 
});

Après cela, vous pouvez utiliser des sessions ASP.NET Core comme avec n’importe quel autre fournisseur et utiliser l’objet HttpContext. Session. N’oubliez pas de toujours essayer de charger vos informations de session de manière asynchrone, conformément aux recommandations ASP.NET .

Scénarios de cache distribué

Comme le fournisseur Azure Cosmos DB implémente l’interface IDistributedCache pour agir en tant que fournisseur de cache distribué, il peut également être utilisé pour toute application nécessitant un cache distribué, pas uniquement pour une application web nécessitant un fournisseur d’état de session performant et distribué.

Les caches distribués nécessitent une cohérence des données pour fournir aux instances indépendantes le pouvoir de partager ces données mises en cache. Lorsque vous utilisez le fournisseur Azure Cosmos DB, vous pouvez :

  • utiliser votre compte Azure Cosmos DB dans la Cohérence de session si vous pouvez activer Application Request Routing et formuler des requêtes adhérent à une instance particulière.
  • utiliser votre compte Azure Cosmos DB en obsolescence limitée ou cohérence forte sans exiger d’adhérence de demande. Cela fournit la plus grande échelle en termes de répartition de la charge entre vos instances.

Pour utiliser le fournisseur Azure Cosmos DB comme cache distribué, celui-ci doit être inscrit dans ConfiguredServices avec l’appelservices.AddCosmosCache. Une fois effectué, tout constructeur dans l’application peut demander au cache en référençant IDistributedCache et il recevra une instance injectée par injection de dépendance à utiliser :

public class MyBusinessClass
{
    private readonly IDistributedCache cache;

    public MyBusinessClass(IDistributedCache cache)
    {
        this.cache = cache;
    }
    
    public async Task SomeOperationAsync()
    {
        string someCachedValue = await this.cache.GetStringAsync("someKey");
        /* Use the cache */
    }
}

Résolution et diagnostic des problèmes

S’APPLIQUE À : NoSQL

Dans la mesure où le fournisseur Azure Cosmos DB utilise le .NET SDK sous-jacent, l’ensemble des recommandations en matière de performances et guides de résolution des problèmes existants sont utiles pour comprendre les problèmes potentiels. Notez qu’il existe un moyen distinct d’accéder aux Diagnostics à partir des opérations de Azure Cosmos DB sous-jacentes, car celles-ci ne peuvent pas être exposées via les API IDistributedCache.

L’inscription du délégué de diagnostics facultatif vous permet de capturer et de journaliser de manière conditionnelle les diagnostics pour résoudre les problèmes liés à une latence élevée :

void captureDiagnostics(CosmosDiagnostics diagnostics)
{
    if (diagnostics.GetClientElapsedTime() > SomePredefinedThresholdTime)
    {
        Console.WriteLine(diagnostics.ToString());
    }
}

services.AddCosmosCache((CosmosCacheOptions cacheOptions) =>
{
    cacheOptions.DiagnosticsHandler = captureDiagnostics;
    /* other options */
});

Étapes suivantes

  • Pour plus d’informations sur la session Azure Cosmos DB et le fournisseur de caches, consultez le code source sur GitHub.
  • Essayez la session Azure Cosmos DB et le fournisseur de cache en explorant un exemple d’application web ASP.NET Core.
  • En savoir plus sur lescaches distribués sur .NET.