WWW.BOOK.LIB-I.RU
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - Электронные ресурсы
 
s

Pages:     | 1 || 3 |

«РАЗРАБОТКА МУЛЬТИТЕНАНТНЫХ Patterns & Practices ПРИЛОЖЕНИЙ ДЛЯ ОБЛАКА на платформе Microsoft Windows Azure Доминик Беттс (Dominic Betts) Алекс Хомер (Alex Homer) Алехандро Езерски (Alejandro ...»

-- [ Страница 2 ] --

Помимо проектов для двух веб-ролей, решение также включает проект для рабочей роли и проект библиотеки под названием TailSpin.Web.Survey.Shared, которая содержит код, совместно используемый веб-ролью и рабочей ролью. Этот общий код содержит классы модели и уровень доступа к данным.

Реализация управления сеансами Приложение Surveys должно сохранять данные состояния для каждого пользователя, когда они работают над созданием опроса. В этом разделе рассматриваются проект и реализация процесса управления данными состояния для пользователя в приложении Surveys.

В следующих примерах кода показано, как методы действия в классе контроллера SurveysController в проекте TailSpin.Web используют свойство MVC TempData для кэширования определения опроса, когда пользователь разрабатывает новый опрос. В фоновом режиме свойство TempData использует объект сеанса ASP.NET для хранения кэшированных объектов.

Показанный здесь метод New, который обрабатывает запросы GET, вызывается в момент перехода на страницу New Survey.

C# [HttpGet] public ActionResult New() { var cachedSurvey = (Survey)this.TempData[CachedSurvey];

if (cachedSurvey == null) { cachedSurvey = new Survey(); // First time to the page } var model = this.CreateTenantPageViewData(cachedSurvey);

model.Title = "New Survey";

this.TempData[CachedSurvey] = cachedSurvey;

return this.View(model);

}

СЕКЦИОНИРОВАНИЕ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 103

Метод NewQuestion вызывается, когда пользователь выбирает ссылку Add Question на странице Create a new survey. Этот метод извлекает кэшированный опрос, созданный методом New, в готовом для показа пользователю формате.

C# [HttpPost] [ValidateAntiForgeryToken] public ActionResult NewQuestion(Survey contentModel) { var cachedSurvey = (Survey)this.TempData[CachedSurvey];

if (cachedSurvey == null) { return this.RedirectToAction("New");

} cachedSurvey.Title = contentModel.Title;

this.TempData[CachedSurvey] = cachedSurvey;

var model = this.CreateTenantPageViewData(new Question());

model.Title = "New Question";

return this.View(model);

} ГЛАВА 4 Метод AddQuestion вызывается, когда пользователь нажимает кнопку Add to survey на странице Add a new question. Метод извлекает кэшированный опрос и добавляет в него новый вопрос, а затем обновляет опрос, хранящийся в сеансе.

C# [HttpPost] [ValidateAntiForgeryToken] public ActionResult AddQuestion(Question contentModel) { var cachedSurvey = (Survey)this.TempData[CachedSurvey];

if (!this.ModelState.IsValid) { this.TempData[CachedSurvey] = cachedSurvey;

var model = this.CreateTenantPageViewData( contentModel ?? new Question());

model.Title = "New Question";

return this.View("NewQuestion", model);

} if (contentModel.PossibleAnswers != null) { contentModel.PossibleAnswers = contentModel.PossibleAnswers.Replace("\r\n", "\n");

} cachedSurvey.Questions.Add(contentModel);

this.TempData[CachedSurvey] = cachedSurvey;

return this.RedirectToAction(“New”);

}

СЕКЦИОНИРОВАНИЕ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 105

–  –  –

Специалистам Tailspin нужно просто изменить параметры конфигурации в приложении Surveys, чтобы вместо предлагаемого по умолчанию поставщика состояния сеансов ASP.NET, который работает в оперативной памяти, подключиться к службе Windows Azure Caching. Вносить изменения в код приложения не придется. В следующих разделах рассказывается о том, какие изменения в конфигурацию внесла компания Tailspin.





Настройка кэша в службе Windows Azure Caching Tailspin использует возможности поставщика ASP.NET 4 Caching Session State Provider в веб-роли владельца. Поэтому в проекте необходимо настроить службу Windows Azure Caching. Компания Tailspin решила развернуть совмещенный кэш, который использует часть памяти, выделенной для веб-роли. Вы можете настроить параметры для данного типа кэша с помощью свойств роли в Visual Studio.

В следующем примере показана часть файла конфигурации службы, где хранятся настройки кэша. Значение для NamedCaches — это значение по умолчанию, установленное в SDK, оно позволяет изменять параметры кэша во время работы приложения путем редактирования файла конфигурации.

XML ServiceConfiguration serviceName="Tailspin.Cloud"...

Role name="Tailspin.Web" Instances count="1" / ConfigurationSettings...

Setting name="Microsoft.WindowsAzure.Plugins.Caching.NamedCaches" value="{"caches":[{"name"

:"default","policy"

:{"eviction"

:{"type":0},"expiration"

:{"defaultTTL"

:10,"isExpirable"

:true,"type":1},"

serverNotification"

:{"isEnabled"

:false}},"secondaries":0}]}" / Setting name="Microsoft.WindowsAzure.Plugins.Caching.DiagnosticLevel" value="1" / Setting name="Microsoft.WindowsAzure.Plugins.Caching.Loglevel" value="" / Setting name="Microsoft.WindowsAzure.Plugins.Caching.CacheSizePercentage" value="30" /

СЕКЦИОНИРОВАНИЕ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 107

Setting name="Microsoft.WindowsAzure.Plugins.Caching.ConfigStoreConnectionString" value=”UseDevelopmentStorage=true” / /ConfigurationSettings...

/Role Role name="Tailspin.Web.Survey.Public"...

/Role Role name="Tailspin.Workers.Surveys"...

/Role /ServiceConfiguration В этом примере показано, как настроить используемый по умолчанию кэш, который использует 30 % от доступной памяти в экземплярах веб-роли Tailspin.Web. Здесь применяется локальный эмулятор хранилища для хранения состояния выполнения кэша, и необходимо внести изменения в настройки, чтобы переключиться на учетную запись хранения Windows Azure при развертывании приложения в Windows Azure.

Tailspin использует NuGet для добавления необходимых сборок и ссылок в проект Tailspin.Web.Survey.Shared.

Настройка поставщика состояния сеанса в приложении TailSpin.Web Наконец, компания Tailspin внесла изменения в файл Web.config в проекте TailSpin.Web. В следующем примере эти изменения показаны.

XML configSections...

section name="dataCacheClients" type="Microsoft.ApplicationServer.Caching.DataCacheClientsSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere"/ /configSections...

dataCacheClients tracing sinkType="DiagnosticSink" traceLevel="Error" / dataCacheClient name="default" maxConnectionsToServer="5" autoDiscover isEnabled="true" identifier="Tailspin.Web" / /dataCacheClient /dataCacheClients...

ГЛАВА 4 system.web sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider" providers add name="AppFabricCacheSessionStoreProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cacheName="default" useBlobMode="false" dataCacheClientName="default" / /providers /sessionState...

/system.web В разделе sessionState выполняется настройка приложения с целью использования кэша, предлагаемого по умолчанию поставщиком состояния сеанса Windows Azure Caching.

Кэширование часто используемых данных Общедоступный веб-сайт часто обращается к определениям опросов и данным владельца в режиме «только для чтения»

с целью отображения опроса для респондентов. Чтобы свести к минимуму задержки, приложение пытается использовать кэшированные версии этих данных, когда есть такая возможность.

В следующем примере кода показан класс TenantCacheHelper, который выделяет каждому владельцу собственную область в кэше, чтобы изолировать данные от других владельцев. В примере также показано, как метод RemoveAllFromCache удаляет из кэша все записи, принадлежащие определенному владельцу.

C# internal static class TenantCacheHelper { private static readonly DataCacheFactory CacheFactory;

private static readonly IRetryPolicyFactory RetryPolicyFactory;

...

internal static void AddToCacheT(string tenant, string key, T @object) where T : class { GetRetryPolicy().ExecuteAction(() = { DataCache cache = CacheFactory.GetDefaultCache();

if (!cache.GetSystemRegions().Contains( tenant.ToLowerInvariant()))

СЕКЦИОНИРОВАНИЕ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 109

{ cache.CreateRegion(tenant.ToLowerInvariant());

} cache.Put(key.ToLowerInvariant(), @object, tenant.ToLowerInvariant());

});

} internal static T GetFromCacheT(string tenant, string key, FuncT @default) where T : class { return GetRetryPolicy().ExecuteActionT(() = { var result = default(T);

var success = false;

DataCache cache = CacheFactory.GetDefaultCache();

result = cache.Get(key.ToLowerInvariant(), tenant.ToLowerInvariant()) as T;

if (result != null) { success = true;

} else if (@default != null) { result = @default();

if (result != null) { AddToCache(tenant.ToLowerInvariant(), key.ToLowerInvariant(), result);

} } TraceHelper.TraceInformation( "cache {2} for {0} [{1}]", key, tenant, success ? "hit" : "miss");

return result;

});

} internal static void RemoveFromCache(string tenant, string key) ГЛАВА 4

–  –  –

ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ

Все представленные в данном руководстве ссылки присутствуют в библиографическом списке на странице http://msdn.microsoft.com/library/jj871057.aspx.

Дополнительная информация о проектировании мультитенантных приложений для Windows Azure представлена в статье «Разработка многопользовательских приложений в Windows Azure».

Дополнительная информация о маршрутизации в ASP.NET представлена в статье «Маршрутизация ASP.NET» на сайте MSDN.

Дополнительная информация об использовании записей CNAME в DNS представлена в сообщении «Custom Domain Names in Windows Azure» в блоге Стива Маркса (Steve Marx).

Описание доступных вариантов кэширования в Windows Azure приводится в статье «Windows Azure Caching».

Дополнительная информация о выделении ресурсов для веб-приложений в Windows Azure представлена в статье «Provisioning Windows Azure for Web Applications».

Дополнительная информация о мягких и жестких ограничениях в Windows Azure представлена в статье «Рекомендации по проектированию крупномасштабных служб в облачных службах Windows Azure» на сайте MSDN.

Для получения дополнительной информации о плавных API см. статью «Fluent interface» на сайте Wikipedia.

Дополнительная информация о библиотеке Task Parallel Library: «Библиотека параллельных задач (TPL)» на сайте MSDN.

Чтобы узнать о преимуществах использования библиотеки Task Parallel Library вместо того, чтобы работать с пулом потоков напрямую, см.

следующие материалы:

• Статья «Оптимизация управляемого кода для многоядерных компьютеров» в журнале MSDN Magazine.

• Сообщение «Choosing Between the Task Parallel Library and the ThreadPool» в блоге Parallel Programming with.NET.

ГЛАВА 4 Максимизация доступности, масштабируемости и эластичности В этой главе рассматриваются вопросы максимизации производительности и доступности мультитенантных приложений, работающих в Windows Azure. Вы узнаете, как сделать приложение масштабируемым и увеличить его быстродействие, и научитесь эффективно использовать эластичность платформы Windows Azure, чтобы свести к минимуму эксплуатационные расходы без ущерба для производительности.

В этой главе обсуждаются вопросы, связанные с максимизацией доступности с помощью функций определения географического положения, служб кэширования и сети доставки контента (Content Delivery Network, CDN). Также рассматриваются вопросы повышения масштабируемости с использованием очередей хранилища Windows Azure, фоновой обработки и асинхронного кода, а также вопросы обеспечения эластичности путем регулирования количества экземпляров веб-ролей и рабочих ролей, которые развертываются и выполняются.

–  –  –

В мультитенантном приложении можно сопоставить группы пользователей с конкретными ресурсами. Например, одна рабочая роль может работать с владельцами с подпиской Premium, а вторая — с владельцами с подпиской Standard. Такой подход позволяет отдельно масштабировать рабочую роль для владельцев с подпиской Premium. Это может быть полезно, если вы предлагаете отдельные соглашения об уровне обслуживания для подписок Premium и Standard.

Помимо возможности запуска нескольких экземпляров роли, Windows Azure предоставляет дополнительные возможности, например кэширование, специально предназначенные для увеличения масштабируемости приложений.

Кэширование Один из наиболее эффективных способов повышения масштабируемости приложения Windows Azure — использование кэша. Как правило, рекомендуется помещать в кэш часто используемые данные из хранилища BLOB-объектов, табличного хранилища и баз данных, например базы данных SQL. Кэширование помогает свести к минимуму задержки при получении данных, уменьшить нагрузку на системы хранения и сократить количество обращений к хранилищу.

Однако вы должны определить необходимый объем кэша, политику окончания Если вы решили использовать срока действия для удаления информации из кэша, стратегию для обеспечения совмещенный кэш Windows загрузки в кэш только правильных данных, допустимый объем устаревших данных. Azure в одном или нескольких В приложении Appendix E «Maximizing Scalability, Availability, and Performance» экземплярах вашей роли, в руководстве «Building Hybrid Applications in the Cloud on Windows Azure» подходы необходимо рассмотреть вариант выделения памяти к кэшированию рассматриваются в контексте нескольких различных сценариев.

кэшу, а не приложению.

В мультитенантном приложении необходимо также предусмотреть возможность изоляции данных разных владельцев в кэше. Для получения дополнительной информации о секционировании кэша в Windows Azure, см. главу 4 «Секционирование мультитенантных приложений».

Платформа Windows Azure предлагает два варианта для кэширования данных приложений. Windows Azure Shared Caching и Windows Azure Caching. Сравнительные характеристики двух подходов представлены в статье «Overview of Caching in Windows Azure» на сайте MSDN.

–  –  –

Подписи коллективного доступа Подписи коллективного доступа (Shared Access Signatures, SAS) помогут сделать ваше приложение масштабируемым, позволяя клиентам получать доступ непосредственно к элементам, хранящимся в BLOB-объектах, таблицах или очередях.

Это снижает нагрузку на веб-роли и рабочие роли, поскольку они больше не будут выступать посредниками в этом процессе. Например, ваше приложение может использовать SAS, чтобы сделать содержимое BLOB-объекта (это может быть, например, изображение) доступным прямо из веб-браузера, при этом не придется делать BLOB-объект общедоступным или передавать его содержимое сначала в веб-роль, а затем в браузер клиента.

Подписи коллективного доступа также позволяют предоставить рабочей роли, размещенной в другой подписке Windows Azure, доступ к определенным строкам в таблице, при этом вам не придется передавать этой роли ключи вашей учетной записи хранения или использовать рабочую роль в вашей подписке в качестве посредника.

Дополнительная информация о SAS представлена в статье «Creating a Shared Access Signature» на сайте MSDN.

Сеть доставки контента Сеть доставки контента (Content Delivery Network, CDN) позволяет размещать статические ресурсы приложения, например элементы медиа, на граничных серверах кэширования. Это позволяет свести к минимуму время ожидания для клиентов, которые запрашивают эти элементы, а также повышает масштабируемость приложения, поскольку веб-ролям не придется выполнять часть стандартных задач.

Для получения дополнительной информации о CDN см. статью «Caching» на странице с описанием платформы Windows Azure.

ОБЕСПЕЧЕНИЕ ЭЛАСТИЧНОСТИ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ

Эластичность приложения — это способность динамически масштабироваться в соответствии с текущей и ожидаемой нагрузкой. Вопросы, которые обсуждались в предыдущем разделе, посвященном масштабируемости веб-ролей и рабочих ролей в мультитенантных приложениях, также актуальны и с точки зрения эластичности. В частности, необходимо определиться, на каком уровне будет обеспечиваться эластичность: для отдельных владельцев, групп владельцев или всех владельцев приложения. Кроме того, необходимо выбрать элементы приложения (роли, хранилища данных, очереди и кэши), которые будут эластичными.

Эластичность особенно важна для мультитенантных приложений, поскольку ожидаемая нагрузка на них меньше поддается прогнозированию. Для однотенантного приложения вы можете предсказывать пиковые нагрузки в течение дня и планировать ресурсоемкую пакетную обработку на другое время. Но если приложение мультитенантное, на предсказуемость модели его использования надеяться не стоит, особенно когда пользователи находятся в самых разных уголках мира. Тем не менее, если у вас большое количество владельцев, колебания интенсивности использования ресурсов нередко усредняются.

МАКСИМИЗАЦИЯ ДОСТУПНОСТИ, МАСШТАБИРУЕМОСТИ И ЭЛАСТИЧНОСТИ 117

–  –  –

Примеры сценариев для рабочих ролей В следующей таблице представлены примеры сценариев, в рамках которых функциональность приложения можно секционировать, разделив на несколько рабочих ролей с целью реализации алгоритмов асинхронной обработки. Не все представленные сценарии относятся к приложению Surveys, но для каждого сценария указывается, как запустить процесс выполнения задачи и сколько экземпляров рабочих ролей можно использовать.

–  –  –

Из представленных примеров сценариев становится понятно, что рабочие роли, которые выполняют фоновую обработку, можно классифицировать в соответствии с критериями, указанными в следующей таблице.

–  –  –

В сценарии, где только одна рабочая роль обновляет данные, и ей требуется эксклюзивный доступ, можно использовать несколько рабочих ролей, если вы можете реализовать механизм блокировки для управления одновременным доступом. Если вы планируете реализовать алгоритм контроля параллелизма, чтобы избежать повреждения данных, которые используются совместно, вам нужно выбрать оптимистическую или пессимистическую блокировку, определив, какой из подходов гарантирует максимальную пропускную способность в вашем конкретном случае.

Триггеры для фоновых задач Триггером для фоновой задачи может быть таймер или сигнал в форме сообщения из очереди. Выполнять фоновые задачи в определенное время целесообразно, когда необходимо обрабатывать большое количество данных, которые поступают небольшими порциями. Затраты на реализацию этого подхода будут меньше, кроме того, он обеспечивает более высокую пропускную способность, чем подход, который подразумевает обработку каждого отдельного фрагмента данных по мере их появления. Пакетная обработка помогает свести к минимуму количество обращений к хранилищу для обработки данных.

Этот тип триггеров можно реализовать с помощью объекта Timer в рабочей роли, задача будет выполняться через фиксированные промежутки времени.

