Gebruik Azure Cosmos DB als een ASP.NET sessietoestand en cachingprovider

VAN TOEPASSING OP: SQL-API

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

Wat is de sessietoestand?

Sessietoestand zijn gebruikersgegevens die een gebruiker volgen die gedurende een bepaalde periode in dezelfde browser door een webtoepassing bladert. De sessietoestand verloopt en is beperkt tot de interacties die een bepaalde browser heeft en die niet in browsers wordt uitgebreid. Deze gegevens worden beschouwd als kortstondige gegevens, als deze niet aanwezig zijn, wordt de toepassing niet breekt. Als 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 aan de huidige webserver en taakverdelingsaanvragen van dezelfde browser op meerdere webservers kan inschakelen om een hogere schaalbaarheid te bereiken.

De eenvoudigste sessietoestandprovider is de provider in het geheugen die alleen gegevens op het lokale webservergeheugen opgeslagen en vereist dat de toepassing de Application Request Routing. Hierdoor wordt de browsersessie plakkerig naar een bepaalde webserver (alle aanvragen voor die browser moeten altijd op dezelfde webserver komen). De provider werkt goed in eenvoudige scenario's, maar de behoefte aan aan volheid kan zorgen voor taakverdelingsproblemen wanneer webtoepassingen worden geschaald.

Er zijn veel externe opslagproviders beschikbaar, die de sessiegegevens kunnen opslaan op een manier die kan worden gelezen en toegankelijk is voor meerdere webservers zonder dat sessievererigheid is vereist en die een hogere schaal mogelijk maakt.

Sessietoestandscenario's

Cosmos DB kan worden gebruikt als een sessie state provider via het extensiepakket Microsoft.Extensions.Caching. Cosmos gebruikt de Azure Cosmos DB .NET SDK,waarbij een container wordt gebruikt als 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 het opstartproces (services. AddSession en app. UseSession zijn algemene initialisatiestappen die vereist zijn voor elke sessietoestandprovider:

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

Waar u de database en container opgeeft, wilt u de sessietoestand opslaan en eventueel maken als ze niet bestaan.

U kunt uw SDK-clientconfiguratie aanpassen met behulp van de . Als uw toepassing al een gebruikt voor andere bewerkingen met Cosmos DB, kunt u deze ook in de CosmosClientBuilder CosmosClient 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 een ASP.NET Core 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

Gezien het feit dat de Cosmos DB-provider de IDistributedCache-interfaceimplementeert om te fungeren als een provider van gedistribueerde cache, kan deze ook worden gebruikt voor elke toepassing waarvoor gedistribueerde cache is vereist, niet alleen voor webtoepassing waarvoor een goed presterende en gedistribueerde sessietoestandprovider is vereist.

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

  • Gebruik uw Cosmos DB account in Sessieconsistentie als u de Application Request Routing kunt inschakelen en aanvragen naar een bepaald exemplaar kunt laten plakken.
  • Gebruik uw Cosmos DB account in de consistentie Gebonden veroudering of Sterk zonder dat er een aanvraag moet worden gebruikt. Dit biedt de grootste schaal wat betreft de verdeling van de belasting over uw exemplaren.

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

Probleemoplossing en diagnose

VAN TOEPASSING OP: SQL-API

Omdat de Cosmos DB provider de .NET SDK hieronder gebruikt, zijn alle bestaande prestatierichtlijnen en handleidingen voor probleemoplossing van toepassing om inzicht te krijgen in mogelijke problemen. Houd er rekening mee dat er een afzonderlijke manier is om toegang te krijgen tot de diagnostische gegevens van de onderliggende Cosmos DB-bewerkingen, omdat deze niet toegankelijk zijn via de IDistributedCache-API's.

Als u de optionele gemachtigde voor diagnostische gegevens registreert, kunt u diagnostische gegevens vastleggen en voorwaardelijk vastleggen om problemen met bijvoorbeeld 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 Azure Cosmos DB voor meer informatie over de sessie- en cacheprovider van GitHub.
  • Probeer de Azure Cosmos DB-sessie- en cacheprovider uit door een voorbeeld te verkennen Een ASP.NET Core verkennen.
  • Meer informatie over gedistribueerde caches in .NET.