Использование 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 */
});
Дальнейшие действия
- Дополнительные сведения о поставщике сеансе и кэша Azure Cosmos DB см. в исходном коде на GitHub.
- Испытайте поставщик сеанса и кэша Azure Cosmos DB, изучив пример веб-приложения ASP.NET Core.
- Узнайте больше о распределенных кэшах в .NET.