Использование Azure Cosmos DB в качестве поставщика состояний сеансов и кэширования ASP.NET

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Поставщик сеансов и кэша Azure Cosmos DB позволяет использовать возможности низкой задержки и глобального масштабирования Azure Cosmos DB для хранения данных о состоянии сеанса хранения и для распределенного кэша в вашем приложении.

Что такое состояние сеанса?

Состояние сеанса — это данные пользователя, которые позволяют отслеживать действия пользователя в веб-приложении в течение определенного периода времени в одном браузере. Состояние сеанса имеет срок действия и ограничивается взаимодействиями в пределах определенного браузера. Данные считаются временными, и при их отсутствии работа приложения не нарушается. Однако их наличие ускоряет работу пользователя, так как веб-приложению не нужно получать их при каждом запросе браузера для одного и того же пользователя.

Для обеспечения такого состояния часто применяется какой-либо механизм хранения, который в некоторых случаях может быть внешним по отношению к текущему веб-серверу и позволяет балансировать нагрузку запросов из одного браузера между несколькими веб-серверами для более высокой масштабируемости.

Простейший поставщик состояний сеансов — это поставщик в памяти, который хранит данные только в локальной памяти веб-сервера и требует, чтобы приложение использовало маршрутизацию запросов приложения. Это делает сеанс браузера привязанным к определенному веб-серверу (все запросы от этого браузера должны всегда направляться на один и тот же веб-сервер). Такой поставщик хорошо работает в простых сценариях, но требования привязки могут привести к проблемам с балансировкой нагрузки при масштабировании веб-приложений.

Существует множество внешних поставщиков хранилища, которые могут хранить данные сеансов таким образом, что они доступны нескольким веб-серверам без привязки к одному из них. Таким образом достигается более высокая масштабируемость.

Сценарии состояния сеанса

Azure Cosmos DB можно использовать в качестве поставщика состояний сеансов с помощью пакета расширения Microsoft.Extensions.Caching.Cosmos использует пакет SDK azure Cosmos DB для .NET, используя контейнер в качестве эффективного хранилища сеансов на основе подхода "ключ-значение", где ключ является идентификатором сеанса.

После добавления пакета можно использовать AddCosmosCache в процессе запуска (services.AddSession и app.UseSession — это стандартные шаги инициализации, необходимые для любого поставщика состояний сеансов):

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

Вы указываете базу данных и контейнер, в которых должно храниться состояние сеанса, и при необходимости создаете их, если они не существуют, используя атрибут CreateIfNotExists.

Важно!

Если вы предоставляете существующий контейнер вместо использования CreateIfNotExists, убедитесь, что у него есть время на активное использование.

Вы можете настроить конфигурацию клиента пакета SDK с помощью CosmosClientBuilder или, если приложение уже использует CosmosClient для других операций с Azure Cosmos DB, вы также можете внедрить его в поставщик:

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

После этого можно использовать сеансы ASP.NET Core так же, как с любым другим поставщиком, и использовать объект HttpContext.Session. Всегда старайтесь загружать сведения о сеансе асинхронно согласно рекомендациям ASP.NET.

Сценарии распределенного кэша

Учитывая, что поставщик Azure Cosmos DB реализует интерфейс IDistributedCache в качестве поставщика распределенного кэша, его также можно использовать для любого приложения, которому требуется распределенный кэш, а не только для веб-приложений, которым требуется поставщик состояний производительности и распределенного сеанса.

Для распределенных кэшей требуется согласованность данных, чтобы независимые экземпляры могли совместно использовать кэшированные данные. При использовании поставщика Azure Cosmos DB вы можете:

  • Используйте учетную запись Azure Cosmos DB в разделе Согласованность сеансов , если вы можете включить маршрутизацию запросов приложений и сделать запросы прикрепленными к конкретному экземпляру.
  • Используйте учетную запись Azure Cosmos DB с ограниченным устареванием или строгой согласованностью , не требуя прилипания запросов. Это обеспечивает наибольшую масштабируемость в плане распределения нагрузки между экземплярами.

Чтобы использовать поставщик Azure Cosmos DB в качестве распределенного кэша, его необходимо зарегистрировать в ConfiguredServiceс помощью services.AddCosmosCache вызова . После этого любой конструктор в приложении может запросить кэш, обратившись к IDistributedCache, и он получит экземпляр, внедренный с помощью внедрения зависимостей:

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

Устранение неполадок и диагностика

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

Так как поставщик Azure Cosmos DB использует пакет SDK для .NET, все существующие рекомендации по производительности и руководства по устранению неполадок применимы к пониманию любой потенциальной проблемы. Обратите внимание, что существует отдельный способ получить доступ к диагностике из базовых операций Azure Cosmos DB, так как они не могут быть предоставлены через API IDistributedCache.

Регистрация дополнительного делегата диагностики позволит записывать и условно регистрировать данные диагностики для устранения любых неполадок, например случаев высокой задержки.

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

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

Дальнейшие действия