Использование Azure Cosmos DB в качестве поставщика состояний сеансов и кэширования ASP.NET
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
Поставщик сеансов и кэша Azure Cosmos DB позволяет использовать возможности низкой задержки и глобального масштабирования Azure Cosmos DB для хранения данных о состоянии сеанса хранения и для распределенного кэша в вашем приложении.
Что такое состояние сеанса?
Состояние сеанса — это данные пользователя, которые позволяют отслеживать действия пользователя в веб-приложении в течение определенного периода времени в одном браузере. Состояние сеанса имеет срок действия и ограничивается взаимодействиями в пределах определенного браузера. Данные считаются временными, и при их отсутствии работа приложения не нарушается. Однако их наличие ускоряет работу пользователя, так как веб-приложению не нужно получать их при каждом запросе браузера для одного и того же пользователя.
Для обеспечения такого состояния часто применяется какой-либо механизм хранения, который в некоторых случаях может быть внешним по отношению к текущему веб-серверу и позволяет балансировать нагрузку запросов из одного браузера между несколькими веб-серверами для более высокой масштабируемости.
Простейший поставщик состояний сеансов — это поставщик в памяти, который хранит данные только в локальной памяти веб-сервера и требует, чтобы приложение использовало маршрутизацию запросов приложения. Это делает сеанс браузера привязанным к определенному веб-серверу (все запросы от этого браузера должны всегда направляться на один и тот же веб-сервер). Такой поставщик хорошо работает в простых сценариях, но требования привязки могут привести к проблемам с балансировкой нагрузки при масштабировании веб-приложений.
Существует множество внешних поставщиков хранилища, которые могут хранить данные сеансов таким образом, что они доступны нескольким веб-серверам без привязки к одному из них. Таким образом достигается более высокая масштабируемость.
Сценарии состояния сеанса
Azure Cosmos DB можно использовать в качестве поставщика состояний сеанса через пакет расширений Microsoft.Extensions.Caching.Cosmos использует пакет SDK для .NET для Azure Cosmos DB, используя контейнер в качестве эффективного хранилища сеансов на основе подхода "ключ-значение", где ключ является идентификатором сеанса.
После добавления пакета можно использовать 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
s с 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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по