Delen via


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

VAN TOEPASSING OP: NoSQL

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

Wat is sessiestatus?

Sessiestatus is gebruikersgegevens waarmee een gebruiker die gedurende een bepaalde periode door een webtoepassing bladert, in dezelfde browser bijhoudt. De sessiestatus verloopt en is beperkt tot de interacties die een bepaalde browser heeft die niet wordt uitgebreid tussen browsers. Het wordt beschouwd als tijdelijke gegevens, als deze niet aanwezig zijn, wordt de toepassing niet verbroken. Wanneer deze bestaat, wordt de ervaring voor de gebruiker echter 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 voor de huidige webserver en taakverdelingsaanvragen van dezelfde browser mogelijk maakt voor meerdere webservers om een hogere schaalbaarheid te bereiken.

De eenvoudigste sessiestatusprovider is de in-memory provider die alleen gegevens opslaat op het lokale webservergeheugen en vereist dat de toepassing routering van toepassingsaanvragen gebruikt. Hierdoor blijft de browsersessie op een bepaalde webserver staan (alle aanvragen voor die browser moeten altijd op dezelfde webserver terechtkomen). De provider werkt goed aan eenvoudige scenario's, maar de kleverigheidsvereiste kan problemen met taakverdeling opleveren 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 sessiestickerigheid en een hogere schaal mogelijk te 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-/waardebenadering waarbij de sleutel de sessie-id is.

Zodra het pakket is toegevoegd, kunt u dit gebruiken AddCosmosCache als onderdeel van het 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(
        "<nosql-account-endpoint>",
        tokenCredential
      )
        .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 */
}

Waar u de database en container opgeeft waarin u de sessiestatus wilt opslaan en optioneel wilt opslaan, maakt u deze als deze niet bestaat met behulp van het CreateIfNotExists kenmerk.

Belangrijk

Als u een bestaande container opgeeft in plaats van te gebruiken CreateIfNotExists, controleert u of de container time to live is ingeschakeld.

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

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 zoals bij elke andere provider gebruiken en het object HttpContext.Session gebruiken. Houd er rekening mee dat u uw sessiegegevens altijd asynchroon wilt 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 provider voor gedistribueerde cache, 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 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 op een bepaald exemplaar kunt plakken.
  • Gebruik uw Azure Cosmos DB-account in Gebonden veroudering of sterke consistentie zonder dat u een aanvraag-stickiness nodig hebt. Dit biedt de grootste schaal in termen van belastingdistributie over uw exemplaren.

Als u de Azure Cosmos DB-provider wilt gebruiken als een gedistribueerde cache, moet deze worden geregistreerd in ConfiguredServices bij de services.AddCosmosCache aanroep. Zodra dat is gebeurd, kan elke constructor in de toepassing om de cache vragen door ernaar te verwijzen IDistributedCache en ontvangt het exemplaar dat door afhankelijkheidsinjectie is geïnjecteerd om te 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 diagnosticeren

VAN TOEPASSING OP: NoSQL

Aangezien 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. Opmerking: er is een afzonderlijke manier om toegang te krijgen tot de diagnostische gegevens van de onderliggende Azure Cosmos DB-bewerkingen, omdat ze niet kunnen worden weergegeven via de IDistributedCache-API's.

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

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 te verkennen van een ASP.NET Core-webtoepassing.
  • Lees meer over gedistribueerde caches in .NET.