Максимальную гибкость обеспечивает планировщик задач Windows в рабочей роли или специализированные библиотеки, такие как Quartz.NET.

ГЛАВА 5

–  –  –

РИСУНОК 1.

Выполнение нескольких типов фоновых задач В сценарии, где несколько экземпляров рабочей роли могут выполнять один и тот же набор типов задач, необходимо различать эти задачи, чтобы понять, можно ли выполнять конкретную задачу в нескольких рабочих ролях одновременно или лучше выполнять эту задачу в одной рабочей роли.

ГЛАВА 5 Запретить одновременный запуск нескольких копий задачи можно с помощью механизма блокировок. В Windows Azure для этой цели можно использовать сообщения в очереди или «аренду» BLOB-объекта. На диаграмме на рисунке 2 показано, что несколько копий задач А и В могут выполняться одновременно, но для задачи Б разрешено выполнение только одной копии. Одна из копий задачи Б «берет в аренду» BLOB-объект и запускается, другие копии задачи Б не запустятся до тех пор, пока не получат доступ к этому объекту.

–  –  –

ЦЕЛИ И ТРЕБОВАНИЯ

В данном разделе описаны цели и требования, которые компания Tailspin предъявляет к доступности, масштабируемости и эластичности приложения Surveys.

Производительность и масштабируемость с точки зрения сохранения ответов на опросы Когда пользователь заполняет форму опроса, приложение должно помещать его ответы в хранилище, чтобы создатель опроса мог получить доступ и проанализировать результаты.

Приложение Surveys должно сохранять сводные данные опроса таким образом, чтобы обеспечивалось соответствие трем следующим требованиям:

• Создателю опроса нужно предоставить возможности для доступа к результатам.

• Приложение должно вычислять сводную статистику на основе ответов.

• Создателю опроса необходимо предоставить возможности для экспорта ответов в формате, пригодном для последующего комплексного анализа результатов.

ГЛАВА 5

–  –  –

Разработчикам компании Tailspin также необходимо предоставить возможность проводить комплексное тестирование компонентов, которые отвечают за вычисление сводных статистических показателей, при этом не должно быть никаких зависимостей от хранилища Windows Azure.

Информация о географическом положении в приложении Surveys Tailspin планирует предоставлять доступ к приложению Surveys как подписчикам от крупных предприятий, так и отдельным пользователям. Подписчик, находясь в любой точке мира, возможно, захочет провести опрос в другом географическом Также предусмотрены интеграрегионе. В процессе регистрации подписчик указывает географическое положе- ционные тесты для комние — где он создает опросы и анализирует результаты, это также географическое плексной проверки поведения местоположение по умолчанию для публикации опросов. Платформа Windows Azure приложения, использующего позволяет выбирать географическое положение для ваших служб Windows Azure, хранилище Windows Azure.

чтобы ваше приложение было размещено как можно ближе к потенциальным пользователям.

Приложение Surveys — это Tailspin предоставляет подписчикам службы Surveys возможность переопределять служба, «осведомленная географическое положение по умолчанию для публикуемого опроса. По умолчанию, о местоположении».

подписчик из США будет публиковать свои опросы в размещенном в США экземпляре приложения Surveys, а европейский подписчик — в Европе. Однако вполне возможно, что подписчик захочет провести опрос в «чужом» географическом регионе. На рисунке 3 показана подобная ситуация — подписчик из США планирует запустить опрос в Европе:

–  –  –

ОБЗОР РЕШЕНИЯ

В данном разделе описан подход, реализованный компанией Tailspin для достижения целей и удовлетворения требований, связанных с обеспечением доступности, масштабируемости и эластичности приложения.

Варианты сохранения ответов на опросы Как вы узнали из главы 3 этого руководства, специалисты Tailspin решили использовать хранилище BLOB-объектов Windows Azure для хранения ответов на опросы, в которых принимают участие посетители общедоступного веб-сайта. В этом разделе рассказывается о том, как специалисты Tailspin пришли к такому решению и какие факторы они принимали во внимание.

Помимо вариантов, подразумевающих непосредственную запись в хранилище и использование шаблона отложенной записи, которые обсуждаются ниже, специалисты Tailspin также рассматривали возможность использования подписей коллективного доступа для того, чтобы браузер клиента мог сохранять результаты опроса непосредственно в хранилище BLOB-объектов и помещать уведомление непосредственно в очередь сообщений. Одно из главных преимуществ такого подхода связано с тем, что веб-роль больше не будет управлять процессом сохранения ответов на опросы. Однако специалисты отказались от этого варианта из-за высокой сложности реализации надежного кроссбраузерного решения, а также потому, что не хотели выводить процесс сохранения ответов из зоны ответственности веб-роли.

Запись непосредственно в хранилище данных На рисунке 4 показан процесс, реализованный разработчиками Tailspin для сохранения ответов, которые записываются непосредственно в хранилище BLOB-объектов с использованием кода, выполняемого в экземплярах веб-роли.

–  –  –

РИСУНОК 4.

Сохранение ответов на опрос и генерация статистики ГЛАВА 5 На рисунке 4 также показано, как экземпляры рабочей роли извлекают каждый новый набор ответов из хранилища и используют его для обновления сводной статистики по этому опросу. Единственное, что не показано на этом рисунке: как рабочая роль получает от веб-роли уведомление о том, что новый набор ответов был помещен в хранилище BLOB-объектов.

Эту задачу веб-роль решает путем передачи сообщения с идентификатором нового набора ответов в очередь уведомлений, которую прослушивает рабочая роль.

При выборе механизма хранения разработчики анализировали несколько проблем, например у них возникали сомнения по поводу того, что сохраняя полный набор ответов непосредственно в хранилище Windows Azure, веб-роль сможет без задержки (показано как Тp на рисунке 4) в критический момент — когда пользователь только что ответил на все вопросы.

Задержка в такой ситуации может привести к тому, что пользователь закроет страницу опроса до того, как все данные будут переданы. Для решения этой проблемы разработчики решили использовать шаблон отложенной записи.

Применение шаблона отложенной записи Шаблон отложенной записи — это механизм, который позволяет коду делегировать задачи, на выполнение которых может потребоваться некоторое время, в таком случае приложению не придется ждать их завершения. Эти задачи могут выполняться асинхронно в фоновом режиме, а код, который выступает инициатором, продолжит выполнять другие задачи или вернет управление пользователю.

Шаблон отложенной записи особенно полезен, когда задачи, которые должны быть выполнены, можно запускать в качестве фоновых процессов, и вы хотите освободить пользовательский интерфейс приложения для других задач как можно быстрее. Однако это означает, что вы не сможете вернуть результат выполнения фонового процесса пользователю в текущем запросе. Например, если шаблон отложенной записи используется для того, чтобы поместить размещенный пользователем заказ в очередь, вы не сможете указать номер заказа из фонового процесса на странице, которую вы передаете в браузер.

В Windows Azure запуск фоновых процессов, как правило, инициируется для того, чтобы пользовательский интерфейс мог делегировать задачи, отправляя сообщения в очередь хранилища данных Windows Azure. Очереди обычно используются для организации взаимодействия между ролями в приложении Windows Azure, поэтому рекомендуется рассмотреть возможность применения очередей в рамках таких операций, как сохранение данных, собранных пользовательским интерфейсом. Код пользовательского интерфейса может записать данные в очередь, а затем передать управление другим пользователям, при этом нет необходимости ждать завершения текущих операций с данными.

МАКСИМИЗАЦИЯ ДОСТУПНОСТИ, МАСШТАБИРУЕМОСТИ И ЭЛАСТИЧНОСТИ 129

На рисунке 5 показан шаблон отложенной записи, который приложение Surveys могло бы использовать для сохранения заполненного опроса в хранилище данных Windows Azure.

–  –  –

РИСУНОК 5.

Шаблон отложенной записи для сохранения ответов на опросы в приложении Surveys Тесты, которые провели специалисты Tailspin, показали, что запись в очередь занимает приблизительно столько же времени, сколько и запись в хранилище BLOB-объектов, поэтому не будет никакой дополнительной нагрузки по сопровождению веб-роли, по сравнению с сохранением данных непосредственно в хранилище BLOB-объектов с использованием шаблона отложенной записи.

–  –  –

Рабочая роль в настоящее время выполняет две задачи, связанные с сохранением ответов и обновлением сводной статистики:

• Задача 1 опрашивает очередь Small Surveys и получает наборы ответов. Затем (не показано на рисунке) ответы помещаются в хранилище, а сводные статистические данные обновляются.

• Задача 2 опрашивает очередь Big Surveys и получает сообщения с идентификаторами наборов новых ответов, которые веб-роль уже поместила в хранилище. Затем (не показано на рисунке) ответы помещаются в хранилище, а сводные статистические данные обновляются.

Обратите внимание, что для сообщений, размер которых превышает установленный для очереди лимит, процесс практически идентичен проиллюстрированному на рисунке 4 сценарию, в рамках которого специалисты Tailspin не использовали шаблон отложенной записи.

Кроме того, если вас не устраивают ограничения, которые Windows Azure устанавливает для максимального размера сообщений в очередях, вы можете использовать шину интеграции Windows Azure. Шина интеграции поддерживает сообщения размером до 256 КБ (192 КБ при использовании Base64). Чтобы получить дополнительную информацию, см. статью «Очереди Windows Azure и очереди шин обслуживания Windows Azure — сходство и отличия».

Еще одна разновидность описанного здесь подхода подразумевает использование одной очереди для транспортировки сообщений двух различных типов. Один тип сообщений используется для передачи полностью заполненного опроса в качестве полезной нагрузки, другой — содержит адрес BLOB-объекта с «большим» ответом на опрос. Затем можно реализовать метод RetrieveSurvey в подсистеме обмена сообщениями, он будет возвращать из очереди в рабочую роль «маленький» или «большой» ответ на опрос. Подсистема обмена сообщениями теперь инкапсулирует всю логику для обработки ответов разного размера, скрывая ее от остальных компонентов вашего приложения.

Масштабирование задач рабочей роли Сначала специалисты Tailspin реализовали подход, в рамках которого веб-роль вела запись непосредственно в хранилище, экземпляры рабочей роли при этом решали только одну задачу — обновляли сводную статистику. При использовании шаблона отложенной записи рабочие роли будут отвечать за две задачи: размещение ответов в хранилище (размер набора ответов не должен превышать установленный для очереди лимит) и обновление сводной статистики.

Возможно, у Tailspin появится необходимость масштабировать эти две задачи по-отдельности. Очень важно сохранять новые ответы как можно быстрее, задача вычисления сводных статистических показателей не такая срочная. Сводную статистику по ответам можно в случае возникновения какого-либо сбоя вычислить повторно, но обратное не представляется возможным. Tailspin также хочет обеспечивать различные уровни обслуживания для подписчиков пакетов Premium и Standard, чтобы привилегированные владельцы могли быстрее получать сводную статистическую информацию.

Для независимого масштабирования задач специалистам Tailspin понадобятся две отдельные рабочие роли:

• Рабочая роль, которая обновляет статистику, опрашивая очередь и извлекая из нее сообщения с идентификаторами новых наборов ответов. Как показано на рисунке 6, веб-роль использует очередь Big Surveys для информирования рабочих ролей о том, что она только что поместила новый набор ответов непосредственно в хранилище (когда размер этого набора превышает установленный для очереди лимит).

• Рабочая роль опрашивает очередь, извлекает из нее сообщения с новыми наборами ответов и помещает их в хранилище. Как показано на рисунке 6, веб-роль использует очередь Big Surveys для отправки в рабочую роль наборов ответов, размер которых превышает установленный для очереди лимит. Тем не менее эта рабочая роль должна будет уведомлять ту рабочую роль, которая обновляет статистику, о том, что она только что передала в хранилище новый набор ответов. Эту задачу веб-роль решает путем передачи сообщения с идентификатором нового набора ответов в очередь Big Surveys (см. рисунок 6).

ГЛАВА 5 Чтобы предоставлять разные уровни обслуживания (например, это касается скорости обработки сводных статистических данных), специалисты Tailspin могли бы использовать отдельные очереди для подписчиков пакетов Premium и Standard, а затем настроить рабочую роль, которая помещает ответы в хранилище, на отправку уведомлений в соответствующую очередь. Экземпляры рабочей роли, которые опрашивают эти две очереди, могут делать это с разной скоростью, также они могут использовать алгоритм для присвоения более высокого приоритета задачам подписчиков пакета Premium.

Сравнение вариантов Чтобы выбрать наилучшее решение для сохранения ответов на опросы в приложении Surveys, разработчики Tailspin рассмотрели несколько факторов:

• Необходимо как можно быстрее вывести на экран страницу с благодарностью после отправки пользователем набора ответов.

• Необходимо свести к минимуму операционные издержки, связанные с организацией обмена данными с хранилищем, в рамках различных подходов к сохранению ответов и вычислению сводной статистики.

• Влияние выбранного подхода к сохранению ответов на другие компоненты системы.

• Выбор типа постоянного хранилища (BLOB-объекты или таблицы), который наилучшим образом соответствует подходу к сохранению и обработке ответов и оказывает минимальное воздействие на другие участки системы, отвечая всем требованиям.

Чтобы понять последствия того или иного выбора, разработчики Tailspin подготовили следующую таблицу для обобщения операций, которые должны быть, по их мнению, выполнены для каждого из трех подходов.

МАКСИМИЗАЦИЯ ДОСТУПНОСТИ, МАСШТАБИРУЕМОСТИ И ЭЛАСТИЧНОСТИ 133

–  –  –

Некоторые комментарии к таблице:

• Рабочие роли могут читать пакеты сообщений из очереди, это помогает сократить расходы на организацию обмена данными с хранилищем, поскольку чтение пакета сообщений осуществляется в рамках одной транзакции. Однако это означает, что сохраненные ответы не сразу будут обработаны рабочей ролью, а если используется шаблон отложенной записи, то задержка будет возникать и при размещении ответов в хранилище.

• При использовании шаблона отложенной записи и двух отдельных рабочих ролей, эти две задачи — размещение данных в хранилище и вычисление сводной статистики — можно масштабировать по-отдельности. Эти две задачи должны получать доступ к ответам независимо друг от друга и в правильной последовательности. Одна задача читает ответы из очереди, ГЛАВА 5 записывает их в хранилище и только после этого посылает в очередь сообщение о том, что новые ответы доступны. Вторая задача получает это сообщение и читает ответы из хранилища, после чего обновляет статистику.

• Использование шаблона отложенной записи в том случае, когда сообщения превышают установленный для очереди лимит, на самом деле не имеет отношения к отложенной записи как таковой. Этот подход будет аналогичен первоначальному, который подразумевает передачу ответов непосредственно в хранилище.

• Поскольку размер большинства наборов ответов, скорее всего, не будет превышать установленный для очереди лимит, то в рамках третьего варианта, подразумевающего использование отдельных типов рабочей роли, как правило, потребуется больше обращений к хранилищу, по сравнению со сценариями, в которых преобладают большие наборы ответов.

Поддержание работоспособности пользовательского интерфейса в ходе сохранения ответов на опросы Одна из основных задач, которые необходимо решить на этапе проектирования,— свести к минимуму время, затрачиваемое на сохранение ответов на опрос, чтобы как можно быстрее вернуть управление пользовательскому интерфейсу.

Tailspin стремится сделать все возможное, чтобы предотвратить ситуацию, когда респондент закрывает сайт, не дождавшись, пока приложение сохранит его ответы. Независимо от выбранного способа сохранения ответов на опросы, приложение Surveys будет использовать отдельную задачу в экземплярах рабочей роли для вычисления и сохранения сводной статистики в фоновом режиме после того, как ответы будут сохранены.

Сначала компания Tailspin реализовала в приложении Surveys подход, в рамках которого веб-роль должна выполнять две операции над каждым набором ответов пользователей. Во-первых, она должна поместить ответы в хранилище, а затем, если эта операция прошла успешно, передать сообщение о доступности нового ответа на опрос в очередь уведомлений.

Если используется шаблон отложенной записи и общий размер набора ответов не превышает установленный для очередей хранилища данных Windows Azure лимит, то экземпляры веб-роли должны выполнять только одну операцию. Они должны отправить ответы в очередь, а вся обработка будет осуществляться в фоновом режиме. Веб-роль сразу выведет страницу с благодарностью для пользователя, а рабочие роли будут передавать ответы в хранилище и обновлять сводную статистику.

Если общий размер набора ответов превышает установленный для очередей хранилища данных Windows Azure лимит, то экземпляры веб-роли должны выполнять две операции: сохранять ответы и посылать сообщение в очередь уведомлений.

Тем не менее, как ожидается, размер большинства наборов ответов на опросы заданный предел превышать не будет.

Даже если Tailspin планирует предложить подписчикам пакета Premium ускоренное обновление сводной статистики, по сравнению с подпиской Standard, и собирается использовать для этого два разных типа рабочих ролей, веб-роль по-прежнему будет выполнять только одну операцию пока ответы не превысят установленные для очереди ограничения.

Таким образом, оптимальным вариантом с точки зрения минимизации времени отклика пользовательского интерфейса будет использование шаблона отложенной записи, поскольку в подавляющем большинстве случаев, для этого потребуется только одна операция в коде веб-роли.

МАКСИМИЗАЦИЯ ДОСТУПНОСТИ, МАСШТАБИРУЕМОСТИ И ЭЛАСТИЧНОСТИ 135

–  –  –

Предварительная обработка Шаблон отложенной записи упрощает любую дополнительную обработку ответов на данных перед их сохранением опросы перед их сохранением, без ущерба для производительности пользовательобычно используется для ского интерфейса. Эта обработка может быть связана с форматированием данных того, чтобы избежать или добавлением контекстной информации. Веб-роль помещает необработанные необходимости выполнять ответы на опрос в сообщение. Рабочая роль извлекает сообщение из очереди, обработку каждый раз, когда выполняет необходимую обработку данных, а затем сохраняет обработанные ответы эти данные читаются. на опрос.

