Dela via


Använda Azure Cosmos DB som en ASP.NET sessionstillstånd och cachelagringsprovider

GÄLLER FÖR: NoSQL

Med Azure Cosmos DB-sessionen och cacheprovidern kan du använda Azure Cosmos DB och använda dess funktioner för låg svarstid och global skalning för att lagra sessionstillståndsdata och som en distribuerad cache i ditt program.

Vad är sessionstillstånd?

Sessionstillstånd är användardata som spårar en användares surfning via ett webbprogram under en tidsperiod i samma webbläsare. Sessionstillståndet upphör att gälla och är begränsat till de interaktioner som en viss webbläsare har som inte sträcker sig över webbläsare. Det anses vara tillfälliga data, om de inte finns kommer det inte att bryta programmet. Men när det finns gör det upplevelsen snabbare för användaren eftersom webbprogrammet inte behöver hämta det på varje webbläsarbegäran för samma användare.

Det backas ofta upp av någon lagringsmekanism, som i vissa fall kan vara utanför den aktuella webbservern och aktivera belastningsutjämningsbegäranden i samma webbläsare över flera webbservrar för att uppnå högre skalbarhet.

Den enklaste sessionstillståndsprovidern är den minnesinterna providern som endast lagrar data på det lokala webbserverminnet och kräver att programmet använder routning av programbegäran. Detta gör att webbläsarsessionen fastnar på en viss webbserver (alla begäranden för webbläsaren måste alltid landa på samma webbserver). Providern fungerar bra på enkla scenarier, men kravet på fasthet kan medföra belastningsutjämningsproblem när webbprogram skalas.

Det finns många externa lagringsproviders som kan lagra sessionsdata på ett sätt som kan läsas och nås av flera webbservrar utan att kräva sessionsstinne och aktivera en högre skala.

Scenarier för sessionstillstånd

Azure Cosmos DB kan användas som sessionstillståndsprovider via tilläggspaketet Microsoft.Extensions.Caching.Cosmos använder Azure Cosmos DB .NET SDK, med hjälp av en container som en effektiv sessionslagring baserat på en nyckel/värde-metod där nyckeln är sessionsidentifieraren.

När paketet har lagts till kan du använda AddCosmosCache som en del av startprocessen (tjänster. AddSession och app. UseSession är vanliga initieringssteg som krävs för alla sessionstillståndsprovider:

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

Där du anger den databas och container som du vill att sessionstillståndet ska lagras och om du vill kan du skapa dem om de inte finns med hjälp av CreateIfNotExists attributet.

Viktigt!

Om du anger en befintlig container i stället för att använda CreateIfNotExistskontrollerar du att den har tid att liveaktiveras.

Du kan anpassa SDK-klientkonfigurationen CosmosClientBuilder med hjälp av eller om ditt program redan använder en CosmosClient för andra åtgärder med Azure Cosmos DB kan du även mata in den i providern:

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

Därefter kan du använda ASP.NET Core-sessioner som med vilken annan provider som helst och använda objektet HttpContext.Session. Tänk på att alltid försöka läsa in sessionsinformationen asynkront enligt ASP.NET rekommendationerna.

Scenarier med distribuerad cache

Med tanke på att Azure Cosmos DB-providern implementerar IDistributedCache-gränssnittet för att fungera som en distribuerad cacheprovider kan den också användas för alla program som kräver distribuerad cache, inte bara för webbprogram som kräver en högpresterande och distribuerad sessionstillståndsprovider.

Distribuerade cacheminnen kräver datakonsekvens för att tillhandahålla oberoende instanser för att kunna dela dessa cachelagrade data. När du använder Azure Cosmos DB-providern kan du:

  • Använd ditt Azure Cosmos DB-konto i Sessionskonsekvens om du kan aktivera routning av programbegäran och göra begäranden fästa vid en viss instans.
  • Använd ditt Azure Cosmos DB-konto i Begränsad inaktuellhet eller Stark konsekvens utan att begära fasthet. Detta ger den största skalan när det gäller belastningsfördelning mellan dina instanser.

Om du vill använda Azure Cosmos DB-providern som en distribuerad cache måste den registreras i ConfiguredServices med anropet services.AddCosmosCache . När det är klart kan alla konstruktorer i programmet be om cachen genom att IDistributedCache referera till och den tar emot den instans som matas in av beroendeinmatningen som ska användas:

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

Felsöka och diagnostisera

GÄLLER FÖR: NoSQL

Eftersom Azure Cosmos DB-providern använder .NET SDK under, gäller alla befintliga riktlinjer för prestanda och felsökningsguider för att förstå eventuella problem. Observera att det finns ett tydligt sätt att få åtkomst till diagnostiken från de underliggande Azure Cosmos DB-åtgärderna eftersom de inte kan exponeras via IDistributedCache-API:erna.

Genom att registrera den valfria diagnostikdelegaten kan du registrera och villkorligt logga diagnostik för att felsöka fall som hög svarstid:

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

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

Nästa steg

  • Mer information om Azure Cosmos DB-sessionen och cacheprovidern finns i källkoden på GitHub.
  • Prova Azure Cosmos DB-sessionen och cacheprovidern genom att utforska ett exempel på Utforska en ASP.NET Core-webbapp.
  • Läs mer om distribuerade cacheminnen i .NET.