Учитывая некоторые архитектурные особенности Windows Azure, а именно “нелипкого” балансировщика нагрузки и отсутствия persistent хранилища данных, на тренингах и занятиях один из самых частых вопросов от разработчиков – как реализовать хранение состояние сессии пользователя в приложении? Есть несколько популярных вариантов, попробуем рассмотреть их все. Но сначала определим, что нам доступно в Windows Azure, а что совсем нет и почему.
Итак, в традиционном представлении в приложении ASP.NET состояние сессии можно ранить четырьмя способами:
In-Proc – в памяти конкретного веб-сервера. Данная опция используется по умолчанию.
SQL Server – в БД SQL Server.
State – состояние сессии хранится в некотором отдельном процессе (ASP.NET state service).
Собственная реализация – состояние сессии хранится в определенном разработчиком провайдере.
При рассмотрении вопроса о хранении состояния сессии в облаке Windows Azure сразу необходимо оговориться – метод In-Proc в облаке работает, но не является эффективным способом для хранения данных. Почему? Всё очень просто – как уже говорилось в начале статьи, балансировщик нагрузки не является “липким”. Пример – пользователь обратился к вашему сайту, балансировщик нагрузки отправил его на экземпляр роли №1. Пользователь ввёл данные, вошёл в систему, состояние сессии было сохранено. Пользователь закрыл страницу и через две минуты снова обратился к веб-сайту. Балансировщик нагрузки отправил его запрос на экземпляр роли №2. Всё, состояние сессии потеряно, так как экземпляр №2 не может обратиться к памяти экземпляра №1. Кроме этого, когда вы остановите экземпляр сервиса, на котором в памяти сохранено состояние сессии, естественно, что состояние потеряется и в этом случае.
Не отвлекаясь на детали собственной реализации custom-провайдера хранилища и дальнейшего хранения состояния сессии в этом хранилище, посмотрим, что используют разработчики для хранения состояния сессии в Windows Azure.
Первый способ – сервисы хранилища таблиц (Windows Azure Table Storage)
Теория и практика по сервису хранилища таблиц доступна по следующим ссылкам:
Лабораторная работа "Изучая хранилище Windows Azure". Ч.1. Таблицы.
azure bootcamp. таблицы в windows azure. ч.6
Основы хранилища Windows Azure. Очереди.
С этим способом всё достаточно прозрачно. Достаточно хранить каждую сессию в виде записи в хранилище таблиц со столбцом, указывающим время истечения сессии при неактивности пользователя. Сервис таблиц дёшев, однако может быть не так быстр как SQL Azure.
Для использования сервиса хранилища таблиц в Windows Azure для хранения состояния сессии сначала необходимо добавить следующий код в файл web.config вашего проекта.
<sessionState mode="Custom" customProvider="TableStorageSessionStateProvider"> <providers> <clear/> <add name="TableStorageSessionStateProvider" type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider" /> </providers> </sessionState>
Подробнее про этот способ сохранения состояния сессий можно почитать на MSDN.
Второй способ – SQL Azure
Про основы использования SQL Azure можно почитать и посмотреть по следующим ссылкам:
azure bootcamp. sql azure. ч.3
Руководство по доставке SQL Azure
Лабораторная работа "SQL Azure". Ч.1. Использование SSMS, SQL Management Portal
Лабораторная работа "SQL Azure". Ч.2. Использование клиентских библиотек .NET.
Лабораторная работа "SQL Azure". Ч.3. Подключение к SQL Azure из Java-приложения.
Лабораторная работа "SQL Azure". Ч.4. Подключение к SQL Azure из PHP.
Несмотря на то, что использование SQL Azure в вашем приложении несколько более дороже, нежели использование сервисов хранилищ, и требует дополнительной подготовки и настройки сервера SQL Azure и БД, оно может быть эффективней в том случае, если у вас уже есть готовая БД. Подготовка к работе с SQL Azure для сохранения состояния сессии аналогична подготовке к использованию сервисов хранилищ таблиц. Вам всего лишь необходимо добавить в web.config следующий код.
<sessionState mode="SQLServer" sqlConnectionString="Server=serverName.database.windows.net;Database=db;User ID=[login]@[serverName];Password=[password];Trusted_Connection=False;Encrypt=True;" cookieless="false" timeout="20" allowCustomSqlDatabase="true" />
Третий способ, самый нетривиальный, но самый предпочитаемый – Caching
Сервис кэширования Windows Azure является компонентом Windows Azure Building Blocks, предоставляющим дополнительную функциональность вашему приложению. Данный компонент реализует функциональность высокопроизводительного распределенного кэширования в памяти. Поэтому, данная опция является наиболее предпочтительной из всех трёх, так как время чтения из оперативной памяти в разы меньше времени чтения с диска.
Для использования сервиса кэширования вам необходимо опять же добавить кусок кода в файл web.config.
<sessionState mode="Custom" customProvider="AzureCacheSessionStoreProvider"> <providers> <add name="AzureCacheSessionStoreProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cacheName="default" useBlobMode="true" dataCacheClientName="default" /> </providers> </sessionState>
И почитать подробнее на MSDN.
Кстати, этот способ при неправильном его использовании может привести вас к большому счёту в конце финансового периода. Подробнее про цены на использование сервиса кэширования можно почитать на официальном сайте Windows Azure в России.
Alexander Belotserkovskiy edited Original. Comment: added formatting