Если приложение записы- Специалисты компании Tailspin не считают необходимой какую-либо дополнивает данные один раз, тельную обработку данных в приложении Surveys, поскольку это, скорее всего, не поа читает — N раз, то может оптимизировать процессы, которые считывают данные опросов. Разработчики обработка выполняется Tailspin пришли к выводу, что они смогут реализовать все эти процессы достаточно только один, а не N раз. эффективно, независимо от того, где размещаются ответы на опросы — в хранилище BLOB-объектов или табличном хранилище.

–  –  –

Подходы к формированию сводной статистики Разработчики компании Tailspin решили использовать рабочую роль, которая будет решать задачу формирования сводной статистики на основе результатов опроса. Использование рабочей роли позволяет приложению выполнять этот ресурсоемкий процесс как фоновую задачу, поэтому веб-роль, которая отвечает за сбор ответов на опрос, не должна блокироваться, когда приложение вычисляет сводную статистику.

Платформа для рабочих ролей, рассматриваемая в главе 4 «Секционирование мультитенантных приложений», позволяет запускать эту асинхронную задачу по расписанию. Кроме того, поскольку производится обновление одного набора результатов, эта задача должна выполняться как единый процесс, либо необходимо предусмотреть механизм управления одновременным доступом к каждому набору сводных данных.

Задачу вычисления сводной статистики компания Tailspin может решить двумя способами. Первый способ предполагает, что задача в рабочей роли получает все ответы на опрос, доступные на текущий момент, повторно вычисляет сводную статистику и сохраняет сводные данные, перезаписывая существующие. В рамках второго способа задача в рабочей роли извлекает все ответы на опросы, сохраненные приложением с момента последнего запуска задачи, и использует эти данные для корректировки сводной статистики с учетом новых результатов.

Для ведения списка новых ответов на опрос можно использовать очередь. Эта задача выполняется по расписанию, которое определяет, насколько часто задача должна проверять наличие в очереди новых результатов опроса, подлежащих обработке.

Первый способ проще в реализации, поскольку, в отличие от второго, ему не требуется механизм, который позволяет определить, какие из результатов опроса являются новыми. Успех реализации второго способа также зависит от того, удастся ли разработчикам обеспечить возможность пересчета старых сводных данных с учетом новых ответов респондентов без повторного считывания всех имеющихся результатов опроса.

Для большинства типов сводной статистики (общее, среднее, счетчик, стандартное отклонение) новые значения можно вычислить на основе текущих с учетом новых результатов. Например, если вы уже получили пять ответов числового типа, и вы знаете, что среднее для этих ответов равно 4, то когда вы получите новый ответ = 22, новое среднее значение будет вычисляться следующим образом: ((5 * 4) + 22) / 6 = 7. Обращаем ваше внимание на тот факт, что для того, чтобы вычислить новое среднее, необходимо знать не только текущее среднее, но и текущее количество ответов. Однако, предположим, что один из компонентов сводных данных должен быть списком из 10 самых популярных слов из ответов на вопрос открытого типа. В этом случае придется обрабатывать все ответы на опрос каждый раз, если только не ведется отдельный список всех используемых слов с указанием частоты их употребления. Это усложняет практическую реализацию второго способа.

ГЛАВА 5 Ключевое различие между этими двумя способами заключается в количестве обращений к хранилищу в процессе формирования сводной статистики. От этого зависит и величина затрат в рамках каждого из перечисленных подходов, и скорость вычислений. График на рисунке 4 показывает результаты сравнительного анализа количества транзакций за один месяц при реализации каждого из перечисленных способов для трех различных объемов получаемых ежедневно ответов на опросы.

Первый способ показан на графике верхней линией с меткой «Перерасчет», второму соответствует нижняя линия с меткой «Слияние».

Миллионов обращений к хранилищу данных

–  –  –

РИСУНОК 7.

Сравнение количества обращений к хранилищу данных для двух разных способов вычисления сводной статистики Из графика видно, что метод слияния позволяет компании Tailspin уменьшить число обращений к хранилищу данных.

В приложении Surveys разработчики компании решили реализовать именно этот подход.

Вертикальная шкала затрат на этом графике — логарифмическая. В анализе, по результатам которого построен этот график, принят ряд допущений («худших случаев») в отношении способа обработки результатов опросов в приложении. Цель графика — показать сравнительные характеристики двух способов с точки зрения количества транзакций, здесь не приводятся точные значения.

Метод перерасчета для повторного вычисления можно оптимизировать, если для вычисления сводных данных будут использоваться несколько ответов опроса, а не каждый отдельный ответ. Чтобы рассчитать сводную статистику с допустимой погрешностью, необходимо провести детальный статистический анализ и выбрать подходящую пропорцию ответов на опрос.

МАКСИМИЗАЦИЯ ДОСТУПНОСТИ, МАСШТАБИРУЕМОСТИ И ЭЛАСТИЧНОСТИ 139

Масштабирование задачи формирования сводной статистики Приложение Tailspin Surveys должно поддерживать масштабирование, чтобы справится с возможным увеличением количества респондентов. Необходимо, в том числе, предусмотреть возможность использования нескольких экземпляров рабочей роли, которая вычисляет сводную статистику и формирует упорядоченный список ответов. Для каждого опроса набор сводных статистических данных будет только один, поэтому приложение должно организовать одновременный доступ к одному BLOB-объекту для нескольких рабочих ролей, предотвращая повреждение данных.

Специалисты Tailspin рассматривали четыре варианта управления параллелизмом:

• Использование одного экземпляра рабочей роли. В целях обеспечения возможности масштабирования можно использовать большие экземпляры, но у такого подхода есть ограничение. Кроме того, если у вас только один экземпляр, то вы не сможете обеспечить отказоустойчивость.

• Использование модели программирования MapReduce. Этот подход позволяет Tailspin использовать несколько экземпляров задач, но усложняет решение.

• Использование пессимистического параллелизма. В рамках этого подхода статистика, связанная с несколькими опросами, блокируется, пока рабочая роль обрабатывает партию новых ответов. Рабочая роль получает партию сообщений из очереди и определяет, к каким опросам они относятся, блокирует соответствующие наборы сводных статистических данных, рассчитывает и сохраняет новую сводную статистику, а затем снимает блокировку. Это означает, что другие экземпляры рабочей роли не смогут обновить эти наборы сводных статистических данных, пока первый экземпляр не закончит их обработку.

• Использование оптимистичного параллелизма. В рамках этого подхода, когда экземпляр рабочей роли обрабатывает партии сообщений, он проверяет, не обновляются ли в данный момент сводные статистики для соответствующего опроса; эта процедура выполняется для каждого сообщения. Если другая задача уже обновляет статистику, то текущая задача помещает сообщение обратно в очередь, и оно будет обработано позднее, в противном случае, текущая задача сама обновляет статистику.

Специалисты компании Tailspin провели стресс-тестирование, чтобы выбрать оптимальное решение, после чего остановились на четвертом варианте, подразумевающем использование оптимистичного параллелизма. Выбранный подход позволяет Tailspin масштабировать экземпляр рабочей роли, обеспечивает более высокую пропускную способность при обработке сообщений, чем пессимистический параллелизм, и более высокую производительность, поскольку не требует механизма блокировки. Конечно, модель MapReduce тоже подходит для достижения поставленной цели, но система при этом становится сложнее, чем при использовании оптимистичного параллелизма.

Для получения дополнительной информации о стресс-тестировании см. главу 7 «Управление и мониторинг мультитенантных приложений». Описание модели программирования MapReduce представлено в разделе «Алгоритм MapReduce» выше в этой главе.

Работа со службой Windows Azure Caching В главе 4 «Секционирование мультитенантных приложений» рассказывается о том, каким образом Tailspin использует службу Windows Azure Caching с целью поддержки поставщика состояния сеансов Windows Azure Caching, а также о том, как изолируются данные разных владельцев в кэше. Специалисты Tailspin используют Windows Azure Caching для кэширования определений опросов и данных владельцев, чтобы свести к минимуму задержки на общедоступном веб-сайте Surveys.

Компания Tailspin решила использовать службу Windows Azure Caching и развернуть совмещенный кэш, который использует 30 % памяти, выделенной для рабочей роли Tailspin.Web. Tailspin будет контролировать уровень использования кэша и производительность роли Tailspin.Web. Специалисты хотят убедиться в том, что эти настройки обеспечивают достаточную вместимость кэша, не влияя на удобство работы с частным веб-сайтом подписчика.

В разделе «Кэширование часто используемых данных» в главе 4 показано, как реализовано кэширование на уровне доступа к данным. В приложении Tailspin Surveys за кэширование отвечают классы SurveyStore и TenantStore.

ГЛАВА 5

–  –  –

Чтобы обеспечить поддержку CDN, разработчикам Tailspin придется внести в код приложения Surveys ряд изменений.

В следующих разделах описано решение, которое Tailspin планирует реализовать в будущем, в текущей версии приложения Surveys сеть CDN не используется.

Настройка контроля доступа для контейнеров BLOB-объектов Любые данные из BLOB-объекта, которые вы хотите разместить в сети CDN, должны находиться в специализированном контейнере с разрешениями на общий доступ на чтение. Вы можете установить этот параметр при создании контейнера, вызвав метод BeginCreate класса CloudBlobContainer, также можно с этой целью вызвать метод SetPermissions в отношении существующего контейнера. В следующем примере кода показано, как настроить разрешения для контейнера.

C# protected void SetContainerPermissions(String containerName) { CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse( RoleEnvironment.GetConfigurationSettingValue( "DataConnectionString "));

CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();

CloudBlobContainer cloudBlobContainer = new CloudBlobContainer(containerName, cloudBlobClient);

BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions();

blobContainerPermissions.PublicAccess = BlobContainerPublicAccessType.Container;

cloudBlobContainer.SetPermissions( blobContainerPermissions);

} Обратите внимание, что для предоставления общего доступа используется тип BlobContainerPublicAccessType.Container.

Настройка CDN и хранение контента Доступ к CDN настраивается на уровне учетной записи хранения Windows Azure на портале управления Windows Azure.

После того как вы включили поддержку CDN для учетной записи хранения, любые данные из общедоступных контейнеров BLOB-объектов будут доступны для доставки через CDN.

Приложение должно поместить весь контент, подлежащий передаче по сети CDN, в BLOB-объекты с подходящими контейнерами. Все медиафайлы, пользовательские изображения и таблицы стилей в приложении Surveys можно поместить в эти хранилища BLOB-объектов. Например, если помимо обучающего видео в комплекте поставляется специализированный проигрыватель, и этот комплект представляет собой набор файлов HTML и скриптов, то все связанные файлы могут быть сохранены как BLOB-объекты в том же контейнере.

Если скрипты или файлы HTML содержат относительные пути к другим файлам в том же контейнере BLOB-объектов, необходимо тщательно проверять эти пути, поскольку будет учитываться регистр.

Это обусловлено тем, что в контейнере BLOB-объектов нет реальной структуры папок, и любое «имя папки» — это всего лишь часть имени файла в едином плоском пространстве имен.

ГЛАВА 5 Настройка URL-адресов для доступа к контенту Windows Azure задает URL-адреса для доступа к данным в BLOB-объектах, используя имя учетной записи и имя контейнера.

Например, если компания Tailspin создала общедоступный контейнер с именем video и будет размещать в нем обучающие видеоролики, то путь к ролику «Начало работы с приложением Surveys» в хранилище BLOB-объектов Windows Azure будет следующим: http://tailspin.blob.core.windows.net/video/gettingstarted.html. При этом предполагается, что в качестве проигрывателя для медиаконтента используется страница gettingstarted.html.

Сеть CDN предоставляет доступ к размещенному контенту с использованием URL-адресов следующего формата:

http://uid.vo.msecnd.net/, поэтому путь к обучающему видео в CDN будет следующим: http://uid.vo.msecnd.net/video/ gettingstarted.html. На рисунке 8 показана взаимосвязь между CDN и хранилищем BLOB-объектов.

http://uid.vo.msecnd.net/video/gettingstarted.html

–  –  –

С помощью записи CNAME в DNS можно сопоставить собственный URL-адрес с URLадресом CDN. Например, компания Tailspin могла бы создать запись CNAME, чтобы адрес http://files.tailspin.com/video/gettingstarted.html указывал на вилеоролик в сети CDN.

Вы должны убедиться в том, что ваш поставщик DNS настроил разрешения DNS таким образом, чтобы ваш пользовательский URL-адрес не включал несколько серверов авторизации DNS в разных географических регионах, иначе сеть CDN не будет обеспечивать значительного прироста производительности.

Чтобы получить дополнительную информацию о том, как применять пользовательские имена DNS для доступа к контенту в сети CDN, см. статью « Сопоставление содержимого CDN с пользовательским доменом ».

Когда пользователь запрашивает контент из CDN, Windows Azure автоматически направляет запрос к ближайшей доступной конечной точке CDN. Если данные BLOBобъекта были через эту конечную точку найдены, то они возвращаются пользователю. В противном случае, эти данные сначала автоматически извлекаются из хранилища BLOB-объектов, затем передаются пользователю и кэшируются в конечной точке с целью предоставления к ним доступа в дальнейшем.

–  –  –

Чтобы получить дополнительные сведения о настройке политик времени прекращения действия в сети CDN, см. статью «Управление окончанием срока действия содержимого BLOB-объекта».

ГЛАВА 5

–  –  –

Tailspin может использовать кэширование, чтобы избежать необходимости передачи определений опросов между центрами обработки данных (шаг 2). Определение опроса можно из учетной записи хранения в США передать в кэш в Европе.

Это означает, что экземпляр приложения Surveys, размещенный в Европе, должен получить доступ к учетной записи хранения в центре обработки данных в США для загрузки определений опросов в кэш. Георепликация данных из центра обработки данных в США обеспечивает устойчивость на случай крупной катастрофы, которая сделает нормальное функционирование этого центра обработки данных невозможным, однако защита от проблем, связанных с работой каналов связи между Европой и США, в рамках такого подхода не предусмотрена. Для получения дополнительной информации см. статью «Introducing Geo-replication for Windows Azure Storage».

Синхронизация статистики опроса Данные приложения (определения опросов и ответы пользователей) изначально размещаются в центре обработки данных того региона, где подписчик решил провести опрос, затем приложение копирует данные в центр обработки данных, к которому относится учетная запись этого подписчика. На рисунке 10 показаны роли и компоненты хранилища для подписчика, который находится в Европе, но размещает опрос в центре обработки данных в США.

–  –  –

Автоматическое масштабирование приложения Tailspin Surveys Компания Tailspin планирует использовать функциональный блок для автоматического масштабирования, чтобы сделать свое приложение эластичным. Специалисты создадут правила, установив минимальное и максимальное количество экземпляров для каждого типа ролей в приложении Tailspin Surveys. Минимальное значение для каждого типа ролей будет равно пяти, а максимальное специалисты компании будут регулировать по мере увеличения числа подписчиков своего сервиса.

Tailspin также собирается настроить динамическое масштабирование с учетом отслеживаемых ключевых показателей в приложении Surveys. Сначала правила будут основаны на уровне использования ресурсов ЦПУ различными ролями и на длинах очередей Windows Azure, через которые сообщения передаются экземплярам рабочей роли.

Tailspin не планирует использовать правила планирования, которые регулируют количество экземпляров ролей в зависимости от времени и даты. Тем не менее закономерности использования будут отслеживаться, чтобы приложение можно было масштабировать заранее.

Чтобы получить дополнительную информацию об использовании функционального блока для автоматического масштабирования в приложении Windows Azure, а также о настройке правил автоматического масштабирования, см. сатью «Создание эластичных и устойчивых облачных приложений – Руководство разработчика по пакету интеграции Enterprise Library для Windows Azure».

–  –  –

Асинхронное сохранение ответов на опросы Чтобы задача в рабочей роли могла рассчитать сводные статистические показатели, приложение должно сохранить ответы в хранилище BLOB-объектов. В следующем фрагменте кода из класса SurveysController в проекте TailSpin.Web.Survey.Public показано, как приложение сохраняет ответы на опросы.

C# [HttpPost] public ActionResult Display(string tenant, string surveySlug, SurveyAnswer contentModel) { var surveyAnswer = CallGetSurveyAndCreateSurveyAnswer( this.surveyStore, tenant, surveySlug);

...

for (int i = 0;

i surveyAnswer.QuestionAnswers.Count; i++) { surveyAnswer.QuestionAnswers[i].Answer = contentModel.QuestionAnswers[i].Answer;

} if (!this.ModelState.IsValid) { var model = new TenantPageViewDataSurveyAnswer(surveyAnswer);

model.Title = surveyAnswer.Title;

return this.View(model);

} this.surveyAnswerStore.SaveSurveyAnswer(surveyAnswer);

return this.RedirectToAction("ThankYou");

} В переменной surveyAnswerStore содержится ссылка на экземпляр типа SurveyAnswerStore. Приложение использует функциональный блок Unity Application Block для инициализации этого экземпляра с соответствиующими экземплярами lAzureBlob и lAzureQueue.

Unity — это простой расширяемый контейнер для внедрения зависимостей, который поддерживает перехват, внедрение конструктора, внедрение свойств и вызовов метода. Применять контейнер Unity можно различными способами, он помогает изолировать компоненты вашего приложения, чтобы обеспечить их согласованность и упростить разработку, внедрение, тестирование и администрирование этих приложений. Чтобы получить более подробную информацию и загрузить функциональный блок, см. статью «Unity Application Block».

МАКСИМИЗАЦИЯ ДОСТУПНОСТИ, МАСШТАБИРУЕМОСТИ И ЭЛАСТИЧНОСТИ 149

–  –  –

