Сегодня сложно представить какую-либо высоконагруженную систему, в которой можно было бы обойтись без кеширования данных. Поэтому практически всегда используются те или иные механизмы кеширования. В контексте облачных решений это даёт следующие преимущества:
- увеличение скорости чтения/записи данных, что позволяет уменьшить время отклика системы;
- обеспечения «общей памяти» для различных экземпляров, что является одним из необходимых условий горизонтального масштабирования
- снижение стоимости, за счёт более редкого обращения к базе данных (чтение из БД является более дорогой операцией, по сравнению со чтением значения из кеша)
В данной публикации я хотел бы рассмотреть, что доступно на сегодняшний день для разработчиков платформы Azure в качестве механизмов кеширования данных. Для тех кто давно работает со службами кеша тут будет мало интересного, так как всё будет рассмотрено поверхностно, но для тех кто только начинает с этим работать, я постараюсь дать хорошую стартовую точку для дальнейшего более глубокого знакомства с темой.
Azure предлагает несколько моделей организации кеширования:
- Кеш в роли (In-Role Cache)
- Управляемая служба кеша (Managed Cache Service)
- Кеш Azure Redis (Azure Redis Cache)
Кеш в роли (In-Role Cache)
В данной модели кэш входит в состав облачной службы, внутри которой выбирается роль для размещения кеша. Все экземпляры выбранной роли объединяют ресурсы памяти и образуют кластер кеша (*).
(*) кластер кеша
Так как роли Azure могут быть представлены несколькими экземплярами (виртуальными машинами), то в случае более одного экземпляра будет сформирована распределённая служба кеша, которая будет использовать объединенную память всех машин обслуживающих роль.
Поддерживается две топологии развертывания:
- Совместное расположение (co-located) – роль обслуживает не только кеш, но и код других приложений; в настройках роли необходимо указать % от общего объёма памяти роли, который будет отдан для нужд кеширования
- Выделенное расположение (dedicated) – выделяется отдельная Worker роль, все ресурсы которой будут использоваться для обслуживания кеша
Так же данная модель поддерживает концепцию именованных кешей, позволяющая задать индивидуальные политики кеширования для каждого именованного кеша. Кеш с именем Default создаётся по умолчанию и не может быть удалён. Ниже представлен пример настроек параметров на вкладке Кэширование в параметрах роли в Visual Studio:
Для того, чтобы воспользоваться созданной службой кеша, клиенты должны выполнить следующие шаги:
- Добавить Nuget пакет, в проект, который будет использовать кеш. Это добавит все необходимые библиотеки а также обновит файл web.config, добавив в него новые секции <dataCacheClients/> и <cacheDiagnostics/>.
- Указать имя роли (identifier), обслуживающей кластер кеша, в соответствующей секции файла web.config:
- Создать экземпляр DataCache в коде
или
- Воспользоваться методами созданного экземпляра
К преимуществам данного подхода можно отнести простоту и гибкость настройки при развёртывании приложения (application deployment), а также более низкую стоимость по сравнению с другими. К недостаткам – необходимость самостоятельного управления сервисом (в случае с Managed Cache Service или Azure Radis Cache управление на себя берёт компания Microsoft).
Для более подробного знакомства можно обратиться к следующей странице на сайте документации Azure.
Управляемая служба кеша (Managed Cached Service)
Несмотря на то, что еще в конце 2013 года данная модель находилась в режиме предварительного просмотра (preview), сегодня её использование перестало быть рекомендованным. Вместо неё Microsoft предлагает использование Azure Redis Cache. На момент написания статьи (апрель 2015) вы не сможете создать управляемую службу кеша через Azure Management Portal, но при необходимости, можно воспользоваться Azure Powershell SDK и создать сервис из Powershell консоли.
Т.к. данная модель перестала быть рекомендованной, я не буду на ней подробно останавливаться. При необходимости можно обратиться к следующей странице на сайте документации Azure. В случае необходимости обновить существующую управляемую службу кеша на более новый тип кеша (Azure Redis Cache) можно обратиться к следующей инструкции.
Кеш Azure Redis (Azure Redis Cache)
Что такое Redis
Redis (REmote DIctionary Server) – сетевое журналируемое хранилище данных. По сути это сверхбыстрая база данных, которая по умолчанию хранится в оперативной памяти, но также может быть настроена для дополнительного хранения данных на жестком диске. Все данные представлены в виде словаря, в котором ключи связаны со своими типизированными значениями. Поддерживаются следующие типы данных: строки, списки (lists), множества (sets), хеш-таблицы (hashsets) и упорядоченные множества (sorted sets).
Установка Redis
Установка Redis сервера возможна на всех основных операционных системах (Linux, OSX, BSD family, Windows). Сделать это можно согласно инструкции на официальном сайте. Стоит отметить, что официально для Windows поддержки нет, но «Microsoft Open Tech group» создала порт, который практически не отличается от оригинала и отлично подходит для ознакомления. Для использования в продакшене он не рекомендован и в нём как правило отсутствуют самые последние новшества, которые есть в официальных релизах.
Быстрый старт с Redis
Если вы никогда прежде не пробовали использовать Redis и не хотите возиться с установкой, то есть великолепный туториал, который является веб эмуляцией консольного клиента — где внизу у вас есть возможность печатать команды, а в самом окне видеть результаты их выполнения. Набрав слово TUTORIAL в командной строке, вы увидите ряд подсказок, которые проведут вас через основы использования Redis. Ниже приведён screenshot этого сайта, на котором создаётся строковое значение “Hellow World!”, доступ к которому возможен по ключу MyKey.
Клиенты Redis
В основе общения с сервером лежит очень простой механизм: клиент устанавливает TCP соединение на порт 6379 (по умолчанию) и посылает команды согласно специального протокола RESP (REdis Serialization Protocol), а сервер в ответ присылает результаты выполнения команд. Реализовав данный не сложный протокол, у вас будет своя собственная реализация клиента. Но для начала я бы рекомендовал обратиться к списку уже существующих реализаций, которые существую практически для всех современных языков — полный список клиентов можно найти тут.
Redis в контексте Azure
Если вы уже разобрались что такое Redis и как с ним работать, то остаётся буквально пару моментов, на которые стоит обратить внимание при работе в Azure Redis Cache.
- При создании экземпляра Azure Redis Cache будут предложены различные ценовые предложения: Basic и Standart. Для разработки, тестирования и не критических узлов системы следует использовать более дешёвую версию – Basic, которая отличается от аналогичных Standart версий отсутствием второго зеркального узла (реплики), и соответственно не подлегает соглашению об уровне обслуживания SLA. Детальней про цены можно узнать тут.
- Azure Redis Cache не поддерживается Azure Emulator’ом. Для локальной работы необходимо запустить свой Redis сервер (локальный или удалённый).
- По умолчанию мониторинг кеша выключен и для его активации необходимо выполнить ряд шагов (детали тут).
- После создания экземпляра кеша загляните в раздел настроек, там вы обнаружите множество полезных вещей, среди которых: включение SSL, политики поведения при достижении максимального объёма памяти, настройки прав доступа и другое.
Пример использования
Дабы не изобретать велосипед и соревноваться с тех-райтерами компании Микрософт, в этом разделе я приведу ряд ссылок на русскоязычные разделы сайта MSDN, в которых замечательно описаны основные шаги, необходимые для ознакомления с Redis в .Net приложениях.
Итак, прежде чем использовать Azure Redis Cache, нам необходимо создать и настроить экземпляр через портал управления Azure.
Далее необходимо добавить нужную реализацию клиента Redis. Рекомендованной реализацией в .Net приложениях является реализация от StackExchange, которая доступна нам в виде Nuget пакета (детали тут).
Теперь для доступа к кешу мы создаём подключение и на его основании получаем ссылку на базу данных. Благодаря ней нам открывается удобный API для общения с Azure Redis Cache. Для подробностей этих шагов снова отсылаю вас к соответствующей странице на MSDN.
Необычное использование Azure Radis Cache
Кроме классического использования кеша (для хранения долго вычисляемых значений или значений полученных из медленного хранилища), Azure Redis Cache может быть использован для хранения ASP.NET сессии (документация) или для кеширования вывода ASP.NET (документация).
Заключение
Надеюсь данный материал дал вам возможность сформировать общее представление о механизмах кеширования в Azure. Для более детального ознакомления с темой рекомендую использовать следующие ресурсы: