Partilhar via


Usar o Azure Cosmos DB como um estado de sessão ASP.NET e provedor de cache

APLICA-SE A: NoSQL

O provedor de cache e sessão do Azure Cosmos DB permite que você use o Azure Cosmos DB e aplique seus recursos de baixa latência e escala global para armazenar dados de estado da sessão e como um cache distribuído em seu aplicativo.

O que é o estado da sessão?

Estado da sessão são dados do usuário que rastreiam um usuário navegando por um aplicativo Web durante um período de tempo, dentro do mesmo navegador. O estado da sessão expira e é limitado às interações que um determinado navegador está tendo, que não se estendem entre os navegadores. São considerados dados efêmeros, se não estiverem presentes não quebrarão o aplicativo. No entanto, quando existe, torna a experiência mais rápida para o usuário, porque o aplicativo da Web não precisa buscá-lo em todas as solicitações do navegador para o mesmo usuário.

Muitas vezes, é apoiado por algum mecanismo de armazenamento, que pode, em alguns casos, ser externo ao servidor Web atual e permitir solicitações de balanceamento de carga do mesmo navegador em vários servidores Web para obter maior escalabilidade.

O provedor de estado de sessão mais simples é o provedor na memória que armazena apenas dados na memória do servidor Web local e requer que o aplicativo use o Roteamento de Solicitação de Aplicativo. Isso faz com que a sessão do navegador fique aderente a um determinado servidor da Web (todas as solicitações para esse navegador precisam sempre pousar no mesmo servidor da Web). O provedor funciona bem em cenários simples, mas o requisito de aderência pode trazer problemas de balanceamento de carga quando os aplicativos da Web são dimensionados.

Há muitos provedores de armazenamento externos disponíveis, que podem armazenar os dados da sessão de uma forma que possa ser lida e acessada por vários servidores Web sem exigir aderência da sessão e permitir uma escala maior.

Cenários de estado da sessão

O Azure Cosmos DB pode ser usado como um provedor de estado de sessão por meio do pacote de extensão Microsoft.Extensions.Caching.Cosmos usa o SDK .NET do Azure Cosmos DB, usando um contêiner como um armazenamento de sessão eficaz com base em uma abordagem de chave/valor em que a chave é o identificador de sessão.

Depois que o pacote for adicionado, você poderá usá-lo AddCosmosCache como parte do seu processo de inicialização (serviços. AddSession e aplicativo. UseSession são etapas comuns de inicialização necessárias para qualquer provedor de estado de sessão):

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

Onde você especifica o banco de dados e o contêiner, deseja que o estado da sessão seja armazenado e, opcionalmente, crie-os se eles não existirem usando o CreateIfNotExists atributo.

Importante

Se você fornecer um contêiner existente em vez de usar CreateIfNotExistso , verifique se ele tem o tempo de vida ativado.

Você pode personalizar a configuração do cliente SDK usando o ou, se seu aplicativo já estiver usando um CosmosClient para outras operações com o CosmosClientBuilder Azure Cosmos DB, você também pode injetá-lo no provedor:

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, você pode usar ASP.NET sessões Core como com qualquer outro provedor e usar o objeto HttpContext.Session. Lembre-se de sempre tentar carregar as informações da sessão de forma assíncrona, de acordo com as ASP.NET recomendações.

Cenários de cache distribuído

Dado que o provedor do Azure Cosmos DB implementa a interface IDistributedCache para atuar como um provedor de cache distribuído, ele também pode ser usado para qualquer aplicativo que exija cache distribuído, não apenas para aplicativos Web que exigem um provedor de estado de sessão distribuído e de alto desempenho.

Os caches distribuídos exigem consistência de dados para fornecer instâncias independentes para poder compartilhar esses dados armazenados em cache. Ao usar o provedor do Azure Cosmos DB, você pode:

  • Use sua conta do Azure Cosmos DB em Consistência de sessão se puder habilitar o Roteamento de Solicitações de Aplicativo e fazer solicitações aderentes a uma instância específica.
  • Use sua conta do Azure Cosmos DB em Atraso Delimitado ou Consistência forte sem exigir aderência de solicitação. Isso fornece a maior escala em termos de distribuição de carga entre suas instâncias.

Para usar o provedor do Azure Cosmos DB como um cache distribuído, ele precisa ser registrado em ConfiguredServices com a services.AddCosmosCache chamada. Feito isso, qualquer construtor no aplicativo pode solicitar o cache por referência IDistributedCache e ele receberá a instância injetada por injeção de dependência para ser usada:

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

Solução de problemas e diagnóstico

APLICA-SE A: NoSQL

Como o provedor do Azure Cosmos DB usa o SDK do .NET abaixo, todas as diretrizes de desempenho e guias de solução de problemas existentes se aplicam para entender qualquer problema potencial. Observe que há uma maneira distinta de obter acesso ao Diagnóstico das operações subjacentes do Azure Cosmos DB porque elas não podem ser expostas por meio das APIs IDistributedCache.

Registrar o delegado de diagnóstico opcional permitirá que você capture e registre condicionalmente todos os diagnósticos para solucionar problemas de casos como alta latência:

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

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

Próximos passos

  • Para encontrar mais detalhes sobre a sessão do Azure Cosmos DB e o provedor de cache, consulte o código-fonte no GitHub.
  • Experimente o provedor de cache e sessão do Azure Cosmos DB explorando um exemplo Explore um aplicativo Web ASP.NET Core.
  • Leia mais sobre caches distribuídos no .NET.