public UpdatingSurveyResultsSummaryCommand( IDictionarystring, TenantSurveyProcessingInfo processingInfoCache, ISurveyAnswerStore surveyAnswerStore, ISurveyAnswersSummaryStore surveyAnswersSummaryStore) { this.tenantSurveyProcessingInfoCache = processingInfoCache;

this.surveyAnswerStore = surveyAnswerStore;

this.surveyAnswersSummaryStore = surveyAnswersSummaryStore;

} public void PreRun() { this.tenantSurveyProcessingInfoCache.Clear();

} public bool Run(SurveyAnswerStoredMessage message) { if (!message.AppendedToAnswers) { this.surveyAnswerStore.AppendSurveyAnswerIdToAnswersList( message.Tenant, message.SurveySlugName, message.SurveyAnswerBlobId);

message.AppendedToAnswers = true;

message.UpdateQueueMessage();

} var surveyAnswer = this.surveyAnswerStore.GetSurveyAnswer( message.Tenant, message.SurveySlugName, message.SurveyAnswerBlobId);

var keyInCache = string.Format( CultureInfo.InvariantCulture, "{0}-{1}", message.Tenant, message.SurveySlugName);

TenantSurveyProcessingInfo surveyInfo;

if (!this.tenantSurveyProcessingInfoCache.ContainsKey(keyInCache)) { surveyInfo = new TenantSurveyProcessingInfo( message.Tenant, message.SurveySlugName);

this.tenantSurveyProcessingInfoCache[keyInCache] = surveyInfo;

} ГЛАВА 5

–  –  –

Приложение Surveys использует функциональный блок Unity для инициализации экземпляра класса UpdatingSurveyResultsSummaryCommand и переменных surveyAnswerStore и surveyAnswersSummaryStore. Переменная surveyAnswerStore — это экземпляр типа SurveyAnswerStore, используемый методом Run для извлечения ответов на опросы из хранилища BLOB-объектов.

Переменная surveyAnswersSummaryStore — это экземпляр типа SurveyAnswers Summary, используемый методом PostRun для записи сводной статистической информации в хранилище BLOB-объектов. В словаре surveyAnswersSummaryCache содержится объект SurveyAnswersSummary для каждого опроса.

Метод PreRun срабатывает до того, как задача получает первое сообщение из очереди, он инициализирует временный кэш для размещения новых ответов на опрос.

Метод Run выполняется один раз для каждого нового ответа на опрос. Используя сообщение из очереди, он находит новый ответ на опрос и добавляет его в объект SurveyAnswersSummary для соответствующего опроса путем вызова метода AddNewAnswer. Метод AddNewAnswer обновляет сводную статистику в экземпляре surveyAnswersSummaryStore. Метод Run также вызывает метод AppendSurvey AnswerldToAnswersList, чтобы обновить список ответов, на основе которого будет организован постраничный просмотр. Метод Run оставляет все сообщения в очереди в том случае, если задача сталкивается с оптимистичным параллелизмом, когда пытается сохранить результаты в методе PostRun.

Метод PostRun выполняется после того, как задача вызвала метод Run для каждого необработанного сообщения с новым ответом на опрос из текущей партии. При этом для каждого опроса сводная статистика вычисляется заново методом слияния старой статистики и новых результатов опроса и затем помещается опять в хранилище BLOB-объектов. EntitiesBlobContainer следит за соблюдением правил Чтобы не истекло время оптимистичного параллелизма при сохранении новой сводной статистики, ожидания, метод Run вызывает метод UpdateQueueMessage и вызывает исключение в случае обнаружения нарушений. Метод PostRun передля сообщения после того, как хватывает эти исключения и оставляет в очереди сообщения, связанные со статибыл обновлен список хранястикой текущего опроса, и эти сообщения будут обработаны позже, в другой партии.

щихся ответов на опрос, это Рабочая роль использует соединительный код, разработанный специалистами позволяет предотвратить Tailspin, для вызова по расписанию методов PreRun, Run и PostRun в классе повторную обработку сообUpdatingSurveyResultsSummaryCommand. Подробнее соединительный код рассмат- щения. Для получения дополнительной информации см.

ривается в главе 4 «Секционирование мультитенантных приложений», в которой статью «CloudQueue.

описан подход, реализованный Tailspin для секционирования рабочей роли UpdateMessage Method».

с помощью различных задач. Следующий пример кода показывает, как приложение Surveys использует соединительный код в методе Run рабочей роли для выполнения трех методов, из которых состоит задание.

ГЛАВА 5 C# var standardQueue = this.container.Resolve IAzureQueueSurveyAnswerStoredMessage (SubscriptionKind.Standard.ToString());

var premiumQueue = this.container.Resolve IAzureQueueSurveyAnswerStoredMessage (SubscriptionKind.Premium.ToString());

BatchMultipleQueueHandler.For(premiumQueue, GetPremiumQueueBatchSize()).AndFor(standardQueue, GetStandardQueueBatchSize()).Every(TimeSpan.FromSeconds( GetSummaryUpdatePollingInterval())).WithLessThanTheseBatchIterationsPerCycle( GetMaxBatchIterationsPerCycle()).Do(this.container.ResolveUpdatingSurveyResultsSummaryCommand());

Метод сначала использует функциональный блок Unity для создания объекта UpdatingSurveyResultsSummaryCommand, который определяет задание, и объекта AzureQueue, который хранит уведомления о новых ответах на опросы.

Этот метод затем передает эти объекты в качестве параметров соединительным методам For, AndFor и Do платформы рабочей роли. Метод Every определяет периодичность запуска задания. Эти методы заставляют соединительный код вызвать методы PreRun, Run и PostRun класса UpdatingSurveyResultsSummaryCommand путем передачи сообщения из очереди в метод Run.

Вы должны настроить периодичность запуска этих задач с учетом ожидаемых нагрузок, для этого нужно изменить значения, которые передаются в метод Every.

Пессимистичный и оптимистичный параллелизм Специалисты компании Tailspin используют оптимистичный параллелизм при сохранении сводной статистики и списков ответов в хранилище BLOB-объектов. Приложение Surveys предоставляет разработчикам возможность выбора между оптимистичным и пессимистичным параллелизмом при сохранении BLOB-объектов. В следующем примере кода из класса SurveyAnswersSummaryStore показано, что приложение Surveys использует оптимистичный параллелизм при сохранении сводной статистики опроса в хранилище BLOB-объектов.

C# OptimisticConcurrencyContext context;

var id = string.Format(CultureInfo.InvariantCulture, "{0}-{1}", partialSurveyAnswersSummary.Tenant, partialSurveyAnswersSummary.SlugName);

var surveyAnswersSummaryInStore = this.surveyAnswersSummaryBlobContainer.Get(id, out context);

partialSurveyAnswersSummary.MergeWith(surveyAnswersSummaryInStore);

this.surveyAnswersSummaryBlobContainer.Save(context, partialSurveyAnswersSummary);

МАКСИМИЗАЦИЯ ДОСТУПНОСТИ, МАСШТАБИРУЕМОСТИ И ЭЛАСТИЧНОСТИ 155

В этом примере приложение использует метод Get, чтобы извлечь подлежащий обновлению контент из BLOB-объекта.

Приложение изменяет контент и вызывает метод Save для его сохранения. Оно передает объект OptimisticConcurrency Context, полученный от метода Get. Если метод Save обнаружит нарушение правил параллелизма, он вызывает исключение и отменяет сохранение обновленного содержимого в BLOB-объект.

Следующие примеры кода из класса EntitiesBlobContainer показывают, как создается новый объект OptimisticConcurrency Context в методе DoGet с использованием объекта ETag, затем объект OptimisticConcurrencyContext используется в методе DoSave для создания объекта BlobRequestOptions, который содержит ETag и условия доступа. Содержимое объекта BlobRequestOptions позволяет методу UploadText контролировать соблюдение правил параллелизма, в случае обнаружения нарушений, метод может сгенерировать исключение и уведомить вызвавший его процесс.

C# protected override T DoGet(string objId, out OptimisticConcurrencyContext context) { CloudBlob blob = this.Container.GetBlobReference(objId);

blob.FetchAttributes();

context = new OptimisticConcurrencyContext (blob.Properties.ETag) { ObjectId = objId };

return new JavaScriptSerializer().DeserializeT(blob.DownloadText());

} protected override void DoSave( IConcurrencyControlContext context, T obj) {...

if (context is OptimisticConcurrencyContext) { CloudBlob blob = this.Container.GetBlobReference(context.ObjectId);

blob.Properties.ContentType = "application/json";

var blobRequestOptions = new BlobRequestOptions() { AccessCondition = (context as OptimisticConcurrencyContext).AccessCondition };

blob.UploadText( new JavaScriptSerializer().Serialize(obj), Encoding.Default, blobRequestOptions);

} else if (context is PessimisticConcurrencyContext) {...

} } ГЛАВА 5

ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ

Все представленные в данном руководстве ссылки присутствуют в библиографическом списке на странице http://msdn.microsoft.com/library/jj871057.aspx.

Дополнительные сведения о масштабируемости и ограничениях регулирования представлены в статьях:

• Windows Azure Storage Abstractions and their Scalability Targets

• Windows Azure SQL Database Performance and Elasticity Guide

• Рекомендацию по повышению производительности с помощью обмена сообщений через посредника в Service Bus Дополнительная информация о разработке крупномасштабных приложений для Windows Azure приведена в статье «Рекомендации по проектированию крупномасштабных служб в облачных службах Windows Azure» на сайте MSDN.

Дополнительная информация о CDN приведена на странице «Предоставление содержимого, передаваемого по каналам с высокой пропускной способностью, с помощью сети CDN в Windows Azure» на сайте MSDN.

Дополнительная информация о приложении, которое использует CDN представлена в сообщении «EmailTheInternet.com:

Sending and Receiving Email in Windows Azure» в блоге Стива Маркса.

Эпизод, посвященный CDN, из серии Cloud Cover: «Cloud Cover Episode 4 — CDN» на канале Channel 9.

Обсуждение того, как сделать приложение Windows Azure масштабируемым приведено в статье: «Real World: Designing a Scalable Partitioning Strategy for Windows Azure Table Storage».

Дополнительная информация об автоматическом масштабировании в Windows Azure: «Создание эластичных и устойчивых облачных приложений – Руководство разработчика по пакету интеграции Enterprise Library для Windows Azure».

Обсуждение подходов к реализации автоматического масштабирования в Windows Azure: «Real World: Dynamically Scaling a Windows Azure Application».

Обсуждение подходов к нагрузочному тестированию приложения Windows Azure: «Real World: Simulating Load on a Windows Azure Application».

Для получения дополнительной информации об алгоритме MapReduce см. статью «MapReduce» на сайте Wikipedia.

6 Обеспечение безопасности мультитенантных приложений В этой главе описаны подходы к обеспечению безопасности мультитенантных приложений. Здесь освещаются вопросы, которые характерны для приложений этого типа, например проверка подлинности и авторизация различных групп пользователей с использованием различных учетных данных, а также доверительных отношений. Вы также узнаете, как защитить данные отдельных пользователей и маркеры сеансов, которые они используют для доступа к приложениям.

ЗАЩИТА ДАННЫХ ПОЛЬЗОВАТЕЛЕЙ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ

Мультитенантное приложение должно гарантировать изоляцию данных разных владельцев. Приложение должно работать так, как будто у него только один владелец, конфиденциальную информацию каждого владельца нужно надежно защитить от несанкционированного доступа. Арендаторам необходим полный контроль над собственными данными и доступом к ним.

Проверка подлинности Ваше приложение должно идентифицировать пользователя и проверить, является ли он владельцем, прежде чем предоставлять доступ к каким-либо личным данным. Вы сами должны реализовать надежный механизм проверки подлинности для своего мультитенантного приложения в Windows Azure, кроме того, можно предложить владельцам использовать для этого собственные системы.

Помимо этого, мультитенантному приложению, возможно, придется предоставить владельцам возможность управления своими собственными пользователями. Например, компания Adatum может предоставить четырем своим сотрудникам возможность создавать опросы, используя подписку на приложение Tailspin Surveys.

Кроме предоставления доступа к приложению для конкретных сотрудников, крупные владельцы, возможно, также захотят использовать свой собственный механизм проверки подлинности. У сотрудников компании уже есть корпоративная учетная запись, и они не хотят запоминать другое имя пользователя и пароль для доступа к новой службе, размещенной в Интернете. Такой сценарий обычно реализуется в рамках подхода, основанного на утверждениях, для этого вы должны установить доверительные отношения между задействованными в этом процессе сторонами. Дополнительные сведения представлены в статье «A Guide to Claims-Based Identity and Access Control».

ГЛАВА 6 Авторизация После проверки подлинности запроса приложение должно предоставить доступ к любым затребованным ресурсам.

Некоторые компоненты Windows Azure в вашем приложении позволяют использовать базовые службы авторизации, но в большинстве случаев в мультитенантном приложении вам придется реализовать все необходимые процессы самостоятельно.

Например, в веб-ролях и рабочих ролях Windows Azure нет встроенных служб авторизации. Если часть функций веб-ролей и рабочих ролей должны быть доступны только конкретным владельцам, то ваше приложение должно выполнять авторизацию на основе проверки подлинности запроса.

Чтобы получить доступ к службам хранения Windows Azure (таблицам, BLOB-объектам и очередям), вызывающий код должен знать ключ для конкретной учетной записи хранения. Маловероятно, что у каждого владельца будет своя учетная запись хранения в приложении Windows Azure, но, возможно, определенные учетные записи хранения должны быть доступны только для конкретных владельцев. В коде вашего приложения должны использоваться правильные ключи учетных записей хранения, эта задача, как и задача обеспечения конфиденциальности ключей, лежит в зоне вашей ответственности. Владелец мультитенантного приложения не должен знать ключи учетной записи хранения, если только это не его собственная учетная запись.

Если владелец предпочитает использовать учетную запись хранения в своей подписке, он должен предоставить вам ключи, чтобы приложение могло подключаться к хранилищу. В таком случае вам придется обеспечивать конфиденциальность ключей владельца.

Если кто-то получит несанкционированный доступ к вашей учетной записи Windows Azure, он сможет найти все ключи учетных записей хранения и также получит доступ ко всем данным в хранилище Windows Azure. Доступ к вашей подписке Windows Azure позволяет получить любые связанные с ней данные.

В шине интеграции Windows Azure реализован другой подход, который предоставляет возможность использовать службу авторизации для управления различными операциями, например отправкой сообщений. Служба Windows Azure Access Control (ACS) выполняет проверку подлинности напрямую (проверяет имя пользователя и пароль) или делегирует эту задачу внешнему поставщику проверки подлинности, например службам федерации Active Directory Federation Services (ADFS) владельца. Более подробная информация представлена в статье «Проверка подлинности и авторизация в Service Bus с помощью Access Control Service».

Защита важной информации В качестве дополнительного инструмента зашиты данных мультитенантного приложения можно использовать уникальный ключ шифрования для каждого владельца. Это помогает обеспечить высокий уровень изоляции, главное, чтобы ключи владельцев не попали к третьим лицам.

ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 159

–  –  –

• Если кто-то несанкционированно получает доступ к подписке Windows Azure, в которой размещено производственное приложение, он не сможет также получить доступ к закрытому ключу. Вы не можете экспортировать сертификат из облачной службы Windows Azure. Когда Windows Azure добавляет сертификат в хранилище сертификатов в экземпляре роли, закрытый ключ получает специальную метку, и будет недоступен для экспорта.

Рассматриваемый подход помогает защитить ваш закрытый ключ, но, в любом случае, вам придется учитывать некоторые потенциальные уязвимости:

• В рамках этого подхода вам придется придерживаться процедур, направленных на обеспечение конфиденциальности сертификата, пока он хранится в локальной системе.

• Если кто-то несанкционированно получает доступ к вашей подписке Windows Azure, он не сможет также получить доступ к закрытому ключу, но сможет выполнить код, который использует закрытый ключ для расшифровки любых зашифрованных данных. Злоумышленник может внедрить код для чтения или изменения зашифрованных данных, кроме того, из-за ошибок в собственном коде, разработчик может случайно открыть доступ к данным или внести в них изменения, которые не соответствует нормальному поведению приложения.

В общем случае, чтобы свести к минимуму эти риски, достаточно развернуть четкие контролируемые процедуры для управления и мониторинга вашей подписки Windows Azure, а также протестировать код, чтобы убедиться в том, что все работает правильно.

В других случаях вам, возможно, придется выполнять шифрование и дешифровку данных в локальных приложениях, но сохранять данные или организовывать их совместное использование надежнее в Windows Azure. Например, компания может сохранить и опубликовать зашифрованные данные в Windows Azure, а затем предоставить другой компании возможности для загрузки и расшифровки этих данных. Здесь возникает другая проблема, связанная с управлением сценариями, которую можно решить с помощью служб доверия Windows Azure. Дополнительные сведения представлены в статье «Learn More about Microsoft Codename Trust Services».

Разделение конфиденциальных данных между несколькими подписками Еще один метод минимизации риска несанкционированного доступа к конфиденциальным данным в случае, если ключи вашей учетной записи хранения были скомпрометированы, заключается в разделении этих данных между двумя или более учетными записями хранения. Поэтому конфиденциальные данные будут недоступны для злоумышленника, если только он не получит доступ к двум учетным записям хранения Windows Azure с помощью двух ключей.

Например, данные кредитной карты пользователя содержат несколько записей: имя держателя карты, номер карты, три или четыре цифры кода безопасности, а также срок действия. Обычно, чтобы совершить платеж кредитной картой, вам понадобятся все четыре записи. Если вы сопоставите номера кредитных карт с одной учетной записью хранения, а остальные данные — с другой, то злоумышленник, который взломал одну учетную запись, не сможет получить все необходимые сведения, чтобы воспользоваться чужими кредитными картами.

ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 161

Однако этот подход лишь снижает риск несанкционированного доступа к ключам вашей учетной записи хранения Windows Azure. Если кто-то несанкционированно получает доступ к вашей подписке Windows Azure, ему будут известны все ключи учетных записей хранения в этой подписке. Кроме того, если взломанная подписка Windows Azure использует данные из учетной записи хранения в другой подписке Windows Azure, то злоумышленник может также получить ключ для этой учетной записи.

–  –  –

РИСУНОК 1.

Доступ к данным в хранилище Windows Azure с использованием SAS В списке далее перечислены шаги, показанные на рисунке 1. Веб-роль с помощью SAS URL получает доступ к контенту

BLOB-объекта, в котором содержатся данные компании Adatum:

1. Браузер клиента посылает запрос на просмотр данных компании Adatum.

2. Веб-роль отправляет рабочей роли привратнику запрос, чтобы получить SAS URL для доступа к данным компании Adatum в режиме «только для чтения». Это могут быть данные из таблиц, BLOB-объектов или очередей.

