Utilizar o Azure Cosmos DB como um estado de sessão ASP.NET e o fornecedor de colocação em cache

APLICA-SE A: NoSQL

O fornecedor de cache e sessão do Azure Cosmos DB permite-lhe utilizar o Azure Cosmos DB e tirar partido das suas capacidades de baixa latência e escala global para armazenar dados de estado de sessão e como uma cache distribuída na sua aplicação.

O que é o estado da sessão?

O estado da sessão são dados de utilizador que monitorizam a navegação de um utilizador através de uma aplicação Web durante um período de tempo, no mesmo browser. O estado da sessão expira e está limitado às interações que um browser específico está a ter e que não se estende pelos browsers. São considerados dados efémeros, se não estiverem presentes, não irão interromper a aplicação. No entanto, quando existe, torna a experiência mais rápida para o utilizador porque a aplicação Web não precisa de a obter em todos os pedidos do browser para o mesmo utilizador.

Muitas vezes, é apoiado por algum mecanismo de armazenamento, que pode, em alguns casos, ser externo ao servidor Web atual e ativar pedidos de balanceamento de carga do mesmo browser em vários servidores Web para alcançar uma escalabilidade mais elevada.

O fornecedor de estado de sessão mais simples é o fornecedor dentro da memória que armazena apenas dados na memória do servidor Web local e requer que a aplicação utilize o Encaminhamento de Pedidos de Aplicação. Isto torna a sessão do browser autocolante a um determinado servidor Web (todos os pedidos para esse browser têm de aceder sempre ao mesmo servidor Web). O fornecedor funciona bem em cenários simples, mas o requisito de persistência pode trazer problemas de balanceamento de carga quando as aplicações Web são dimensionadas.

Existem vários fornecedores de armazenamento externos disponíveis que podem armazenar os dados de sessão de uma forma que pode ser lida e acedida por vários servidores Web sem exigir a persistência da sessão e ativar uma escala mais elevada.

Cenários de estado da sessão

O Azure Cosmos DB pode ser utilizado como um fornecedor de estado de sessão através do pacote de extensões Microsoft.Extensions.Caching.Cosmos utiliza o SDK .NET do Azure Cosmos DB, utilizando um Contentor como um armazenamento de sessão eficaz com base numa abordagem chave/valor em que a chave é o identificador de sessão.

Assim que o pacote for adicionado, pode utilizar AddCosmosCache como parte do processo de Arranque (serviços). AddSession e aplicação. UseSession são passos de inicialização comuns necessários para qualquer fornecedor de estado de sessão):

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

Quando especificar a base de dados e o contentor que pretende que o estado da sessão seja armazenado e, opcionalmente, crie-os se não existirem com o CreateIfNotExists atributo.

Importante

Se fornecer um contentor existente em vez de utilizar CreateIfNotExistso , certifique-se de que tem tempo de vida ativado.

Pode personalizar a configuração do cliente do SDK com o ou se a sua aplicação CosmosClientBuilder já estiver a utilizar uma CosmosClient para outras operações com o Azure Cosmos DB, também pode injectá-la no fornecedor:

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

Depois disso, pode utilizar ASP.NET Core sessões como com qualquer outro fornecedor e utilizar o objeto HttpContext.Session. Tenha em atenção que tente sempre carregar as suas informações de sessão de forma assíncrona de acordo com as recomendações ASP.NET.

Cenários de cache distribuída

Tendo em conta que o fornecedor do Azure Cosmos DB implementa a interface IDistributedCache para agir como um fornecedor de cache distribuída, também pode ser utilizado para qualquer aplicação que necessite de cache distribuída, não apenas para aplicações Web que exijam um fornecedor de estado de sessão distribuído e performante.

As caches distribuídas requerem consistência de dados para fornecer instâncias independentes para poderem partilhar esses dados em cache. Ao utilizar o fornecedor do Azure Cosmos DB, pode:

  • Utilize a sua conta do Azure Cosmos DB na Consistência da sessão se conseguir ativar o Encaminhamento de Pedidos de Aplicação e tornar os pedidos aderidos a uma instância específica.
  • Utilize a sua conta do Azure Cosmos DB em Estagnação Limitada ou Consistência forte sem exigir a persistência do pedido. Isto fornece a maior escala em termos de distribuição de carga nas suas instâncias.

Para utilizar o fornecedor do Azure Cosmos DB como uma cache distribuída, tem de ser registado em ConfiguredServices com a services.AddCosmosCache chamada. Depois de concluído, qualquer construtor na aplicação pode pedir a cache ao referenciar IDistributedCache e receberá a instância injetada por injeção de dependência para ser utilizada:

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

Resolução de problemas e diagnóstico

APLICA-SE A: NoSQL

Uma vez que o fornecedor do Azure Cosmos DB utiliza o SDK .NET por baixo, todas as diretrizes de desempenho e guias de resolução de problemas existentes aplicam-se à compreensão de qualquer problema potencial. Tenha em atenção que existe uma forma distinta de obter acesso aos Diagnósticos a partir das operações subjacentes do Azure Cosmos DB, uma vez que não podem ser expostos através das APIs IDistributedCache.

Registar o delegado de diagnóstico opcional permitirá capturar e registar condicionalmente quaisquer diagnósticos para resolver quaisquer casos como latência elevada:

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

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

Passos seguintes

  • Para obter mais detalhes sobre a sessão do Azure Cosmos DB e o fornecedor de cache, veja o código fonte no GitHub.
  • Experimente a sessão e o fornecedor de cache do Azure Cosmos DB ao explorar um exemplo Explorar uma aplicação Web ASP.NET Core.
  • Leia mais sobre caches distribuídas no .NET.