Использование 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(
"<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 */
}
Вы указываете базу данных и контейнер, в которых должно храниться состояние сеанса, и при необходимости создаете их, если они не существуют, используя атрибут 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.