3. Рабочая роль привратник использует ключ учетной записи хранения для генерации SAS URL и возвращает этот адрес рабочей роли.

4. Веб-роль использует адрес SAS URL для того, чтобы получить данные компании Adatum, которые необходимы для отображения веб-страницы.

5. Веб-роль возвращает страницу в браузер.

Есть ряд моментов, на которые нужно обратить внимание, изучая этот механизм организации доступа к данным в хранилище Windows Azure:

• Если веб-роль и рабочая роль относятся к одной облачной службе, они будут использовать один и тот же файл конфигурации службы, это означает, что веб-роль могла бы обойти привратника и получить доступ к учетной записи хранения напрямую. В рамках данного сценария вы полагаетесь на код в веб-роли, которая обеспечивает постоянный доступ к хранилищу, запрашивая адреса SAS URL.

ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 163

• Этот подход гарантирует более эффективную изоляцию, если веб-роль и рабочая роль принадлежат к разным облачным службам или разным подпискам Windows Azure. Таким образом, веб-роль не сможет получить доступ к ключу учетной записи хранения. Чтобы прочитать необходимые данные, веб-роли придется использовать SAS.

• Без дополнительного уровня проверки подлинности и авторизации, веб-роль может запросить адрес SAS URL и получить любые данные.

• SAS можно создать для отдельного BLOB-объекта или хранилища BLOB-объектов.

Если это табличное хранилище, то вы можете создать SAS для таблицы или набора сущностей, хранящихся в таблице, которые идентифицируются с помощью набора ключей секций и ключей строк.

• При создании SAS вы можете указать срок действия и разрешенные типы доступа (чтение, добавление, обновление и удаление).

Более подробные сведения содержатся в статье «Creating a Shared Access Signature»

на сайте MSDN, а также в главе 5 «Выполнение фоновых задач» руководства «Перенос приложений в облако, издание 3-е».

ЦЕЛИ И ТРЕБОВАНИЯ

В данном разделе описаны цели и требования, которые компания Tailspin предъявляет к безопасности приложения Surveys.

–  –  –

В рамках сценария, показанного на рисунке 2, пользователи крупного подписчика Adatum проходят проверку подлинности с использованием собственного поставщика удостоверений компании Adatum (шаг 1), в данном случае это службы федерации Active Directory (Active Directory Federation Services, ADFS). Если пользователь Adatum успешно прошел проверку подлинности, то ADFS предоставляют маркер. Браузер клиента передает маркер поставщику федеративных удостоверений Tailspin, который доверяет маркерам, предоставленным службами ADFS компании Adatum (шаг 2), и, в случае необходимости, преобразовывает утверждения Adatum в маркере таким образом, чтобы приложение Tailspin Surveys могло их распознать (шаг 3) прежде, чем вернуть новый маркер браузеру клиента. Приложение Tailspin Surveys доверяет маркерам, выданным поставщиком федеративных удостоверений Tailspin, и использует утверждения в маркере Выдача и пересылка маркеров для того, чтобы применить правила авторизации (шаг 4). выполняются автоматически как поток переадресации Пользователям в компании Adatum не придется запоминать дополнительные учетные в браузере. С точки зрения данные для доступа к приложению Surveys, а администратор Adatum сможет настроить пользователя, это просто перев собственных службах ADFS компании список пользователей, которым предоставляется ход на веб-сайт Tailspin Surveys.

доступ.

Небольшим организациям предоставляется готовый к использованию механизм идентификации

–  –  –

РИСУНОК 3.

Предоставление пользователям небольшого предприятия-подписчика доступа к приложению Surveys В рамках сценария, показанного на рисунке 3, пользователи небольшого подписчика Fabrikam проходят проверку подлинности с использованием поставщика федеративных удостоверений Tailspin (шаг 1), потому что собственный каталог Active Directory компании Fabrikam не может выдавать маркеры, распознаваемые поставщиком федераций Tailspin.

Если поставщик удостоверений Tailspin может проверить учетные данные, он возвращает браузеру клиента маркер, содержащий утверждения, например учетные данные пользователя и владельца. Браузер клиента передает маркер поставщику федеративных удостоверений Tailspin, который доверяет маркерам, предоставленным поставщиком удостоверений Tailspin (шаг 2), и, в случае необходимости, преобразовывает утверждения поставщика удостоверений Tailspin в маркере таким образом, чтобы приложение Tailspin Surveys могло их распознать (шаг 3) прежде, чем вернуть новый маркер браузеру клиента. Приложение Tailspin Surveys доверяет маркерам, выданным поставщиком федеративных удостоверений Tailspin, и использует утверждения в маркере для того, чтобы применить правила авторизации (шаг 4).

ГЛАВА 6 Этот подход практически аналогичен сценарию, реализованному в компании Adatum, за исключением выбранного поставщика удостоверений. Пользователям Fabrikam при таком подходе придется запоминать отдельные учетные данные для доступа к приложению Surveys. Сотрудники компании Fabrikam должны будут ввести имя пользователя и пароль, чтобы начать работу с приложением Tailspin Surveys. Компания Tailspin также должна организовать управление учетными записями пользователей, которые использует поставщик удостоверений Tailspin.

Tailspin планирует реализовать этот сценарий на основе поставщика членства ASP.NET, который поможет организовать управление учетными записями пользователей, кроме того, компания будет использовать службу маркеров безопасности (Security Token Service, STS), которая интегрируется с поставщиком членства.

Рекомендации по поводу реализации данного сценария см. в проекте thinktecture IdentityServer на веб-сайте CodePlex.

Интеграция с поставщиками удостоверений социальных сетей

–  –  –

Механизм доступа отдельных пользователей мало чем отличается от представленных выше подходов. В рамках сценария, показанного на рисунке 4, поставщик федеративных удостоверений Tailspin настроен для поддержки маркеров, предоставленных сторонними поставщиками удостоверений, которые работают, например, с учетными записями Microsoft или OpenID. Tailspin планирует реализовать этот сценарий на базе службы Windows Azure Access Control.

Когда индивидуальный пользователь проходит проверку подлинности с использованием выбранного поставщика удостоверений (шаг 1), этот поставщик возвращает браузеру клиента маркер, содержащий утверждения, в том числе учетные данные пользователя. Браузер клиента передает маркер поставщику федеративных удостоверений Tailspin, который доверяет маркерам, предоставленным сторонним поставщиком (шаг 2), и, в случае необходимости, преобразовывает утверждения в маркере таким образом, чтобы приложение Tailspin Surveys могло их распознать (шаг 3) прежде, чем вернуть новый маркер браузеру клиента. Приложение Tailspin Surveys доверяет маркерам, выданным поставщиком федеративных удостоверений Tailspin, и использует утверждения в маркере для того, чтобы применить правила авторизации (шаг 4). Когда пользователь пытается получить доступ к опросам, приложение перенаправляет его к внешнему поставщику удостоверений с целью проверки подлинности.

Дополнительные сведения по поводу реализации этого сценария содержатся в главе «Federated Identity with Multiple Partners and Windows Azure Access Control Service» в руководстве «A Guide to Claims-Based Identity and Access Control».

Служба Windows Azure Access Control и каталог Windows Azure Active Directory В примере решения Tailspin Surveys для создания поставщика федеративных удостоверений, совместимого с WS-Federation, используется механизм проверки подлинности Windows Identity Foundation (WIF) (см. проект TailSpin.SimulatedIssuer, включенный в решение). Однако в производственной среде может применяться реальный поставщик федеративных удостоверений, например службы Active Directory Federation Services (ADFS), служба Windows Azure Access Control или каталог Windows Azure Active Directory.

Windows Azure Access Control — это один из элементов каталога Windows Azure Active Directory. Он позволяет переносить логику проверки подлинности и авторизации из вашего кода в отдельную облачную службу. Служба Access Control может интегрироваться с другими поставщиками удостоверений на основе стандартов, а также с помощью декларативных правил преобразовывать утверждения, выданные поставщиком владельца, сторонним поставщиком или собственным поставщиком Tailspin, в утверждения, понятные для приложения Tailspin Surveys. Служба Access Control также выполняет преобразование протоколов, если это необходимо для организации взаимодействия со сторонними поставщиками.

Каталог Windows Azure Active Directory включает библиотеку Windows Azure Authentication Library, которая помогает разработчикам сосредоточиться на бизнес-логике своих приложений, не изучая особенности протокола, а также защитить ресурсы, не будучи экспертами по вопросам безопасности. Windows Azure Active Directory также предоставляет интерфейс REST API для программного доступа к службе Access Control и библиотеке Authentication Library.

Для получения дополнительной информации см. статью «Windows Azure Active Directory». Дополнительные сведения представлены в статье «A Guide to Claims-Based Identity and Access Control».

ГЛАВА 6

–  –  –

В реальном приложении этот экран позволит владельцу выбрать один из трех сценариев идентификации, поддерживаемых приложением Tailspin Surveys. Для владельцев, которые решили использовать возможности поставщика удостоверений Tailspin, вы будете вести базу данных зарегистрированных членов, и каждый владелец сможет добавлять и удалять членов, которым разрешено использование подписки.

Тем не менее пример приложения позволяет администратору компании Tailspin добавить нового федеративного поставщика удостоверений от имени владельца на экране Manage (Управление). Приложение Tailspin Surveys затем сохраняет данные конфигурации в хранилище BLOB-объектов Windows Azure вместе с остальными сведениями о конфигурации владельца. В следующей таблице содержится информация, используемая для настройки федеративных удостоверений для владельца.

–  –  –

Шифрование маркеров сеансов в приложении Windows Azure Веб-сайт владельца Tailspin Surveys использует сеансы для управления списком вопросов, когда владелец работает над новым опросом. С помощью файла cookie веб-сайт отслеживает запросы, относящиеся к текущему сеансу пользователя.

По замыслу специалистов Tailspin, приложение должно шифровать файлы cookie, чтобы не оставлять пригодной к использованию информацию на клиентском компьютере. Это помогает обеспечивать безопасность.

Tailspin планирует использовать как минимум два экземпляра веб-роли для сайта владельца, чтобы повысить его доступность. Поэтому механизм шифрования файлов cookie, реализованный в приложении, должен поддерживать веб-фермы.

Файлы cookie, созданные и зашифрованные одним экземпляром роли, должны быть читаемы другими экземплярами.

По умолчанию, когда вы используете механизм Windows Identity Foundation (WIF) для управления своей инфраструктурой идентификации, содержимое отправляемых клиенту файлов cookie зашифровывается с помощью интерфейса Windows Data Protection API (DPAPI). Но DPAPI не подходит для шифрования файлов cookie в приложении с несколькими экземплярами роли, поскольку каждый экземпляр будет использовать собственный ключ шифрования, а балансировщик нагрузки Windows Azure может перенаправлять запросы любому экземпляру. Вы должны развернуть механизм шифрования с ключом, который могут совместно использовать два и более экземпляра (например, механизм RSA).

РЕАЛИЗАЦИЯ Теперь настало время более подробно рассмотреть некоторые фрагменты кода в приложении Surveys от Tailspin. По мере изучения этого раздела может потребоваться загрузка решения Visual Studio для приложения Tailspin Surveys с сайта http://wag.codeplex.com/.

ГЛАВА 6 Работа со службой Windows Azure Caching На рисунке 5 показан процесс проверки подлинности с использованием WIF, детальное описание которого с примерами кода присутствует далее в этой главе.

–  –  –

Последовательность на рисунке 5 актуальна для всех трех сценариев проверки подлинности, описанных ранее в этой главе. В процессе, показанном на рисунке 5, участвует поставщик федеративных удостоверений Tailspin, поэтому на шаге 3 выполняется перенаправление к другому поставщику, который отвечает за проверку подлинности.

ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 171

2. Атрибут AuthenticateAndAuthorizeTenant, который расширяет атрибут AuthenticateAndAuthorizeRole и отвечает за реализацию интерфейса MVC lAuthorizationFilter, применяется к этому классу контроллера. Пользователь еще не прошел проверку подлинности, поэтому его запрос перенаправляется к поставщику федеративных удостоверений Tailspin:

https://localhost/TailSpin.SimulatedIssuer. В сроке запроса указываются следующие параметры:

wa. Wsignin1.0 wtrealm. https://tailspin.com wctx. https://127.0.0.1:444/survey/adatum whr. http://adatum/trust wreply. https://127.o.o.1:444/federationresult В следующем примере кода показан метод BuildSignlnMessage класса AuthenticateAndAuthorizeTenantAttribute, который формирует строку запроса.

C# protected override WSFederationMessage BuildSignInMessage(AuthorizationContext context, Uri replyUrl) { var model = (context.Controller as TenantController).Tenant;

var surveyAnswer = CallGetSurveyAndCreateSurveyAnswer(.WSFederationAuthenticationModule;

var blobRequestOptions = new BlobRequestOptions() (new Uri(fam.Issuer), fam.Realm) { Context = AuthenticateAndAuthorizeRoleAttribute.GetReturnUrl(context.RequestContext, RequestAppendAttribute.RawUrl, null).ToString(), HomeRealm = SubscriptionKind.Premium tenant.SubscriptionKind) ? ? tenant.IssuerIdentifier ?? (SubscriptionKind.Premium.Equals( + (context.Controller as TenantController).Tenant.Name : (SubscriptionKind.Premium.Equals( + (context.Controller as TenantController).Tenant.Name, (SubscriptionKind.Standard.ToString());

};

return signIn;

} ГЛАВА 6

3. Поставщик, который в данном случае эмулируется в среде Tailspin, выполняет проверку подлинности пользователя и генерирует маркер с затребованными утверждениями. Поставщик федеративных удостоверений Tailspin в сценарии Tailspin использует значение параметра whr, чтобы делегировать задачу проверки подлинности другому поставщику (в рассматриваемом примере это поставщик компании Adatum). В случае необходимости, поставщик федеративных удостоверений Tailspin преобразовывает утверждения, полученные от поставщика, таким образом, чтобы приложение Tailspin Surveys могло их распознать. Следующий код из класса FederationSecurityTokenService показывает, как Tailspin эмулирует процесс преобразования утверждений Group (Группа) в маркере, полученном от поставщика компании Adatum.

C# protected override IClaimsIdentity GetOutputClaimsIdentity(IClaimsPrincipal principal, RequestSecurityToken request, Scope scope) {...

var input = principal.Identity as ClaimsIdentity;

var tenant = this.tenantStore (input.Claims.First().Issuer);

...

var blobRequestOptions = new BlobRequestOptions() CopyClaims(input, new[] { WSIdentityConstants.ClaimTypes.Name }, output);

TransformClaims(input, tenant.ClaimType, tenant.ClaimValue, ClaimTypes.Role, Tailspin.Roles.SurveyAdministrator, output);

CloudStorageAccount.Parse( new TenantPageViewDataSurveyAnswer(surveyAnswer);

tenant.SubscriptionKind) return output;

} В этом примере показано, как утверждение, которое владелец использует для предоставления доступа к подписке, сопоставляется с утверждением Role в системе Tailspin со значением SurveyAdministrator.

4. Поставщик федеративных удостоверений Tailspin затем отправляет маркер и значение параметра wctx (https://127.o.o.1:444/survey/adatum) по адресу, указанному в параметре wreply (https://127.o.o.1:444/federationresult).

Это адрес другого контроллера MVC, для которого параметр AuthenticateAndAuthorizeTenantAttribute не задан.

В следующем примере кода показан метод FederationResult в контроллере ClaimsAuthenticationController.

ОБЕСПЕЧЕНИЕ БЕЗОПАСНОСТИ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 173

C# [RequireHttps]

public class UpdatingSurveyResultsSummaryCommand :

: Controller { [ValidateInput(false)] [HttpPost] public void PreRun() { var surveyAnswer = CallGetSurveyAndCreateSurveyAnswer(.WSFederationAuthenticationModule;

if (fam.CanReadSignInResponse( System.Web.HttpContext.Current.Request, true)) { string returnUrl = GetReturnUrlFromCtx();

return this.RedirectToAction("ThankYou");

} return this.RedirectToAction("ThankYou");

"Index", "OnBoarding");

}

5. Модуль проверки подлинности WS Federation Authentication Module проверяет маркер, вызывая метод CanReadSignlnResponse.

6. Контроллер ClaimsAuthenticationController извлекает значение исходного параметра wctx и инициирует перенаправление на этот адрес.

7. Пользователь прошел проверку подлинности — его запрос был обработан фильтром AuthenticateAndAuthorizeTenant Attribute и может получить доступ к странице adatum/surveys. Следующий пример кода из класса AuthenticateAnd AuthorizeRoleAttribute показывает, как фильтр проверяет, прошел ли пользователь проверку подлинности.

C# public void PreRun() AuthorizationContext filterContext) {...

if (!filterContext.HttpContext.User.Identity.IsAuthenticated) { AuthenticateUser(filterContext);

} else { this.AuthorizeUser(filterContext);

}...

} ГЛАВА 6

–  –  –

Следующий код из файла Global.asax в проекте Tailspin.Web показывает, как приложение загружает сертификат, который будет использовать для шифрования и дешифровки файлов cookie для сеансов, из хранилища сертификатов в облачной службе.

Для идентификации сертификата приложение использует отпечаток из элемента serviceCertificate в файле Web.config.

C# private void OnServiceConfigurationCreated(object sender, ServiceConfigurationCreatedEventArgs e) { var model = new ListCookieTransform( new BlobContainerPermissions();

{ new BlobContainerPermissions();

new BlobContainerPermissions();

e.ServiceConfiguration.ServiceCertificate), new BlobContainerPermissions();

e.ServiceConfiguration.ServiceCertificate) });

var blobRequestOptions = new BlobRequestOptions() sessionTransforms.AsReadOnly());

e.ServiceConfiguration.SecurityTokenHandlers.AddOrReplace(sessionHandler);

} Метод Application_Start в файле Global.asax.cs привязывает этот обработчик событий к модулю FederatedAuthentication.

Дополнительная информация о DPAPI приведена на странице Windows Data Protection на сайте MSDN.

–  –  –

