Usare Azure Cosmos DB come provider di stato della sessione e memorizzazione nella cache ASP.NET

SI APPLICA A: NoSQL

Il provider di sessione e cache di Azure Cosmos DB consente di usare Azure Cosmos DB e sfruttare le capacità di bassa latenza e scalabilità globale per l'archiviazione dei dati sullo stato della sessione e come cache distribuita all'interno dell'applicazione.

Che cos'è lo stato della sessione?

Lo stato della sessione sono dati utente che tengono traccia dell'esplorazione di un utente attraverso un'applicazione Web durante un periodo di tempo, all'interno dello stesso browser. Lo stato della sessione scade ed è limitato alle interazioni di un browser specifico che non si estende tra i browser. Si tratta di dati temporanei e, se non sono presenti, l'applicazione non verrà interrotta. Tuttavia, quando sono presenti, rendono l'esperienza più veloce per l'utente perché l'applicazione Web non deve recuperarli in ogni richiesta del browser per lo stesso utente.

Spesso sono supportati da un meccanismo di archiviazione, che può in alcuni casi essere esterno al server Web corrente e abilitare le richieste di bilanciamento del carico dello stesso browser in più server Web per ottenere una maggiore scalabilità.

Il provider di stato della sessione più semplice è il provider in memoria che archivia solo i dati nella memoria del server Web locale e richiede che l'applicazione usi Application Request Routing. In questo modo la sessione del browser è permanente in un determinato server Web (tutte le richieste per tale browser devono sempre trovarsi nello stesso server Web). Il provider funziona bene in scenari semplici, ma il requisito di permanenza può causare problemi di bilanciamento del carico quando le applicazioni Web sono scalabili.

Sono disponibili molti provider di archiviazione esterni, che possono archiviare i dati della sessione in modo che possano essere letti e resi accessibili da più server Web senza richiedere la permanenza della sessione e abilitare una scalabilità più elevata.

Scenari dello stato della sessione

Azure Cosmos DB può essere usato come provider di stato della sessione tramite il pacchetto di estensione Microsoft.Extensions.Caching.Cosmos che usa .NET SDK di Azure Cosmos DB, usando un contenitore come archivio della sessione efficace basato su un approccio chiave/valore in cui la chiave è l'identificatore di sessione.

Dopo aver aggiunto il pacchetto, è possibile usare AddCosmosCache come parte del processo di avvio (services.AddSession and app.UseSession sono passaggi di inizializzazione comune necessari per qualsiasi provider di stato della sessione):

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

Dove si specificano il database e il contenitore in cui si vuole archiviare lo stato della sessione e, facoltativamente, crearli se non esistono, usando l'attributo CreateIfNotExists.

Importante

Se si specifica un contenitore esistente anziché usare CreateIfNotExists, assicurarsi che la durata sia abilitata.

È possibile personalizzare la configurazione del client SDK usando CosmosClientBuilder o se l'applicazione usa già un CosmosClient per altre operazioni con Azure Cosmos DB, è anche possibile inserirla nel 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; 
});

Successivamente, è possibile utilizzare le sessioni di ASP.NET Core come qualsiasi altro provider e utilizzare l'oggetto HttpContext.Session. Ricordare di cercare sempre di caricare le informazioni sulla sessione in modo asincrono in base alle raccomandazioni ASP.NET.

Scenari di cache distribuita

Dato che il provider Azure Cosmos DB implementa l'interfaccia IDistributedCache per agire come provider di cache distribuita, può essere utilizzato anche per qualsiasi applicazione che richieda una cache distribuita, non solo per le applicazioni Web che richiedono un provider di stato della sessione performante e distribuito.

Le cache distribuite richiedono la coerenza dei dati per fornire istanze indipendenti per poter condividere i dati memorizzati nella cache. Quando si usa il provider Azure Cosmos DB, è possibile:

  • Usare l'account Azure Cosmos DB in Coerenza di sessione se è possibile abilitare Application Request Routing e rendere le richieste permanenti in una particolare istanza.
  • Usare l'account Azure Cosmos DB in Decadimento ristretto o Coerenza di alto livello senza richiedere la permanenza della richiesta. Ciò offre la massima scalabilità in termini di distribuzione del carico tra le istanze.

Per utilizzare il provider Azure Cosmos DB come cache distribuita, è necessario registrarlo in ConfiguredService con la chiamata services.AddCosmosCache. Al termine, qualsiasi costruttore dell'applicazione può richiedere la cache facendo riferimento a IDistributedCache e riceverà l'istanza inserita mediante inserimento delle dipendenze da usare:

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

Risoluzione dei problemi e diagnosi

SI APPLICA A: NoSQL

Poiché il provider Azure Cosmos DB usa .NET SDK sottostante, si applicano tutte le linee guida per le prestazioni esistenti e le guide alla risoluzione dei problemi per comprendere eventuali problemi potenziali. Si noti che esiste un modo diverso per ottenere l'accesso alla Diagnostica dalle operazioni di Azure Cosmos DB sottostanti perché non possono essere esposte tramite le API IDistributedCache.

La registrazione del delegato di diagnostica facoltativo consentirà di acquisire e registrare in modo condizionale qualsiasi diagnosi per risolvere eventuali casi come la latenza elevata:

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

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

Passaggi successivi

  • Per altre informazioni sul provider di sessione e di cache di Azure Cosmos DB, vedere il codice sorgente su GitHub.
  • Provare il provider di sessione e di cache di Azure Cosmos DB esplorando un esempio di Esplora un'applicazione Web ASP.NET Core.
  • Altre informazioni su cache distribuite in .NET.