Compartilhar via


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

APLICA-SE A: NoSQL

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

O que é estado de sessão?

Estado de sessão são dados de usuário que rastreiam um usuário que navega 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 navegador específico está tendo, o que não se estende entre os navegadores. São considerados dados efêmeros. Se não estiverem presentes, não interromperão o aplicativo. No entanto, quando existe, ele torna a experiência mais rápida para o usuário, pois o aplicativo Web não precisa obtê-lo em todas as solicitações do navegador para o mesmo usuário.

Muitas vezes, ele é apoiado por algum mecanismo de armazenamento, que pode, em alguns casos, ser externo ao servidor Web atual e habilitar 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 Application Request Routing. Isso faz com que a sessão do navegador adira a um servidor Web específico (todas as solicitações desse navegador precisam sempre ficar no mesmo servidor Web). O provedor funciona bem em cenários simples, mas o requisito de adesão pode trazer problemas de balanceamento de carga quando os aplicativos Web são dimensionados.

Há muitos provedores de armazenamento externo disponíveis, que podem armazenar os dados da sessão de forma que possam ser lidos e acessados por vários servidores Web sem exigir a adesão da sessão e habilitar uma escala mais alta.

Cenários de estado de sessão

O Azure Cosmos BD pode ser usado como um provedor de estado de sessão por meio do pacote de extensão Microsoft.Extensions.Caching. O 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á usar AddCosmosCache como parte do processo de inicialização (services.AddSession e app.UseSession são etapas de inicialização comuns 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 em que deseja que o estado da sessão seja armazenado e, opcionalmente, onde você os cria usando o atributo CreateIfNotExists quando eles não existem.

Importante

Ao fornecer um contêiner existente em vez de usar CreateIfNotExists, verifique se ele tem o tempo de vida habilitado.

Você pode personalizar a configuração do cliente SDK usando o CosmosClientBuilder ou, se seu aplicativo já estiver usando um CosmosClient para outras operações com o Azure Cosmos DB, você também poderá 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 sessões ASP.NET 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 recomendações de ASP.NET.

Cenários de cache distribuído

Considerando 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 requeira cache distribuído, não apenas para aplicativos Web que exigem um provedor de estado de sessão distribuído e com bom desempenho.

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

  • Usar sua conta do Cosmos DB em Consistência da sessão se puder habilitar o Application Request Routing e fazer solicitações de adesão em uma determinada instância.
  • Usar sua conta do Azure Cosmos DB em Desatualização limitada ou Forte consistência sem exigir a adesão da solicitação. Isso oferece a maior escala em termos de distribuição de carga em suas instâncias.

Para usar o provedor do Azure Cosmos DB como um cache distribuído, ele precisa ser registrado em ConfiguredServices com a chamada services.AddCosmosCache. Quando isso for feito, qualquer construtor no aplicativo poderá solicitar o cache referenciando IDistributedCache e receberá a instância injetada pela injeção de dependência a 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ósticos

APLICA-SE A: NoSQL

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

O registro do delegado de diagnóstico opcional permitirá que você capture e registre condicionalmente qualquer diagnóstico para solucionar quaisquer 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óximas etapas

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