Поскольку протокол HTTP, используемый веб-приложениями, является протоколом без сохранения состояния, данные нигде не хранятся; для каждого веб-запроса браузером открывается новое HTTP-соединение. В тех ситуациях, когда сохранение данных имеет решающее значение, ASP.NET Core предоставляет сеансы для хранения пользовательских данных. Это хранилище данных поддерживается самим приложением ASP.NET Core на том же сервере, что и приложение.
Хотя ASP.NET Core предоставляет поставщика сеансов в памяти, который хранит сеансы, иногда нагрузку необходимо сбалансировать. В этих сценариях используются стратегии хранения сессий, такие как липкие сессии или распределенный кеш.
Липкие сессии — нет, почему?
При использовании липких сеансов используется балансировщик нагрузки, и все пользовательские запросы направляются на один сервер. Основным недостатком использования липких сеансов для приложения ASP.NET Core является неправильное распределение нагрузки. Иногда запросы увеличиваются до такого уровня, что они полностью перегружают сервер, отвечающий за обслуживание данных. Кроме того, если этот сервер выйдет из строя, данные могут быть полностью потеряны, что приведет к одной точке отказа.
Хранение основных сессий ASP.NET в распределенном кэше
Распределенный кеш решает все проблемы, возникающие при использовании липких сессий. Распределенный кеш — это кеш-хранилище, используемое несколькими серверами приложений, обычно поддерживаемое в качестве внешней службы для хранения и доступа к данным. Основным преимуществом распределенного кэша является то, что он не только увеличивает масштабируемость, но и повышает производительность основного приложения ASP.NET. На диаграмме ниже показано, как распределенный кеш служит для хранения сессий. В кластер распределенного кэша можно добавить несколько серверов, что делает его линейно масштабируемым. Пользователи общаются с веб-фермой ASP.NET Core через балансировщик нагрузки. Веб-ферма далее использует распределенный кеш для хранения сессий поставщика услуг.
Стандартный интерфейс IDistributedCache ядра ASP.NET
Интерфейс IDistributedCache предоставляется Microsoft для интеграции распределенного кэша в приложения ASP.NET Core. Приложение взаимодействует с кешем с помощью этого интерфейса независимо от используемой реализации кеша. Вот как вы можете настроить свой поставщик хранилища сеансов через IDistributedCache.
C #
xxxxxxxxxx
1
namespace Microsoft.Extensions.Caching.Distributed
2
{
3
public interface IDistributedCache
4
{
5
// Each of these methods also has an “Async” overload
6
byte[] Get(string key);
7
void Refresh(string key);
8
void Remove(string key);
9
// Specify absolute & sliding expiration thru options
10
void Set(string key, byte[] value,
11
DistributedCacheEntryOptions options);
12
}
13
}
Примечание . Все эти методы также имеют асинхронную перегрузку.
Использование IDistributedCache
Вот небольшой пример, который поможет вам понять, как использовать IDistributed кеш.
C #
xxxxxxxxxx
1
IDistributedCache _cache;
2
...
3
private byte[] LoadCustomer(string custId) {
4
string key = "Customers:CustomerID:"+ custId;
5
// is the customer in the cache?
6
byte[] customer = _cache.Get(key);
7
if(customer == null)
8
{
9
// the cache doesn't have it. so load from DB
10
customer = LoadFromDB(key);
11
// And, cache it for next time
12
_cache.Set(key, customer);
13
}
14
return customer;
15
}
Ограничения интерфейса IDistributedCache
Существуют определенные ограничения при использовании интерфейса IDistributedCache . В реализации сеанса ASP.NET Core пропущены некоторые функции, которые ранее поддерживались в состоянии сеанса ASP.NET Core. Они включают:
- Блокировка сеанса.
- Байт [] для пользовательских объектов.
Помимо этого, если вы реализуете интерфейс IDistributedCache для своего приложения ASP.NET Core, у вас не будет различных функций кэширования, которые вы получаете, используя реализацию, предоставляемую решением распределенного кэша, таким как NCache.
Основной поставщик сеансов ASP.NET для распределенного кэша
Распределенный кеш, такой как NCache, предоставляет простую в использовании реализацию для хранения сеансов. Это не только экономит ваше время при написании вашего собственного провайдера, но также дает вам доступ к различным функциям распределенного кэша. Распределенный кеш (NCache) также устраняет ограничения IDistributedCache, упомянутые выше. Он обеспечивает внутренний механизм блокировки сеанса, а также поддерживает пользовательские объекты.
Настройка поставщика сеансов для распределенного кэша
Для настройки поставщика сеансов для распределенного кэша требуется меньше усилий для программирования. Распределенный кэш, такие как NCache, позволяет настроить его поставщик либо настройки всех параметров в Startup.cs классе или читая их через AppSettings.json файл в приложении ASP.NET Core.
В следующем примере показано , как настроить распределенную кэш ( NCache ) поставщик в Startup.cs классе приложения ASP.NET Core:
C #
xxxxxxxxxx
1
public void ConfigureServices(IServiceCollection services)
2
{
3
. . .
4
services.AddNCacheDistributedCache(configuration =>
6
{
7
configuration.CacheName = "myDistributedCache";
8
configuration.EnableLogs = true;
9
configuration.ExceptionsEnabled = true;
10
});
11
}
Использование распределенного кэша с основными сессиями ASP.NET
После успешной настройки распределенного кэша (NCache) для хранения сеансов вы можете легко использовать его в приложении ASP.NET Core для операций чтения и записи. Следующий блок кода представляет, как извлечь элемент из кэша и как вставить элемент в него.
C #
xxxxxxxxxx
1
DateTime cacheEntry;
2
string key = "MaxValue: " + DateTime.MaxValue;
3
// Look for cache key
5
object retobj = _cache.Get(key);
6
// Check if key exists in cache
8
if (retobj == null)
9
{
10
// Key not in cache, so populate data in cache entry
11
cacheEntry = DateTime.MaxValue;
12
// Configure SlidingExpiration for item
14
var cacheEntryOptions = new DistributedCacheEntryOptions();
15
cacheEntryOptions.SlidingExpiration = TimeSpan.FromMinutes(30);
16
// Insert item in cache
18
_cache.Set(key, new byte[1024], cacheEntryOptions);
19
// Return view with cacheEntry
21
}
Заключение
Для настройки NCache Session Provider для приложений ASP.NET Core требуется очень мало кода. Это очень легко настроить, и вам не нужно писать очень длинные фрагменты кода. Помимо этого, NCache предоставляет другие преимущества, в том числе:
- Высокая доступность.
- Линейно масштабируемый
- Интеллектуальная репликация сеанса.
- Быстрая Динамическая Компактная Сериализация.
Подводя итог, NCache не только быстрый, но и масштабируемый. Это чисто нативный .NET, что делает его очень удобным для встраивания в ваш стек приложений .NET.