В этой главе обсуждаются две темы, важные для компаний, приступающих к созданию и развертыванию мультитенантных приложений. Первая тема касается управления жизненным циклом приложений (Application Lifecycle Management, ALM) и охватывает такие вопросы, как тестирование, развертывание, управление и мониторинг. Вторая тема касается в основном независимых поставщиков программного обеспечения (Independent Software Vendors, ISV), которые создают мультитенантные приложения. Мы будем обсуждать вопросы, связанные с регистрацией новых подписчиков, пользовательскими настройками и выставлением счетов за использование приложения владельцам и клиентам.

–  –  –

Наконец, администраторы и операторы должны получить средства для мониторинга приложения, чтобы обеспечить его надлежащее функционирование, соблюдение условий соглашения об уровне обслуживания и выполнение бизнес-требований.

Администраторы мультитенантных приложений также захотят получить возможность контролировать эксплуатационные расходы и текущие затраты для каждого отдельного владельца. Если в приложении предусмотрены различные уровни обслуживания или функциональных возможностей для владельцев разных типов, задача мониторинга значительно усложняется. Например, если на некоторые экземпляры резко увеличивается нагрузка, то в целях соблюдения соглашения об уровне обслуживания придется развернуть дополнительные экземпляры. Подобные задачи обычно требуют определенной автоматизации, чтобы на основе результатов мониторинга принимались адекватные меры в области администрирования. Процедуры управления и мониторинга мультитенантных Обзор решения приложений и данных, которые они используют, должны В этом разделе описываются возможные подходы к тестированию, развертыванию, учитывать требования отдельных управлению и мониторингу приложения Surveys, которые рассматривали специа- владельцев в области безопаслисты компании Tailspin, а также принятые ими решения. ности, кроме того, необходимо обеспечить соблюдение соглашения об уровне обслуживания.

Стратегии в области тестирования Одно из преимуществ мультитенантного приложения, по сравнению с развертываниями нескольких приложений, связано с наличием единой базы кода. Каждый владелец работает с одним и тем же базовым кодом, поэтому тестировать придется только одно приложение и только один набор компонентов.

Тем не менее, поскольку большинство мультитенантных приложений поддерживает пользовательские настройки посредством конфигурирования, необходимо протестировать все настраиваемые параметры. В модульные и функциональные тесты, а также приемочные испытания, следует включать циклы, в которых применяются все возможные комбинации настраиваемых параметров, это помогает убедиться в том, что все работает надлежащим образом, без ошибок и конфликтов.

Если владельцы могут загружать свои собственные компоненты или ресурсы (например, таблицы стилей и сценарии), то в плане тестирования необходимо предусмотреть их по максимуму. Протестировать каждый компонент или ресурс невозможно, тем не менее, проводимые испытания должны гарантировать, что эти компоненты или ресурсы не смогут оказать негативное влияние на выполнение базового кода приложения или предоставить несанкционированный доступ к важным данным или функциональным возможностям.

В процессе тестирования функций, которые позволяют пользователям загружать код, скрипты или таблицы стилей необходимо учесть попытку злоумышленника загрузить специальный код и получить несанкционированный доступ к данным.

Приложение должно уметь предотвращать выполнение такого кода. Конечно, предугадать все возможные варианты развития событий невозможно, но такой подход поможет определить участки, где необходимо принять дополнительные меры обеспечения безопасности.

ГЛАВА 7

–  –  –

Разработчики Tailspin решили создать оболочку для компонентов хранилища Windows Azure, чтобы упростить их замену на фиктивные объекты на время проведения модульных тестов. Для создания экземпляров этих объектов применяется функциональный блок Unity. Код модульного теста должен создать подходящий экземпляр фиктивного компонента хранилища, который будет использоваться на протяжении всего теста, а затем удалить его. Любые интеграционные тесты могут продолжать использовать исходные компоненты доступа к данным в процессе тестирования функциональных возможностей приложения.

Unity — это простой расширяемый контейнер для внедрения зависимостей, который поддерживает перехват, внедрение конструктора, внедрение свойств и вызовов метода. Применять контейнер Unity можно различными способами, он помогает изолировать компоненты вашего приложения, чтобы обеспечить их согласованность и упростить разработку, реализацию, тестирование и администрирование этих приложений. Узнать больше и загрузить функциональный блок Unity можно здесь: «Unity Container».

Tailspin также планирует предусмотреть возможность независимого тестирования фоновых задач, которые реализованы как рабочие роли Windows Azure. Разработчики Tailspin создали стандартный каркас для рабочих ролей, который обеспечивает беспрепятственное добавление и обновление фоновых задач, а также поддерживает модульное тестирование.

Этот каркас для рабочих ролей, разработанный специалистами Tailspin, позволяет отдельным задачам переопределять методы PreRun, Run и PostRun для настройки, выполнения и удаления каждой задачи. Этот каркас поддерживает операторы For, Do и Every, которые используются для запуска задач в рабочей роли, что упрощает разработку модульных тестов для задач, которые будут обрабатываться рабочей ролью. В главе 4 «Секционирование мультитенантных приложений» описана реализация этих операторов, а в разделе «Тестирование рабочих ролей» далее в этой главе рассказывается о том, каким образом они упрощают разработку модульных тестов.

Стресс-тестирование и настройка производительности Специалисты Tailspin провели стресс-тестирование приложения Surveys, работающего в облаке, чтобы выявить любые узкие места, которые ограничивают масштабируемость, и понять, как лучше реализовать горизонтальное масштабирование. Эти узкие места могут ограничивать пропускную способность хранилища Windows Azure, объем информации, который приложение может обработать с использованием имеющихся ресурсов процессора и памяти и реализованных в приложении алгоритмов, а также количество веб-запросов, которые могут обработать веб-роли.

Обнаруженные в результате стресс-тестирования узкие места были устранены командой разработчиков Tailspin, которые выбрали наилучшее из всех доступных решений, внесли изменения в приложение, а затем снова провели стресс-тест, чтобы убедиться в том, что ожидаемые результаты были достигнуты.

Для стресс-тестирования компания Tailspin использовала тест Visual Studio Load Test в Windows Azure, специалисты эмулировали различные объемы ответов на опросы на общедоступном веб-сайте Surveys. Для получения дополнительной информации о нагрузочном тестировании ролей Windows Azure, которое осуществляет другое приложение Windows Azure см. статью «Using Visual Studio Load Tests in Windows Azure Roles» на сайте MSDN.

ГЛАВА 7

–  –  –

Администраторы могут использовать портал управления Windows Azure для изменения параметров в файле конфигурации службы при развертывании приложения, а также для остановки и запуска ролей, управления количеством экземпляров и просмотра важной информации о роли во время выполнения. Все перечисленные задачи можно решить и с помощью API управления Windows Azure, также администраторы могут использовать ряд командлетов PowerShell с разными методами для организации взаимодействия с интерфейсом API.

Загрузить командлеты Windows Azure PowerShell можно со страницы Windows Azure Download.

Практически для всех задач администрирования Tailspin использует командлеты Windows Azure PowerShell с целью организации взаимодействия с API управления Windows Azure. Таким образом, стандартные задачи администрирования используют надежные и повторяемые процессы. Тем не менее для выполнения некоторых задач администраторы будут использовать портал управления Windows Azure, в особенности это касается задач, решать которые приходится достаточно редко.

–  –  –

Кроме того, независимые разработчики и поставщики программного обеспечения сталкиваются с некоторыми другими проблемами в сфере администрирования, которые не характерны для разработчиков внутренних приложений и сервисов. Их приложения должны поддерживать создание новых подписок и настройки для отдельных подписчиков и арендаторов, кроме того, приложения разрабатывается с учетом конкретных финансовых целей. Эти вопросы описаны более детально в разделе «Мультитенантные приложения с точки зрения независимых поставщиков программного обеспечения» в этой главе.

–  –  –

Tailspin включает в приложение код для записи событий в журнал диагностики Windows Azure с помощью пользовательского вспомогательного класса и прослушивателя Windows Azure Diagnostics. Код приложения отслеживает целый ряд событий и типичных ошибок в работе приложения. Уровень регистрации событий регулируется путем установки параметра в файле конфигурации службы, администраторы могут использовать расширенный журнал в процессе отладки приложения и обычный во время его выполнения.

Реализация Теперь настало время более подробно рассмотреть некоторые фрагменты кода в приложении Surveys от Tailspin. По мере изучения этого раздела может потребоваться загрузка решения Visual Studio для приложения Tailspin Surveys с сайта http://wag.codeplex.com/.

Модульное тестирование Специалисты Tailspin создали больше классов в приложении Surveys с целью поддержки модульного тестирования с использованием шаблона проектирования для внедрения зависимостей. Это позволяет использовать фиктивные объекты для тестирования отдельных классов, без сложных процессов создания и уничтожения, которые характерны для реальных объектов.

В этом разделе описывается, например, каким образом в приложении Surveys реализована поддержка модульного тестирования класса SurveyStore, предоставляющего доступ к табличному хранилищу Windows Azure. Здесь рассматриваются тесты для одного конкретного класса, при тестировании других классов применяется аналогичный подход.

В следующем фрагменте кода показан интерфейс lAzureTable и класс AzureTable, на которых основано рассматриваемое решение.

C#

public interface IAzureTableT :

IAzureObjectWithRetryPolicyFactory where T : TableServiceEntity { IQueryableT Query { get; } CloudStorageAccount Account { get; } void EnsureExist();

void Add(T obj);

void Add(IEnumerableT objs);

void AddOrUpdate(T obj);

void AddOrUpdate(IEnumerableT objs);

void Delete(T obj);

void Delete(IEnumerableT objs);

} public class AzureTableT : AzureStorageWithRetryPolicy, IAzureTableT where T : TableServiceEntity { private readonly string tableName;

private readonly CloudStorageAccount account;

...

УПРАВЛЕНИЕ И МОНИТОРИНГ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 187

public IQueryableT Query { get { TableServiceContext context = this.CreateContext();

return context.CreateQueryT(this.tableName).AsTableServiceQuery();

} }...

public void Add(T obj) { this.Add(new[] { obj });

} public void Add(IEnumerableT objs) { TableServiceContext context = this.CreateContext();

foreach (var obj in objs) { context.AddObject(this.tableName, obj);

} var saveChangesOptions = SaveChangesOptions.None;

if (objs.Distinct( new PartitionKeyComparer()).Count() == 1) { saveChangesOptions = SaveChangesOptions.Batch;

} this.StorageRetryPolicy.ExecuteAction(() = context.SaveChanges(saveChangesOptions));

}...

private TableServiceContext CreateContext() { return new TableServiceContext( this.account.TableEndpoint.ToString(), this.account.Credentials) { // Retry policy is handled by TFHAB RetryPolicy = RetryPolicies.NoRetry() };

} ГЛАВА 7

–  –  –

Метод Add, который использует параметр IEnumerable, должен определить количество элементов в партии и объем рабочей нагрузки, прежде чем вызывать метод SaveChanges с опцией SaveChangesOptions.Batch.

Дополнительная информация о партиях и табличном хранилище Windows Azure: «Performing Entity Group Transactions» («Транзакции с группами сущностей») на сайте MSDN.

Универсальный интерфейс и класс имеют параметр типа T, наследуемый от типа TableServiceEntity Windows Azure, который вы будете использовать для создания собственных табличных типов. К примеру, в приложении Surveys типы SurveyRow и QuestionRow наследуются от класса TableServiceEntity. Интерфейс lAzureTable отвечает за выполнение нескольких операций: метод Query возвращает коллекцию IQueryable типа T, а методы Add, AddOrUpdate и Delete используют параметр типа T. В классе AzureTable метод Query возвращает объект TableServiceQuery, методы Add и AddOrUpdate помещают объект в табличное хранилище, а метод Delete удаляет объект из табличного хранилища.

Чтобы создать фиктивный объект для модульного тестирования, вы должны инициализировать экземпляр объекта, который реализует тип интерфейса lAzureTable. В следующем примере кода из класса SurveyStore показан конструктор. Конструктор использует параметр типа lAzureTable, поэтому вы можете передавать реальный или фиктивный объект для реализации этого интерфейса.

C# public SurveyStore(IAzureTableSurveyRow surveyTable, IAzureTableQuestionRow questionTable) { this.surveyTable = surveyTable;

this.questionTable = questionTable;

}

УПРАВЛЕНИЕ И МОНИТОРИНГ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 189

Этот параметризованный конструктор вызывается в рамках двух различных сценариев. Приложение Surveys вызывает его напрямую, когда использует класс MVC SurveysController. Приложение использует контейнер с целью внедрения зависимостей Unity для создания экземпляров контроллеров MVC. Приложение Surveys заменяет стандартную фабрику контроллеров MVC на класс UnityControllerFactory в методе OnStart для обеих веб-ролей, поэтому, когда приложению нужен новый экземпляр контроллера MVC, за создание этого экземпляра отвечает контейнер Unity. В следующем примере кода показан фрагмент класса ContainerBootstrapper из проекта TailSpin.Web, который контейнер Unity использует для того, чтобы понять, как создавать экземпляры объектов.

C# public static void RegisterTypes(IUnityContainer container, bool roleInitialization) { CloudStorageAccount Account { get; }.GetStorageAccount("DataConnectionString");

this.tenantBlobContainer.Get(tenant);

...

var tenantToUpdate = typeof(Microsoft.WindowsAzure.CloudStorageAccount);

var tenantToUpdate = new PartitionKeyComparer()).Count() == 1) typeof(IRetryPolicyFactory));

container.RegisterTypeIAzureTableSurveyRow, AzureTableSurveyRow( new InjectionConstructor(cloudStorageAccountType, AzureConstants.Tables.Surveys), readWriteStrategyProperty, retryPolicyFactoryProperty).RegisterTypeIAzureTableQuestionRow, AzureTableQuestionRow( new InjectionConstructor(cloudStorageAccountType, AzureConstants.Tables.Questions), retryPolicyFactoryProperty);

...

container.RegisterTypeISurveyStore, SurveyStore (cacheEnabledProperty)...

} ГЛАВА 7

–  –  –

Тест создает фиктивный экземпляр IAzureTableSurveyRow, создает с его помощью объект SurveyStore, вызывает метод GetSurveyByTenantAndSlugName и проверяет результат. Тестирование проводится без обращения к табличному хранилищу Windows Azure.

Приложение Surveys использует подобный подход для модульного тестирования других компонентов системы хранения данных, которые работают с хранилищем BLOB-объектов и табличным хранилищем Windows Azure.

Тестирование рабочих ролей Специалисты компании Tailspin также рассматривали варианты реализации фоновых тестов в рабочих ролях таким образом, чтобы свести к минимуму связанные с тестированием усилия. «Соединительный» код в рабочей роли и контейнер Unity позволяют выполнять модульное тестирование компонентов рабочей роли с использованием фиктивных объектов вместо очередей и BLOB-объектов Windows Azure. В следующем фрагменте кода из класса BatchProcessingQueueHandlerFixture показано два примера модульных тестов.

C# [TestMethod] void EnsureExist();

{ var mockQueue = new MockIAzureQueueStubMessage();

var queueHandler = BatchProcessingQueueHandler.For(mockQueue.Object, 1);

Assert.IsInstanceOfType(queueHandler, typeof(BatchMultipleQueueHandlerMessageStub));

} [TestMethod] void EnsureExist();

