Microsoft Windows Azure. Начнем с простого (или локальная разработка для «облака»). Часть 3

В двух предыдущих частях данного обзора (см. часть 1 и часть 2) мы познакомились с набором расширений для Microsoft Visual Studio, который позволяет разрабатывать приложения для Windows Azure. Мы обсудили процесс установки этих расширений и упомянули, что существует возможность локальной разработки для Windows Azure с использованием эмуляторов как самой платформы, так и облачного хранилища. Также мы посмотрели, из чего состоит «облачное» приложение и попробовали эмулятор Windows Azure в действии.

В этой части мы продолжим знакомство с созданием приложений в Windows Azure и обсудим жизненный цикл роли и объектную модель Windows Azure. Мы остановились на том, что Fabric – это основной компонент Windows Azure, отвечающий за управление виртуальными машинами и экземплярами ролей. Fabric, совместно с Fabric Controller отвечает за мониторинг виртуальных машин, балансировку нагрузки, восстановление после сбоев и другие важные для функционирования «облачной» среды операции. Для того, чтобы компоненты операционной системы могли следить за состоянием экземпляров ролей и самой виртуальной машины, в каждой виртуальной машине присутствует специальный компонент, называемый Fabric Agent.

Выше мы упомянули, что развертывание и старт экземпляра роли начинают ее жизненный цикл. И прикладная, и веб-роль базируется на классе RoleEntryPoint, который определен в пространстве имен Microsoft.WindowsAzure.ServiceRuntime.

AZLocal_16

Рис. Класс RoleEntryPoint

Как видно из приведенной иллюстрации, данный класс определяет 3 метода – OnStart() , OnStop() и Run() – именно они и являются основой жизненного цикла экземпляра той или иной роли. Все экземпляры прикладной роли должны содержать реализацию методов OnStart() и Run() , для веб-роли можно либо использовать реализацию стандартных методов, либо – методов, обеспечивающих жизненный цикл ASP.NET-приложений.

Метод OnStart()

Данный метод вызывает Windows Azure для инициализации экземпляра роли. Во время выполнения кода данного метода экземпляр роли имеет статус «Busy» (RoleInstanceStatus) и не получает внешнего трафика от балансировщика нагрузки. Этот метод следует использовать для выполнения инициализационных задач – например, создания обработчиков событий или запуска диагностики Windows Azure. Если данный метод возвращает значение true, это означает, что экземпляр роли успешно инициализирован и Windows Azure вызывает метод Run() данного экземпляра роли. Если же данный метод возвращает значение false, экземпляр роли немедленно завершает свою работу, без вызова завершающего кода.

Код, создаваемый по умолчанию в Visual Studio для метода OnStart() веб-роли выглядит так:

AZLocal_17

А для прикладной роли – так:

AZLocal_18

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

Метод Run()

Данный метод представляет собой «тело» сервиса в Windows Azure. Реализация по умолчанию запускает поток, который выполняется бесконечно. Когда метод Run() завершается, Windows Azure создает событие Stopping и вызывает его обработчик – OnStop() для выполнения завершающих действий перед тем, как перевести экземпляр роли в режим офф-лайн.

Код, создаваемый по умолчанию в Visual Studio для метода Run() прикладной роли выглядит так:

AZLocal_19

По понятным причинам метод Run() для веб-роли по умолчанию не реализован. Во-первых, веб-роль обычно реализует модель Request/Response (Запрос/Ответ) и не требует запуска бесконечно выполняющихся потоков. Во-вторых, в веб-роли можно использовать события жизненного цикла обычного ASP.NET-приложения – об этом чуть далее. В ряде случаев можно расширить функциональность веб-роли за счет реализации событий жизненного цикла Windows Azure – это может пригодиться, например, в тех случаях, когда мы хотим обойтись без дополнительной прикладной роли.

Метод OnStop()

Данный метод вызывается Windows Azure для выполнения завершающих действий. Действия, выполняемые в данном методе, должны укладываться в определенный тайм-аут – 30 сек., по истечении этого времени процесс завершается.. Одним из примеров использования метода OnStop() может быть сохранение состояния экземпляра роли в хранилище Windows Azure (например, в Azure Table). После повторного запуска экземпляра роли, в методе OnStart() мы считываем ранее сохраненное состояние и продолжаем работу с того места, где остановились перед перезапуском.

Жизненный цикл в веб-роли

Как мы отметили выше, вместо использования жизненного цикла Windows Azure, в веб-роли можно использовать события жизненного цикла ASP.NET-приложения. Это может быть полезно в тех случаях, когда вы переносите существующие ASP.NET-приложения в Windows Azure. Соответствующие ASP.NET-методы вызываются из основных методов класса RoleEntryPoint. Так, метод Application_ Start() вызывается сразу же после метода OnStart() , а метод Application_ End() – непосредственно перед вызовом метода OnStop() .

Изменения конфигурации

В пространстве имен Microsoft.WindowsAzure.ServiceRuntime есть класс RoleEnvironment, который задает события, возникающие перед и после изменениями конфигурации. Событие Changing возникает непосредственно перед применением конфигурационных изменений для данного экземпляра роли, а событие Changed – сразу же после применения конфигурационных изменений.

Пространство имен Microsoft.WindowsAzure.ServiceRuntime

Завершим наше знакомство с платформой Windows Azure обсуждением основных классов, реализованных в пространстве имен Microsoft.WindowsAzure.ServiceRuntime.

Класс

Описание

LocalResource

Описывает локальное хранилище, выделенное для сервиса

Role

Описывает роль, заданную как часть сервиса

RoleEntryPoint

Класс, задающий жизненный цикл экземпляра роли – инициализация, запуск и завершение

RoleEnvironment

Описывает среду Windows Azure, в которой выполняется экземпляр роли

RoleInstance

Описывает экземпляр роли

RoleInstanceEndPoint

Описывает «точку входа» для экземпляра роли (IP-адрес и порт)

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