Одна из новых функций, представленных в весеннем обновлении для Windows Azure, — это возможность использовать память в ваших вычислительных экземплярах для кэширования. Этот кеш распределяется по всем экземплярам вашего приложения, поэтому он масштабируется вместе с вашим приложением, и данные, хранящиеся в нем, доступны для всех ваших экземпляров.
Другая интересная особенность этого кэша заключается в том, что он поддерживает проводной протокол Memcache, поэтому к нему может обращаться любой клиент Memcache. Вы можете узнать больше о новой функции кэширования в Windows Azure Caching (Preview) .
Практически все шаги по настройке предварительного просмотра кэширования Windows Azure выполняются в файлах конфигурации, поэтому его можно использовать на любом языке программирования, который вы можете опубликовать в качестве облачной службы Windows Azure. Для этого поста я собираюсь использовать проект RubyRole в качестве примера.
Примечание . На момент написания этой статьи биты, необходимые для включения кэширования, были доступны только в Windows Azure SDK для .NET . Поэтому вам нужно будет установить его, чтобы успешно использовать кэширование из облачной службы Windows Azure.
Кэширование предварительного просмотра битов
Первое, что вам нужно, это Windows Azure SDK для .NET . В настоящее время это (2/2/2012) единственный Windows Azure SDK, который содержит биты, необходимые для включения кэширования в облачной службе. Вы можете узнать, установлены ли эти биты, проверив каталог для кэширования в C: \ Program Files \ Microsoft SDKs \ Windows Azure.NET SDK \ 2012-06 \ bin \ plugins .
Эти файлы используются как в локальном эмуляторе Windows Azure, так и при упаковке и развертывании приложения в Windows Azure.
Совмещенный против посвященный
Есть два способа использовать новую функцию кэширования; либо путем совместного размещения кэша с вашим приложением, использования памяти в той же роли, в которой выполняется ваше приложение, или путем создания отдельной рабочей роли, которая предназначена для кэширования. Компромисс состоит в том, что использование того же пула памяти, которое используется вашим приложением, оставляет приложению меньше памяти, а использование выделенной рабочей роли использует дополнительный вычислительный экземпляр и увеличивает стоимость размещения облачной службы.
Для выделенного параметра также существует проблема, заключающаяся в том, что ваше приложение должно найти имя среды выполнения шлюза Memcache для выделенного экземпляра, чтобы оно знало, куда направить клиента для конечной точки memcache. Я еще не совсем понял, как это работает, поэтому я остановлюсь на описании совместного размещения в этом посте и позже вернусь к выделенному кешированию.
Пример совместного размещения
В ServiceDefinition выполните следующие шаги:
-
Импортируйте модуль кэширования:
<Imports> <Import moduleName="Caching"/> </Imports>
Эта запись находится внутри вашей записи в сети или рабочей роли.
-
Добавить местный магазин. Это в первую очередь для кэша для хранения информации, такой как журналы:
<LocalStorage cleanOnRoleRecycle="false" name="Microsoft.WindowsAzure.Plugins.Caching.FileStore" sizeInMB="1000"/>
Эта запись идет внутри записи LocalResources.
-
Добавьте конечную точку, которую клиент будет использовать для доступа к кешу по протоколу Memcache. Так как мы собираемся использовать кеш из нашего приложения, а не выставлять его в Интернете, это должен быть InternalEndpoint:
<InternalEndpoint name="memcache_default" protocol="tcp"> <FixedPort port="11211"/> </InternalEndpoint>
Эта запись входит в раздел EndPoints.
<Setting name="Microsoft.WindowsAzure.Plugins.Caching.NamedCaches" value="" /> <Setting name="Microsoft.WindowsAzure.Plugins.Caching.Loglevel" value="" /> <Setting name="Microsoft.WindowsAzure.Plugins.Caching.CacheSizePercentage" value="30" /> <Setting name="Microsoft.WindowsAzure.Plugins.Caching.ConfigStoreConnectionString" value="" />
Они определяют параметры конфигурации для кэша:
- NamedCache позволяет вам создавать несколько кэшей, которые имеют отдельные конфигурации, такие как время жизни, политики удаления и т. Д. Для получения дополнительной информации см. Раздел « Именованные кэши» в разделе « Обзор кэширования Windows Azure (предварительный просмотр)» .
-
Уровень логирования используется для указания уровня информации, регистрируемой в целях диагностики. Сведения о настройке уровня журнала см. В разделе « Устранение неполадок и диагностика для кэширования Windows Azure (предварительный просмотр)» .
-
CacheSizePercentage — это процент памяти в роли, который должен быть выделен для кэша. Дополнительные сведения см. В разделе Вопросы планирования емкости для кэширования Windows Azure (предварительный просмотр) .
-
ConfigStoreConnectionString указывает учетную запись хранения. При использовании эмулятора используется файл ServiceConfiguration.local.cscfg , поэтому для этого файла должно быть установлено значение «UseDevelopmentStorage = true» . При развертывании в Windows Azure это должно указывать на действительную учетную запись хранения, поэтому значение будет выглядеть примерно так: «DefaultEndpointsProtocol = https; AccountName = YOURSTORAGEACCOUNT; AccountKey = YOURSTORAGEACCOUNTKEY» .
Вот и все. Вы готовы использовать кеширование из вашего приложения. Для своих тестов я использовал драгоценный камень Далли со следующим кодом:
require 'sinatra' require 'dalli' set :server, :thin set :port, ENV['PORT'] set :bind, ENV['ADDRESS'] dc = Dalli::Client.new('localhost:11211') dc.set('message', 'Hello World!') get '/' do dc.get('message') end
Шим против не-шим
Хотя приведенный выше пример работает, на самом деле это не самый быстрый метод. Видите ли, весь трафик, использующий протокол Memcache, направляется через шлюз в кэш Windows Azure. Из-за различий между схемами хеширования, используемыми в Memcache и Windows Azure, в шлюзе должна выполняться некоторая трансляция, что может снизить производительность.
В вашей роли может быть загружена оболочка, которая обрабатывает этот перевод до того, как запрос достигнет шлюза, что повышает производительность по сравнению с использованием только одного шлюза. Оболочка распространяется как Windows Azure Caching Memcache Shim , которая представляет собой пакет NuGet. Насколько я знаю, вы можете использовать пакеты NuGet только в проекте Visual Studio.
Вы можете прочитать больше об этом в теме Memcache Wrapper для Windows Azure Caching (Preview) , и Саймон Дэвис опубликовал пример проекта использования этой оболочки с облачным сервисом Node.js. Вы можете найти этот проект NodeCacheExample на GitHub.
Резюме
Несмотря на то, что вышесказанное в значительной степени является хаком, чтобы заставить предварительный просмотр кэширования работать с облачным сервисом Ruby, я подозреваю, что после того, как он выйдет из предварительного просмотра, его будет немного легче включить для приложений, не являющихся .NET. Кроме того, вышеприведенные адреса используются только в кеше; Я продолжу исследовать, как реализовать выделенное решение для кэширования, и опубликую свои выводы в блоге.
Полный пример решения с использованием совмещенного кэша см. В ветке совмещенного кэша проекта RubyRole.