{ var output = new ClaimsIdentity();

var output = new ClaimsIdentity();

var mockQueue = new MockIAzureQueueMessageStub();

var queue = new QueueIEnumerableMessageStub();

queue.Enqueue(new[] { message1, message2 });

mockQueue.Setup(q = q.GetMessages(32)).Returns(() = queue.Count 0 ?

queue.Dequeue() : this.Add(new[] { obj });

var command = new MockIBatchCommandMessageStub();

var output = new ClaimsIdentity();

BatchProcessingQueueHandlerStub(mockQueue.Object);

queueHandler.Do(command.Object);

command.Verify(c = c.Run(It.IsAnyMessageStub()), charset=utf2" / command.Verify(c = c.Run(message1));

command.Verify(c = c.Run(message2));

} ГЛАВА 7 public class AzureTableT : AzureQueueMessage { } public class AzureTableT : CloudQueueMessage { public override string GetIssuerName( : base(content) { this.DequeueCount = 6;

} }

private class PartitionKeyComparer :

BatchProcessingQueueHandlerStubMessage { public BatchProcessingQueueHandlerStub( IAzureQueueStubMessage queue) : base(queue) { } public override string GetIssuerName( IBatchCommandStubMessage batchCommand) { this.SaveTenant(tenantToUpdate);

} } Модульный тест ForCreateHandlerForGivenQueue контролирует выполнение метода For, который создает экземпляр BatchProcessingQueueHandler, с использованием фиктивной очереди. Модульный тест DoRunsGivenCommandForEachMessage контролирует работу метода Do, который обеспечивает выполнение команды в отношении каждого сообщения в очереди с использованием фиктивной очереди и объектов команд.

УПРАВЛЕНИЕ И МОНИТОРИНГ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 193

Тестирование мультитенантных функций и изоляции арендаторов Специалисты Tailspin разработали тесты для проверки надежности изоляции арендаторов. В следующем примере кода показан тест из класса SurveysControllerFixture. Этот тест предназначен для того, чтобы убедиться в том, что частный вебсайт арендатора использует правильные сведения об арендаторе, который инициирует экспорт данных опроса в экземпляр базы данных SQL.

C# [TestMethod] void EnsureExist();

{ var output = new ClaimsIdentity();

var mockTenantStore = new MockITenantStore();

var mockSurveyAnswerStore = new MockISurveyAnswerStore();

mockTenantStore.Setup( this.tenantBlobContainer.Get(tenant);

mockSurveyAnswerStore.Setup( r = r.GetFirstSurveyAnswerId(It.IsAnystring(), return string.Compare(x.PartitionKey, var output = new ClaimsIdentity();

null, mockSurveyAnswerStore.Object, null, tenant.Name));

{ this.tenantBlobContainer.Get(tenant);

var tenantToUpdate = controller.ExportResponses(string.Empty) as ViewResult;

var model = result.ViewData.Model as TenantPageViewDataExportResponseModel;

Assert.AreSame(tenant, model.ContentModel.Tenant);

} } ГЛАВА 7

–  –  –

Разработчики Tailspin планируют решить эту проблему, реализовав механизм постраничного просмотра, который подразумевает использование нескольких BLOBобъектов для хранения списка ответов для каждого опроса. В каждом BLOB-объекте будет список ответов на опрос, но при достижении этим списком заданного размера, приложение создаст новый BLOB-объект. Поэтому размер списка, в который в данный момент приложение вносит данные, никогда не будет превышать определенное фиксированное значение.

Для этого также потребуются некоторые изменения в логике приложения, чтобы организовать постраничный просмотр ответов в пользовательском интерфейсе и их чтение с целью экспорта в базу данных SQL.

–  –  –

Управление приложением Surveys Tailspin размещает все данные конфигураций, которые используются для управления арендаторами приложения Surveys, в хранилище BLOB-объектов. Частный веб-сайт (в проекте Tailspin.Web) содержит набор страниц, доступных только для администраторов Tailspin, которые управляют арендаторами приложения Surveys.

Пример приложения в настоящее время позволяет администраторам Tailspin добавлять новых арендаторов и обновлять сведения о существующих. Функции удаления арендаторов администраторам пока не предоставляются.

На экране Subscribers list администратор может просматривать список существующих арендаторов приложения Tailspin Surveys. Здесь администратор Tailspin может редактировать сведения о существующих арендаторах и добавлять новых, нажимая на кнопку Add a new subscriber.

Tailspin планирует реализовать процедуру, которая позволит администраторам удалять арендаторов.

Доступ к этой функции можно будет получить, щелкнув по гиперссылке Delete на экране со списком подписчиков, сама процедура удаления состоит из следующих этапов:

• Удаление BLOB-объекта с данными конфигурации арендатора из хранилища BLOB-объектов tenants.

• Удаление всех созданных этим арендатором вопросов (таблица Questions) и заголовков его опросов (таблица Surveys).

В таблице Surveys опросы разных арендаторов размещаются в отдельных разделах. Ключ раздела в таблице Questions — это комбинация имени подписчика и названия опроса. Процедура должна найти все разделы с ключами, которые начинаются с идентификатора удаляемого подписчика.

• Удаление всех контейнеров BLOB-объектов с ответами на опросы этого подписчика (каждому опросу выделяется собственный BLOB-объект для сохранения ответов). Идентификатор арендатора должен быть указан в имени контейнера.

• Удаление всех BLOB-объектов в контейнерах surveyanswerssummaries и surveyanswerslists, которые принадлежат данному подписчику (у каждого опроса будет собственный BLOB-объект в каждом из этих контейнеров). Идентификатор арендатора указан в имени BLOB-объектов.

• Удаление всех данных, используемых для пользовательской настройки опросов подписчика, например логотипов из соответствующего контейнера BLOB-объектов.

• Если в подписке используется база данных SQL, она также удаляется.

• Удаление данных конфигурации подписчика и определений опросов из кэша.

• Если подписчик использует поставщика удостоверений Tailspin, то из хранилища поставщика удаляются все принадлежащие этому подписчику учетные записи.

Некоторые операции в этом списке могут быть выполнены достаточно быстро, поэтому Tailspin планирует выполнять их синхронно, после того как администратор подтвердит свой запрос на удаление подписчика. Таким образом, синхронными будут следующие процессы: удаление данных из кэша, удаление данных из таблицы Surveys и удаление данных конфигурации подписчика из контейнера BLOB-объектов tenants. Когда все перечисленные операции удаления будут выполнены, подписчик больше не сможет получить доступ на частный веб-сайт арендатора, а его опросы не будут отображаться на общедоступном сайте.

Tailspin может быстро удалить данные конфигурации подписчика из хранилища BLOB-объектов, поскольку идентификатор подписчика — это имя BLOB-объекта. Также можно быстро удалить записи из таблицы Surveys, потому что все опросы подписчика хранятся в одном разделе, и кэшированные данные, потому что приложение использует отдельную область кэша для каждого арендатора.

ГЛАВА 7

–  –  –

МУЛЬТИТЕНАНТНЫЕ ПРИЛОЖЕНИЯ С ТОЧКИ ЗРЕНИЯ

НЕЗАВИСИМЫХ ПОСТАВЩИКОВ ПРОГРАММНОГО

ОБЕСПЕЧЕНИЯ

Управление регистрацией новых подписчиков, настройками для каждого пользователя и процессом выставления счетов — это достаточно сложные задачи как для однотенантного, так и для мультитенантного приложения. Но при использовании мультитенантной модели возникают некоторые особенности.

Цели и требования В этом разделе описываются цели и требования, которые специалисты компании Tailspin определили для арендаторов и пользователей приложения Surveys, оплачивающих подписку. Но эти цели и требования также применимы для большинства мультитенантных приложений, разрабатываемых независимыми поставщиками программного обеспечения.

Когда новый пользователь подписывается на мультитенантное приложение, необходимо соответствующим образом настроить конфигурацию и внести в приложение другие изменения для поддержки новой учетной записи. Процесс создания новой подписки обычно должен быть автоматизированным, и это касается многих компонентов в приложении. Tailspin планирует по-максимуму автоматизировать этот Процесс регистрации нового процесс, чтобы упростить подключение к системе новых подписчиков, а также подписчика охватывает мносвести к минимуму связанные с этим затраты. жество компонентов вашего приложения.

Независимые поставщики программного обеспечения обычно предлагают своим клиентам подписки различного уровня, например Standard и Premium. Отличия могут касаться функциональных возможностей, уровня поддержки и обслуживания (например, гарантированной доступности и времени отклика). Это усложняет как процесс регистрации, так и текущее сопровождение подписчиков. Компания Tailspin собирается предлагать различные уровни обслуживания, поэтому специалисты должны учитывать, как это повлияет на структуру приложения.

ГЛАВА 7

–  –  –

• Предоставление ресурсов для конкретного владельца. Владельцы с подпиской Premium могут использовать собственный сервер базы данных SQL для сохранения экспортированных данных. База данных SQL предоставляет интерфейс Management REST API, который позволяет создавать экземпляры сервера. Для выделения любых других ресурсов Windows Azure, например учетных записей хранения или облачных служб, можно использовать интерфейс Windows Azure Service Management API.

• Уведомление администраторов Tailspin о любых дополнительных операциях, которые должны быть выполнены от лица владельца. Администраторы Tailspin не будут вручную выполнять какие-либо операции в ходе создания новой подписки.

• Уведомление подписчика о любых дополнительных операциях, которые должны быть выполнены. Например, подписчики приложения Tailspin Surveys могут использовать собственное имя DNS для доступа к своим опросам.

• Ознакомление подписчика со всеми применимыми условиями использования приложения, включая соглашение об уровне обслуживания для выбранной им подписки.

Дополнительная информация о применении интерфейсов Windows Azure Service Management REST API содержится в статьях «Windows Azure Service Management REST API Reference» и «Справочник по API управления REST».

Настройка подписчиков Специалисты Tailspin решили размещать все данные конфигурации каждого владельца в хранилище BLOB-объектов Windows Azure. Каждый владелец Tailspin получает собственный BLOB-объект, для записи объекта Tenant в этот BLOB-объект используется сериализатор JSON. Практически все данные конфигурации владельца сохраняются указанным способом, что упрощает задачу управления данными подписчиков для Tailspin. Но есть некоторые исключения: логотипы размещаются не в контейнере BLOB-объектов tenants, а в контейнере logos; учетные записи владельцев, которые выбрали поставщика удостоверений Tailspin, хранятся в базе данных членства этого поставщика.

–  –  –

Tailspin установит различные месячные лимиты для подписок различного уровня.

На начальном этапе Tailspin планирует ввести следующие ограничения для подписчиков:

• Для владельцев с подписками Premium и Standard будут установлены разные ограничения на максимальное количество активных опросов, запускаемых одновременно. Tailspin может подсчитывать количество активных опросов каждый раз, когда владелец пытается опубликовать новый опрос.

• Различные ограничения будут установлены для срока действия опроса. Для этого Tailspin придется вносить в определение опроса дату его публикации. Приложение может проверять срок действия опроса при каждой загрузке списка доступных опросов для подписчика.

Tailspin также рассмотрит возможность установки различных ограничений на максимальное количество ответов, которые могут быть собраны для подписок различного уровня. В таком случае приложение должно будет отслеживать количество полученных ответов на опрос для каждого владельца и опроса с последующим уведомлением подписчика о том, что предельное значение вскоре будет достигнуто. Приложение получает эту информацию, когда вычисляет сводную статистику.

Tailspin будет контролировать работу приложения, чтобы опросы одного подписчика не оказывали негативного влияния на работу других пользователей. Если это все-таки произойдет, компания будет рассматривать возможность введения дополнительных ограничений на объем потребляемых подписчиками ресурсов.

Пример приложения в настоящее время не устанавливает никаких ограничений в зависимости от уровня подписки.

Реализация Теперь настало время более подробно рассмотреть некоторые фрагменты кода в приложении Surveys от Tailspin. По мере изучения этого раздела может потребоваться загрузка решения Visual Studio для приложения Tailspin Surveys с сайта http://wag.codeplex.com/.

Подготовка системы к работе с пробными и новыми подписками В этом разделе рассказывается о том, как компания Tailspin организовала регистрацию новых подписчиков. Этот процесс собирает описанную в данном разделе информацию, а затем помещает ее в хранилище BLOB-объектов, у каждого владельца будет свой BLOB-объект. Веб-роли и рабочие роли в приложении Tailspin Surveys используют сведения, относящиеся к определенному владельцу, из хранилища BLOB-объектов для динамической настройки приложения во время выполнения.

Основная информация о подписке В следующей таблице перечислены основные сведения, которые подписчик должен будет предоставить при подключении к службе Surveys.

Информация Пример Примечания Имя Adatum Ltd. Фирменное наименование подписчика. Это наименование указывается на имеющих отношение к данному подписчика подписчику страницах веб-сайтов Surveys. Кроме того, подписчик может также предоставить логотип.

Псевдоним adatum Уникальный псевдоним, используемый для идентификации подписчика в приложении. Например, подписчика псевдоним будет указываться в URL-адресе веб-страниц соответствующего подписчика.

Приложение автоматически генерирует псевдоним на основе имени подписчика, но подписчик может изменить это значение.

Тип подписки Trial, Individual, Тип подписки определяет набор доступных подписчику функций, для некоторых типов подписчику, Standard, Premium возможно, придется предоставить дополнительную информацию в процессе регистрации.

Платежные Данные кредитной За исключением пробной (Trial), все подписки должны оплачиваться. Для обработки платежей по кредитреквизиты карты ным картам приложение использует решение стороннего поставщика.

–  –  –

Информация для проверки подлинности и авторизации Три альтернативных подхода к управлению доступом к приложению рассматриваются в главе 6 «Обеспечение безопасности мультитенантных приложений». Каждый из этих подходов требует предоставления различной информации о подписчике в процессе регистрации. Например, для подписки уровня Standard используется поставщик социальной идентификации (учетные записи Microsoft или Google), а подписчики уровня Premium могут использовать возможности собственного поставщика удостоверений или поставщика удостоверений компании Tailspin.

Установка доверительных отношений с поставщиком удостоверений подписчика Одно из преимуществ подписки Premium состоит в возможности интеграции с поставщиком удостоверений подписчика.

Процесс регистрации нового подписчика собирает информацию, необходимую для настройки доверительных отношений между службой маркеров безопасности подписчика (Security Token Service, STS) и поставщиком федеративных удостоверений Tailspin (FP) STS. В следующей таблице описана эта информация.

–  –  –

В примерах кода присутствует проект Tailspin.SimulatedIssuer, содержащий простой поставщик федеративных удостоверений, который управляет федерациями с подписчиками компании Tailspin. Этот поставщик федеративных удостоверений считывает необходимую информацию из данных конфигурации владельца в хранилище BLOB-объектов. В следующем примере кода из класса FederationSecurityTokenService в проекте Tailspin.SimulatedIssuer показано, как этот простой поставщик федеративных удостоверений использует информацию о поставщике для преобразования утверждения владельца в утверждение, которое принимает приложение Surveys.

C# protected override IClaimsIdentity GetOutputClaimsIdentity( IClaimsPrincipal principal, RequestSecurityToken request, Scope scope) { if (principal == null) { return new TableServiceContext( "The caller's principal is null.");

} var input = principal.Identity as ClaimsIdentity;

var tenant = this.tenantStore.GetTenant( input.Claims.First().Issuer);

if (tenant == null) { return new TableServiceContext( "Issuer not trusted.");

} var output = new ClaimsIdentity();

CopyClaims(input, new[] { WSIdentityConstants.ClaimTypes.Name }, output);

TransformClaims(input, tenant.ClaimType, tenant.ClaimValue, ClaimTypes.Role, Tailspin.Roles.SurveyAdministrator, output);

output.Claims.Add(new Claim(Tailspin.ClaimTypes.Tenant, tenant.Name));

return output;

}

УПРАВЛЕНИЕ И МОНИТОРИНГ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 207

В следующем примере кода из класса TenantStoreBasedlssuerNameRegistry в проекте Tailspin.SimulatedIssuer показано, как поставщик федеративных удостоверений Tailspin проверяет надежность источника маркера безопасности. При этом отпечаток подписчика из данных конфигурации владельца сравнивается с отпечатком сертификата подписи в маркере безопасности, полученном от STS владельца.

C# public override string GetIssuerName( SecurityToken securityToken) { if (securityToken is X509SecurityToken) { string thumbprint = (securityToken as X509SecurityToken).Certificate.Thumbprint;

foreach ( var tenantName in this.tenantStore.GetTenantNames()) { var tenant = this.tenantStore.GetTenant(tenantName);

if (tenant.IssuerThumbPrint.Equals(thumbprint, System.Globalization.CultureInfo.InvariantCulture) { return tenant.Name;

} } return null;

} else { return new TableServiceContext( "Empty or wrong securityToken argument");

} } В дальнейшем специалисты Tailspin могут перейти на ADFS, Windows Azure Access Control или любую другую пользовательскую службу STS, чтобы использовать ее в качестве STS поставщика федеративных удостоверений. В процессе регистрации приложению Surveys придется программно устанавливать доверительные отношения между STS поставщика федеративных удостоверений Tailspin и поставщиком удостоверений подписчика, а также программно добавлять любые правила преобразования удостоверений для поставщика федеративных удостоверений Tailspin.

Дополнительные сведения по поводу применения утверждений и доверительных отношений содержатся в разделе «Setup and Physical Deployment» в главе 5 «Federated Identity with Windows Azure Access Control Service»

руководства «A Guide to Claims-Based Identity and Access Control».

ГЛАВА 7

–  –  –

На момент написания этого руководства действовало мягкое ограничение: не более 150 баз данных на один сервер базы данных SQL. Специалисты Tailspin могли бы вручную проверять, сколько баз данных уже создано на каждом сервере базы данных SQL, а затем добавлять новые экземпляры сервера по мере необходимости. Кроме того, Tailspin может автоматизировать этот процесс с помощью интерфейса SQL Database Management REST API. Дополнительные сведения см. в статье «Операции на серверах баз данных SQL Windows Azure».

Владельцем экземпляра базы данных SQL Windows Azure является компания Tailspin, она же является плательщиком. Tailspin взимает плату с подписчиков этой службы. Подробнее о том, каким образом приложение Surveys использует базу данных SQL Windows Azure описано в разделе «Организация экспорта данных» в главе 3 «Выбор мультитенантной архитектуры данных» этого руководства.

Настройка приложения Surveys для каждого подписчика Еще одна общая черта большинства мультитенантных приложений: владельцы могут настраивать некоторые компоненты приложения для своих клиентов, например изменять внешний вид пользовательского интерфейса или отключать определенные функции и возможности.

Каким образом Tailspin предоставляет подписчикам возможность настраивать пользовательский интерфейс Текущая версия приложения Surveys позволяет подписчикам настраивать внешний вид своих страниц, например использовать изображение логотипа. Подписчики могут загружать изображения для своей учетной записи, приложение Surveys сохраняет изображения вместе с остальными данными подписчика в хранилище BLOB-объектов. Затем приложение может выводить изображения на страницах общедоступного и частного веб-сайта.

Текущая версия решения позволяет подписчику загрузить одно изображение в контейнер общедоступного BLOB-объекта с именем logos. В процессе загрузки приложение добавляет URL-адрес для изображения логотипа в BLOB-объект владельца в контейнере с имени tenants. В следующем примере кода из класса TenantStore показано, как приложение сохраняет изображение логотипа подписчика в хранилище BLOB-объектов и обновляет данные конфигурации для владельца, добавляя к ним URL-адрес изображения.

C# public void UploadLogo(string tenant, byte[] logo) { this.logosBlobContainer.Save(tenant, logo);

var tenantToUpdate = this.tenantBlobContainer.Get(tenant);

tenantToUpdate.Logo = this.logosBlobContainer.GetUri(tenant).ToString();

this.SaveTenant(tenantToUpdate);

} В будущих версиях приложения Tailspin планирует предоставлять подписчикам расширенные возможности для пользовательской настройки. Эти планируемые расширения, которые не включены в пример приложения, позволят подписчикам настраивать внешний вид страниц своих опросов с использованием элементов фирменного стиля, оформленных в виде каскадных таблиц стилей (Cascading Style Sheets, CSS).

ГЛАВА 7 Специалисты Tailspin обеспокоены возможными негативными последствиями предоставления пользователям возможности загружать собственные файлы.css для безопасности решения, поэтому компания планирует обеспечить на веб-сайте поддержку лишь определенных функций CSS. C этой целью Tailspin планирует предоставить подписчикам пользовательский интерфейс для загрузки заранее определенного списка селекторов CSS, которые применяются к HTML-элементам, используемым для отображения страницы опроса с вопросами. Приложение Surveys будет хранить эти пользовательские определения селекторов CSS вместе с данными конфигурации каждого владельца, позволяя владельцу настраивать свои опросы с использованием своего собственного стиля. В следующем примере кода показан набор селекторов CSS, которые приложение использует в настоящее время и которые можно переопределить, используя этот подход.

CSS #surveyTitle {...

} #surveyTitle h1 {...

} #surveyForm {...

} #surveyForm ol {...

} #surveyForm ol li {...

} #surveyForm.option input[type="radio"] {...

}.stars span span {...

}.stars span.rating-over {...

}.stars span.rating {...

}

