В следующих нескольких статьях мы расскажем немного о том, как подключить приложение Windows Phone к облаку. Хотя многие из этих концепций могут быть применены к любому поставщику облачных услуг, для целей данного обсуждения мы сосредоточимся на Windows Azure.
В качестве примера мы рассмотрим приложение для обмена фотографиями Capture TechEd, которое было фактически создано в ходе подготовки к моей сессии Phone + Cloud на недавних мероприятиях TechEd NZ и TechEd Australia. Таким образом, приложение позволяет пользователю сделать фотографию и поделиться ею с другими пользователями приложения Capture TechEd. Последовательность событий следующая:
- Пользователь делает фотографию с помощью приложения Capture TechEd
- Пользователь вводит комментарий и присваивает фотографию определенной дорожке TechEd
- Фотография загружена в хранилище BLOB-объектов
- URL загруженной фотографии, информация о комментариях и треках добавляются в очередь для обработки
- Размер снимка уменьшен до 173 × 173 (размер стартовой плитки Windows Phone)
- Уведомление о тостах отправляется всем пользователям приложения, чтобы обновить плитку «Пуск» до новой фотографии.
В этом посте мы рассмотрим каждый из этих шагов на высоком уровне, чтобы вы поняли концепции. Затем в последующих публикациях мы подробно рассмотрим каждый шаг с кодом, который вам потребуется для реализации каждого шага.
Шаг 1: Фотосъемка с помощью камеры
Это довольно очевидно — вам нужно использовать CameraCaptureTask, чтобы сделать снимок с камеры и сохранить его в изолированном хранилище.
Шаг 2. Загрузите фотографию в хранилище BLOB-объектов.
Запись в хранилище BLOB-объектов Windows Azure относительно проста, поскольку состоит в том, чтобы сделать соответствующие вызовы HttpWebRequest
для передачи данных POST
по URL-адресу, на котором вы хотите хранить HttpWebRequest
. Однако для записи в хранилище BLOB-объектов вам потребуется ключ доступа, а не упаковка ключа доступа в приложении (не очень хорошая идея), Windows Azure поддерживает концепцию, называемую сигнатурами общего доступа. Вы можете думать о них как о токенах, которые могут быть выделены для предоставления приложениям разрешений на защищенные ресурсы. В случае приложения Capture TechEd мы будем использовать службу WCF, размещенную в Windows Azure, для выделения ограниченных по времени сигнатур общего доступа, которые предоставят приложению разрешения на запись в хранилище BLOB-объектов.

На рисунке 1 показано, как приложение телефона сначала запрашивает подпись общего доступа, а затем использует ее для POST
фотографии в хранилище BLOB-объектов.
Шаг 3: Загрузка задания на обработку
Здесь на самом деле два шага. Во-первых, получить список дорожек TechEd из ленты TechEd OData. После того, как пользователь выбрал, с какой дорожкой связывать фотографию, URL-адрес загруженной фотографии, комментарий и выбранная дорожка загружаются в другую службу WCF, снова размещенную в Windows Azure (рисунок 2).

Шаг 4: Добавление задания в очередь
В службе WCF загруженное задание добавляется в очередь Windows Azure (рисунок 3). Это очень быстрая операция, которая предотвращает любую блокировку на клиенте, пока он ожидает ответа.
Шаг 5: Обработка изображений
Рабочая роль (размещенная в Windows Azure) забирает каждое задание из очереди. Затем он получает соответствующую фотографию из хранилища BLOB-объектов, изменяет ее размер и сохраняет ее в хранилище BLOB-объектов. URL-адрес фотографии с измененным размером, комментарий и дорожка затем добавляются в новую запись в SQL Azure (рисунок 4). Из-за особенностей SQL Azure нежелательно, чтобы какое-либо интерфейсное приложение непосредственно к нему прикасалось. Это означает, что вы должны попытаться отделить ваш веб-сайт и сервисы от него, используя комбинацию Queue, Table и Blob Storage.

Шаг 6: Обновите стартовые плитки с помощью уведомлений
После добавления записи в SQL Azure все пользователи приложения получают уведомление о плитке для обновления фонового изображения «Пуск». Поскольку может быть большое количество потенциальных пользователей приложения, важно, чтобы процесс отправки этих уведомлений также был масштабируемым. Чтобы отправить отдельное уведомление плитки, приложение должно выполнить ChannelUri
Http POST
для ChannelUri
которое соответствует устройству, на которое вы хотите отправить уведомление. Если вы последовательно просматриваете каждое зарегистрированное устройство, это может занять очень много времени. Вместо этого добавьте все устройства в другую очередь, чтобы таким образом вы могли бы уменьшить количество рабочих ролей, чтобы оптимизировать время отправки уведомлений (рисунок 5).

Шаг 7: Получить последние фотографии
При запуске приложения Capture TechEd в приложении должен отображаться самый последний набор фотографий. На этом этапе мы будем использовать OData для представления этих фотографий (рисунок 6). В идеале вы захотите включить некоторую форму кэширования вывода, чтобы сделать это эффективным, в противном случае каждый запрос будет подключаться напрямую к SQL Azure, который мы уже обсуждали как большой нет-нет.

Резюме
Одна из самых больших проблем при работе с облаком заключается в том, что вам необходимо настроить подход к архитектуре вашего приложения. Если вы посмотрите на рисунок 7, который охватывает каждый из шагов в этом приложении, вы заметите, что он очень похож на спагетти. Здесь мы обменялись простотой архитектуры (например, служба WCF, созданная непосредственно в базе данных SQL Server) для повышения производительности. В частности, производительность телефонного приложения — на каждом этапе мы стремимся сократить время ожидания для пользователя для выполнения определенных задач.

Дополнительные мысли
Еще одна мысль, о которой стоит подумать, которая фактически не вошла в разговор, — это то, как телефонное приложение обращается к фотографиям после того, как они были изменены. В рамках операции изменения размера фотографии загружаются обратно в хранилище BLOB-объектов. Однако URL-адрес, который записывается в SQL Azure и впоследствии используется приложением телефона для извлечения измененных фотографий, фактически направляется через CDN. Использование CDN означает, что телефон загружает фотографию из ближайшего пункта распространения, который в Австралии находится в Сиднее, в отличие от Азии или США для основного хранилища BLOB-объектов. Это может дать значительно лучшую производительность, если только пользователю не повезло стать первым человеком, который получит доступ к измененному размеру фотографии, поскольку его сначала нужно будет загрузить из хранилища BLOB-объектов в CDN — разумеется, автоматически с помощью CDN!