Share via


Azure Cosmos DB gebruiken als een ASP.NET sessiestatus en cacheprovider

VAN TOEPASSING OP: NoSQL

Met de Azure Cosmos DB-sessie- en cacheprovider kunt u Azure Cosmos DB gebruiken en gebruikmaken van de mogelijkheden met lage latentie en wereldwijde schaal voor het opslaan van sessiestatusgegevens en als een gedistribueerde cache binnen uw toepassing.

Wat is de sessiestatus?

Sessiestatus is gebruikersgegevens waarmee een gebruiker gedurende een bepaalde periode in dezelfde browser door een webtoepassing bladert. De sessiestatus verloopt en is beperkt tot de interacties die een bepaalde browser heeft, die zich niet uitstrekken in verschillende browsers. Het wordt beschouwd als tijdelijke gegevens. Als deze niet aanwezig zijn, wordt de toepassing niet verbroken. Wanneer deze echter bestaat, wordt de ervaring voor de gebruiker sneller omdat de webtoepassing deze niet hoeft op te halen bij elke browseraanvraag voor dezelfde gebruiker.

Het wordt vaak ondersteund door een opslagmechanisme, dat in sommige gevallen extern kan zijn ten opzichte van de huidige webserver en taakverdelingsaanvragen van dezelfde browser op meerdere webservers kan inschakelen om een hogere schaalbaarheid te bereiken.

De eenvoudigste sessiestatusprovider is de in-memory provider die alleen gegevens opslaat in het lokale webservergeheugen en vereist dat de toepassing Toepassingsaanvraagroutering gebruikt. Hierdoor wordt de browsersessie op een bepaalde webserver geplakt (alle aanvragen voor die browser moeten altijd op dezelfde webserver terechtkomen). De provider werkt goed in eenvoudige scenario's, maar de vereiste voor persistentie kan problemen met de taakverdeling veroorzaken wanneer webtoepassingen worden geschaald.

Er zijn veel externe opslagproviders beschikbaar die de sessiegegevens kunnen opslaan op een manier die kan worden gelezen en geopend door meerdere webservers zonder dat er sessiestickerheid nodig is en die een hogere schaal mogelijk maken.

Scenario's voor sessiestatus

Azure Cosmos DB kan worden gebruikt als een sessiestatusprovider via het extensiepakket Microsoft.Extensions.Caching.Cosmos maakt gebruik van de Azure Cosmos DB .NET SDK, waarbij een container wordt gebruikt als een effectieve sessieopslag op basis van een sleutel/waarde-benadering waarbij de sleutel de sessie-id is.

Zodra het pakket is toegevoegd, kunt u gebruiken AddCosmosCache als onderdeel van uw opstartproces (services. AddSession en app. UseSession zijn algemene initialisatiestappen die vereist zijn voor elke sessiestatusprovider:

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 */
}

Wanneer u de database en container opgeeft die u de sessiestatus wilt opslaan en optioneel maakt u deze als ze niet bestaan met behulp van het CreateIfNotExists kenmerk.

Belangrijk

Als u een bestaande container opgeeft in plaats van te gebruiken CreateIfNotExists, moet u ervoor zorgen dat time to live is ingeschakeld.

U kunt uw SDK-clientconfiguratie aanpassen met behulp van de CosmosClientBuilder of als uw toepassing al gebruikmaakt van een CosmosClient voor andere bewerkingen met Azure Cosmos DB, kunt u deze ook injecteren in de provider:

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

Hierna kunt u ASP.NET Core-sessies gebruiken, zoals bij elke andere provider en het object HttpContext.Session gebruiken. Houd er rekening mee dat u altijd probeert uw sessiegegevens asynchroon te laden volgens de ASP.NET aanbevelingen.

Scenario's voor gedistribueerde cache

Aangezien de Azure Cosmos DB-provider de IDistributedCache-interface implementeert om te fungeren als een gedistribueerde cacheprovider, kan deze ook worden gebruikt voor elke toepassing waarvoor gedistribueerde cache is vereist, niet alleen voor webtoepassingen waarvoor een performante en gedistribueerde sessiestatusprovider is vereist.

Gedistribueerde caches vereisen gegevensconsistentie om onafhankelijke exemplaren te kunnen bieden om die gegevens in de cache te kunnen delen. Wanneer u de Azure Cosmos DB-provider gebruikt, kunt u het volgende doen:

  • Gebruik uw Azure Cosmos DB-account in sessieconsistentie als u Routering van toepassingsaanvragen kunt inschakelen en aanvragen plakkerig kunt maken voor een bepaald exemplaar.
  • Gebruik uw Azure Cosmos DB-account in de consistentie Gebonden veroudering of Sterk zonder dat er persistentie van aanvragen nodig is. Dit biedt de grootste schaal wat betreft de verdeling van de belasting over uw exemplaren.

Als u de Azure Cosmos DB-provider wilt gebruiken als een gedistribueerde cache, moet deze worden geregistreerd in ConfiguredServices met de services.AddCosmosCache aanroep. Zodra dat is gedaan, kan elke constructor in de toepassing om de cache vragen door te IDistributedCache verwijzen en ontvangt deze het exemplaar dat is geïnjecteerd door afhankelijkheidsinjectie die moet worden gebruikt:

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 */
    }
}

Problemen oplossen en diagnoses uitvoeren

VAN TOEPASSING OP: NoSQL

Omdat de Azure Cosmos DB-provider de .NET SDK hieronder gebruikt, zijn alle bestaande prestatierichtlijnen en handleidingen voor probleemoplossing van toepassing op het begrijpen van mogelijke problemen. Er is een unieke manier om toegang te krijgen tot de diagnostische gegevens van de onderliggende Azure Cosmos DB-bewerkingen, omdat deze niet beschikbaar kunnen worden gemaakt via de IDistributedCache-API's.

Als u de optionele gemachtigde diagnostische gegevens registreert, kunt u diagnostische gegevens vastleggen en voorwaardelijk registreren om problemen zoals hoge latentie op te lossen:

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

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

Volgende stappen

  • Zie de broncode op GitHub voor meer informatie over de Azure Cosmos DB-sessie- en cacheprovider.
  • Probeer de Azure Cosmos DB-sessie- en cacheprovider uit door een voorbeeld van Een ASP.NET Core-webtoepassing verkennen te verkennen.
  • Meer informatie over gedistribueerde caches in .NET.