УПРАВЛЕНИЕ И МОНИТОРИНГ МУЛЬТИТЕНАНТНЫХ ПРИЛОЖЕНИЙ 211

Приложение Surveys будет создавать пользовательскую таблицу стилей динамически во время выполнения, на основе пользовательских определений, сохраненных подписчиком, таблица стилей будет подключаться в коде HTML-страниц.

В следующем примере кода показано, как страница Survey Display на общедоступном сайте может применить пользовательские селекторы CSS, созданные подписчиком Adatum.

HTML head meta http-equiv="Content-Type" content="text/html;

charset=utf-8" / meta http-equiv=”X-UA-Compatible” content=”IE=8” / titleTailspin - Survey #1/title link href="/Content/styles/baseStyle.css" rel="stylesheet" type="text/css" media="screen" / link href="/Utility/DynamicStyle.aspx?TenantID=adatum" rel="stylesheet" type="text/css" media="screen" / /head Страница импортирует пользовательские стили, созданные страницей DynamicStyle.aspx после создания стилей, используемых по умолчанию, поэтому пользовательские настройки подписчика смогут переопределить параметры базовых стилей.

Tailspin собирается реализовать механизм сканирования, позволяющий убедиться в том, что настройки CSS, предоставляемые владельцем, не содержат функций CSS, которые не поддерживаются веб-сайтом Surveys или могут поставить под угрозу безопасность приложения.

–  –  –

ИНФОРМАЦИЯ О БАЗЕ ДАННЫХ

Все представленные в данном руководстве ссылки присутствуют в библиографическом списке на странице http://msdn.microsoft.com/library/jj871057.aspx.

Дополнительная информация об управлении жизненным циклом приложений и Windows Azure представлена в статьях в разделе «Testing, Managing, Monitoring and Optimizing Windows Azure Applications» на сайте MSDN.

Дополнительная информация о создании настраиваемых счетчиков производительности содержится в статье «Real World:

Creating Custom Performance Counters for Windows Azure Applications with PowerShell».

Вопросы, связанные с обеспечением непрерывности бизнеса при использовании приложений Windows Azure, освещены в статье «Непрерывность бизнес-процессов для Windows Azure».

Сведения о службе импорта и экспорта базы данных SQL содержатся в статье «Как импортировать и экспортировать базу данных (базу данных SQL Windows Azure».

Полезные ссылки и ресурсы для тестирования приложений Windows Azure содержатся в статье «Testing Applications in Windows Azure».

Дополнительная информация о мониторинге приложений Windows Azure, в том числе с помощью Microsoft System Center Operations Manager содержатся в статье «Troubleshooting in Windows Azure».

Подробнее об отличиях между локальным эмулятором и эмулятором хранения и Windows Azure описано в статьях «Различия между эмулятором хранения и службами хранения Windows Azure» и «Различия между эмулятором среды и Windows Azure».

ГЛАВА 7 Глоссарий Территориальная группа. Именованное группирование, являющееся отдельным центром данных. Может включать все компоненты, связанные с приложением, такие как хранилища, базы данных Windows Azure SQL и роли.

ASP.NET MVC. Платформа для разработки веб-приложений. В ее основе — архитектурный шаблон проектирования ModelView-Controller.

Автоматическое масштабирование. Автоматическое масштабирование приложения, выполняемое по расписанию или на основе данных, получаемых из среды.

Утверждение. Утверждение о субъекте, например его имя, идентификатор, ключ, группа, разрешение или возможность, которое субъект делает о себе или о другом субъекте. Утверждениям присваивается одно или несколько значений, затем они упаковываются в маркеры безопасности, которые распространяются поставщиком.

Облако. Набор взаимосвязанных серверов, расположенных в одном или нескольких центрах обработки данных.

Облачная служба. Среда Windows Azure, в которой размещаются веб-роли и рабочие роли вашего приложения.

Официально эта служба называется «размещаемой».

Код вблизи. Ситуация, когда и приложение, и связанные с ним базы данных находятся в одном облаке.

Код вдали. Ситуация, когда приложение работает локально, а связанные с ним базы данных — в облаке.

Эмулятор вычислений. Эмулятор вычислений в Windows Azure позволяет запускать, тестировать, отлаживать и настраивать приложение до его развертывания в виде службы внешнего размещения в Windows Azure. См. также «Эмулятор хранилища».

Сеть доставки контента (CDN). Система, состоящая из нескольких серверов, содержащих копии данных. Эти серверы размещены в разных географических областях, чтобы пользователи смогли получить доступ к ближайшей к ним копии.

Маркер продолжения. Технология, поддерживаемая табличным хранилищем Windows Azure, которая позволяет клиенту просматривать страницы с записями. По запросу сервер возвращает страницу записей и маркер продолжения. Если клиент отправляет маркер продолжения обратно на сервер, сервер возвращает следующую страницу записей.

Эластичность. Свойство системы, которое характеризует возможность динамического масштабирования.

Библиотека Enterprise Library. Собрание повторно используемых программных компонентов (блоков приложений), спроектированных в помощь разработчикам программного обеспечения для общих потребностей предприятия (таких как ведение журналов, проверка, доступ к данным, обработка исключений и многие другие).

Транзакция групп сущностей (Entity Group Transaction, EGT). Транзакция со свойствами ACID в отношении нескольких сущностей, которые хранятся в одном и том же разделе таблицы Windows Azure.

Федерация. Федерация в базе данных SQL Windows Azure — это способ горизонтального масштабирования с использованием дополнительных серверов. Также известна как «сегментирование» (шардирование, sharding).

Поставщик федеративных удостоверений. Особый случай применения службы маркеров безопасности (Security Token Service, STS), обычно доверяет стороннему поставщику удостоверений. Поставщик федеративных удостоверений может преобразовывать утверждения в маркере от стороннего поставщика удостоверений таким образом, чтобы ваше приложение могло их распознать.

ГЛОССАРИЙ Горизонтальная масштабируемость. Возможность добавления новых серверов, которые являются копиями существующих серверов.

Размещаемая служба. Пространство, где развернуты приложения.

Идемпотентная операция. Операция, которую можно выполнять несколько раз, не изменяя результаты. Примером служит задание значения переменной.

Поставщик удостоверений. Как правило, это отдельная система, которая отвечает за идентификацию пользователя.

Приложение, решая эту задачу, доверяет поставщику удостоверений. Поставщик удостоверений передает информацию о пользователе в виде маркера. Поставщик удостоверений — это особый случай применения службы маркеров безопасности (Security Token Service, STS).

Инфраструктура как услуга (Infrastructure as a Service, laaS). Коллекция инфраструктурных служб, таких как хранилище, вычислительные ресурсы и сеть, которые можно арендовать у внешних партнеров.

Аренда. Монопольная блокировка записи в BLOB-объект, которая длится до истечения аренды.

Фиктивный объект. Фиктивный объект, который используется в целях тестирования вместо реального. Эти объекты используются в том случае, когда применение реальных объектов для тестирования нецелесообразно.

Оптимистичный параллелизм. Метод управления параллелизмом, в котором предполагается, что несколько изменений данных могут завершаться, не влияя друг на друга. Поэтому не требуется блокировать ресурсы данных. Оптимистичный параллелизм предполагает, что нарушения параллельного выполнения возникают нечасто, и просто не разрешает проводить обновления или удаления, вызывающие такие нарушения.

Платформа как услуга (Platform as a Service, Paas). Группа служб платформы, которые можно арендовать у внешнего партнера, они позволят вам развернуть и запустить ваше приложение, при этом нет необходимости управлять какой-либо инфраструктурой.

Сообщение о сбое. Сообщение, содержащее данные неправильного формата, которые вызвали формирование обработчиком очереди сообщения об исключении. В результате это сообщение не обрабатывается и остается в очереди, а следующая попытка обработать его снова завершается ошибкой.

Передача состояния представления (Representational State Transfer, REST). Архитектурный стиль для получения информации с веб-сайтов. Ресурс является источником специальной информации. Каждый ресурс идентифицируется глобальным идентификатором, таким как универсальный код ресурса (URI) в HTTP. Представление является реальным документом, который передает информацию.

Роль. Веб-роль или рабочая роль, подлежащая развертыванию в Windows Azure.

Экземпляр роли. Работающий экземпляр веб-роли или рабочей роли Windows Azure.

Протокол Secure Sockets Layer (SSL). Криптографический протокол, который использует открытый ключ шифрования для защиты сообщений, передаваемый через Интернет, например с помощью протокола HTTPS.

Служба маркеров безопасности (Security Token Service, STS). Служба, которая выдает утверждения в виде маркеров.

Приложение можно настроить на прием маркеров, выданных конкретной службой STS.



Pages:     | 1 || 3 |

Похожие работы:

«Наносистеми, наноматеріали, нанотехнології © 2011 ІМФ (Інститут металофізики ім. Г. В. Курдюмова НАН України) Nanosystems, Nanomaterials, Nanotechnologies 2011, т. 9, № 2, сс. 433—440 Надруковано в Україні. Фотокопіювання дозволено тільки відповідно до ліцензії PACS numbers:61.43.Fs, 61.43.Gt,6...»

«МБОУ "СОШ №3 с углублённым изучением отдельных предметов" г.Котовска Тамбовской области Рабочая программа по литературному чтению 4 класс Пояснительная записка Литературное чтение 4 класс УМК "Перспектива"1. Роль и место дисциплины Изучение курса имеет особое значение в развитии мл...»

«Ричард Докинз Эгоистичный ген http://www.litres.ru/pages/biblio_book/?art=129015 Эгоистичный ген: CORPUS; Москва; 2015 ISBN 978-5-17-077772-3 Аннотация Мы созданы нашими генами. Мы, животные, существуем, чтобы сохранить их, и служим лишь машинами, обеспечивающими их выживание. Мир...»

«2 РЕФЕРАТ Отчет: 78 с., рисунки 49, таблицы 3, приложение 1 Ключевые слова: алмаз, Якутская кимберлитовая провинция, карнийский ярус, кимберлиты, туффиты, щелочно-ультраосновные породы, траппы, Северо-Ази...»

«Avid Studio Версия 1 Avid Studio Ultimate Ваша жизнь в фильмах Документация разработана Nick Sullivan и Terri Morgan. В составлении документации принимали участие: Josh French, Dieter Huber, Jim Sugg и Markus Weber. © Avid Technology, Inc., 1996-2011. Все права защищены. Соблюдайт...»

«Полипы носа Опубликовано на сайте http://www.lor.ru/patient/polipy-nosa.html В данном обзоре хочу остановиться на достаточно частой патологии верхних дыхательных путей полипах носа или, если говорить правиль...»

«Местный пульт управления (МПУ) Устройство встроенного местного пульта МПУ К7-70.00.00.000 Встроенный местный пульт МПУ (рисунок 1) имеет маркировку взрывозащиты 1ЕхdIIВТ4 и состоит из взрывозащищенной оболочки 1 и крышки 2. На крышке 2 установлены переключатель команд управления 4 (ОТКРЫТЬ, ЗАКРЫТЬ, СТОП) и переключатель...»

«ОТЗЫВ официального оппонента на диссертацию Фисенко Виталия Геннадьевича “Предпосылки и признаки золоторудной минерализации Северо-Восточного склона Енисейского кряжа и перспективы промышленной золотоносности”, представленную на соискание ученой степени кандидата геолого-минералогических наук по сп...»

«Телематика, M2M 2011.01.14 Дополнительная информация к пресс-релизу о новом формате M2М SIMкарт Новый формат SIM-карт для М2М-устройств – микро SIM-чипы МТС представляет специальные SIM-карты в форм-факторе микрочипа для устройств передачи данных. Микро SIM-чипы позволяют повы...»

«Щербакова Е.И. НЯНЮШКИНЫ СКАЗКИ В Енисейске хозяйка спрашивала: "Убил, что ли, кого?" — "Нет". — "Украл?" — "Нет". — "Так за что же это тебя?" — "Я поляк". — "Такой молодой, а уже поляк!". (М.Л. Гаспаров. Записи и выписки. М. 2012. С. 63...»

«системы видеонаблюдения ВИДЕОНАБЛЮДЕНИЕ в Иркутской области и Республике Бурятия Компания OBSERVER надёжный поставщик оборудования для видеонаблюдения. Контроль и мониторинг Широкий ассортимент обстановки Мы поставляем всё необходимое оборудование для автономной раМы создаем сист...»

«АПРЕЛЬ 2010 МОСКОВСКИЙ КРЕДИТНЫЙ БАНК (B1/NR/B): КОММЕНТАРИЙ К РАЗМЕШЕНИЮ ЮРИЙ ТУЛИНОВ +7 495 789 36 09 yury.tulinov@trust.ru ТАТЬЯНА ДНЕПРОВСКАЯ +7 495 789 36 09 tatyana.dneprovskaya@trust.ru 14 апреля Московский Кредитный Банк (МКБ) вновь выходит на российский рынок рублевых облигаций с новым выпуском МКБ-8 объемом RUB3.0 млрд...»

«89/2016-73766(1) Арбитражный суд Хабаровского края г. Хабаровск, ул. Ленина 37, 680030, www.khabarovsk.arbitr.ru Именем Российской Федерации РЕШЕНИЕ г. Хабаровск дело № А73-5479/2016 20 июня 2016 года Арбитражный суд Хабаровского края в составе судьи Зверевой А. В. рассмотрев в порядке упрощенного про...»

«Государственное бюджетное дошкольное образовательное учреждение "детский сад"№57 комбинированного вида Красногвардейского района СанктПетербурга Рабочая программа подготовительной группы (67 лет) на 2013-2014 учебный год. Во...»

«ДКПП 33.20.43.300 УКНД 31.120 УТВЕРЖДАЮ Главный инженер ООО НПП “Микротерм” В. Н. Кучугура 2011 г. РЕГИСТРАТОРЫ ЭЛЕКТРОННЫЕ МТМ-РЭ-160-01 Руководство по эксплуатации ААЛУ.411131.003-01 РЭ Подпись и дата Инв. № дубл. Заведующий КО В. М. Достатнев _2011 г. Взам. инв. №. Подпис...»

«О ЗАЩИТЕ ТОВАРНЫХ ЗНАКОВ ТАМОЖЕННЫМИ МЕРАМИ ДЕКАБРЬ 2015 За последнее время и в печатных изданиях, и на телевидении, и в Интернете АВТОРЫ неоднократно поднимался вопрос о законности мер, принятых компанией "Тойота Мотор Корпорейшн" ("ТМК") по защите своих товарных знаков, нанесенных на запасные части авто...»

«Антон Орлов Бедствие номер раз Серия "Сказки Долгой Земли", книга 4 Текст предоставлен издательством "Эксмо" http://www.litres.ru/pages/biblio_book/?art=289582 Городская фэнтези-2010: Эксмо; Москва; 2010 ISBN 978-5-699-39844-7 Аннот...»

«After the Postsecular and the Postmodern: New Essays in Continental Philosophy of Religion и самая Его кровь в действительности оказываются тождественны, в противном случае можно было бы сказать вместе с апостолом: проповедь наша тщетна, тщетна и вера (...»

«ЭКО ЛИНИЯ СОФИЯ home collection Подушка 11(56)141Е 50х70 высокая 03(56)141Е 68х68 22(56)341 140х205 Одеяло легкое 20(56)341 172х205 26(56)341 200х220 Наполнитель подушек: волокно натурального происхождения Smartcel™ sensitive / сверхтонкое силиконизированное полиэфирное микроволокно "Лебяжи...»

«СОЧИНЕНІЯ М.Ю. ЛЕРМ ОН ТО ВА. П Е Р В О Е П О Л Н О Е И ЗД А Н ІЕ В.. РИ Х Т Е РА ПОДЪ РЕДАКЦІЕЮ ТО Ъ ТРЕТІЙ. М ПОЭМЫ И БИБЛІОГРАФІЯ. М О СКВА. Т н п о -л и т о гр а ф ін В..Р и х т е р ъ,Т в е р с к а я,д о м ъ Т а л а л а е в о й. 1891. Беч со стали ФА Брок...»

«УДК 821.113.5-312.4 ББК 84(4Нор)-44 Б 96 "UGLEN" by Samuel Bjrk С ерия " Масте ра саспенса" Перевод с норвежского Марии Назаровой Печатается с разрешения автора и литературного агентства Ahlander Agency. Оформление обложки Екатерины Елькиной Бьорк, Са...»

«УДК 377 П-26 Печатается по решению методического совета СНТ I Региональный конкурс учебно-методических разработок, обеспечивающих подготовку специалистов среднего звена "Работаем по ФГОС СПО": материалы конкурса. / составитель: Саркисян Т.А.; Сургут. нефт. тех-м – Сургут: РИЦ СНТ, 2016 – 121 с. В сборнике представлены некоторые материалы I Регионально...»

«Утверждены Постановлением Госкомсанэпиднадзора РФ от 11 марта 1996 г. N 6 Дата введения с момента опубликования 2.3.4. ПРЕДПРИЯТИЯ ПИЩЕВОЙ И ПЕРЕРАБАТЫВАЮЩЕЙ ПРОМЫШЛЕННОСТИ (ТЕХНОЛОГИЧЕСКИЕ ПР...»

«10/2014-100679(1) АРБИТРАЖНЫЙ СУД НИЖЕГОРОДСКОЙ ОБЛАСТИ Именем Российской Федерации РЕШЕНИЕ Дело № А43-614/2014 (объединено с делом № А43-457/2014) г. Нижний Новгород Резолютивная часть решения объявлена 23 июня 2014 года Решение в полном объеме изготовлено 31 июля 2014 года.Арбитражный суд Нижегородской области в составе: судьи Иванова...»

«Communication agency За что нас выбирают наши клиенты? За РАЗМАХ! Федеральные и региональные программы – наша специализация Мы прекрасно знаем нюансы каждого региона и готовы работать как избирательно, по каждому из них, так и комплексно, проводя программы на территории 100...»










 
2017 www.book.lib-i.ru - «Бесплатная электронная библиотека - электронные ресурсы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.