はじめに
去る3月の震災を機に、インターネットそのものとともに“ クラウド” による情報供給におけるスケーラビリティや耐障害性、“ スマートデバイス” によるライブインフォメーションへのアクセスの進化が、改めて注目されました。普段あまりアクセスがないサイトに、アクセスが集中しダウンするサイトを、クラウドでミラーリングしてカバーされました。電話が麻痺する中、IP通信はダウンしなかったため、SkypeやTwitterが情報伝達手段として活躍しました。
今、“ クラウド” と“ スマートデバイス” を利用したアプリケーション・サービスは目覚ましい数で増えています。
本連載では、Microsoftが提供する選り取り見取りのサービス群からなるクラウド“ Windows Azureプラットフォーム” と、完成度の高いアップルの“ iOS” デバイスに焦点を当て、この2つを組み合わせたアプリケーション・サービス開発について、取り上げていきます。
初回となる本稿では、Windows AzureプラットフォームとiOS、それぞれの技術概要について紹介していきます。
Windows Azureプラットフォームについて
Windows Azureプラットフォームは、Microsoftが提供するコンピューティング、データベース、ストレージ、CDN、仮想ネットワークなどから成るクラウドサービス群です。
メインとなるアプリケーションをホストするためのクラウドサービス、Windows Azureコンピューティングは、目的に応じてWebロール、ワーカーロール、VMロールという、3つの“ ロール” に分かれています。
WebロールはIIS(インターネットインフォメーションサービス)をフロントとして動作するWebアプリケーションサーバにあたる機能を提供します。ワーカーロールは、Webロールとは別にバックグラウンド処理を担当させるホストになります。VMロールはWindows Server 2008 R2を仮想的に動作させるホストを提供します。
Windows Azureストレージとは何か
Azureプラットフォームにおけるスケーラビリティを持ち、耐久性に優れたストレージサービスで、テーブル、BLOB、キューの3つからなります。ストレージアカウントによって認証することでアクセスでき、REST APIが提供されています。
テーブルはフレシキブルにさまざまな構造のデータを保管することができるKey-Value Storeタイプのストレージです。従来のRDBを使いたい場合はSQL Azureデータベースを利用します。
BLOBは、巨大なバイナリデータを格納するためのストレージです。各データはコンテナでグループ化され、コンテナレベルでアクセスポリシーを設定することができます。
キューは、主にロール間のプロセスを仲介するメッセージをいわゆる待ち行列形式で溜めるストレージです。各ロールは、キューにメッセージを送信したり、ウォッチして受信することで処理を実行したりします。
iOSとは何か
AppleがiMac、MacBookとともに開発してきたMac OS XをベースにしてiPad、iPhone、iPod touch上で稼働するOSです。そのためこれらの端末は、ご存知のとおり“ iOSデバイス” と呼ばれています。 iOSのアーキテクチャは、図1 のように下位から順にCore OS、Core Services、Media、Cocoa Touchの4つのレイヤで構成されます。Core OSのシステム部分はOS Xとカーネルやネットワーク、ファイルシステム、スレッドなど多くのテクノロジーを共有しています。
図1 iOSアーキテクチャ
iOS SDKとは
iOS上で動くアプリケーションは、無償で提供されているiOS SDKによって開発できます。iOS SDKにはネイティブアプリケーションの実装、コンパイル、テスト、プロファイリングを行うためのツールが含まれています。それら機能のほとんどは統合開発環境のXcodeに集約されています。Objective-C言語を使って、前述のアーキテクチャを構成する各レイヤのためのフレームワークを利用することで、多種多様なアプリケーションを開発することができます。
Cocoa TouchはMacで実現しているUIとともにiOSデバイス上でインタラクティブなUIを実現するためのフレームワークで、iOSアーキテクチャの最上位レイヤになります。Cocoa TouchはModel-View-Controllerに基づいた設計になっているため、Cocoaフレームワークの経験がある開発者だけでなく、WebアプリケーションやRIAの経験が多い開発者でも、比較的スムーズに開発が行えるでしょう。
iOSアプリケーションの設計
iOSアプリケーションがどのように設計、構築されているか、紹介していきましょう。図2 は、クラウドサービスに依存するアプリケーションの一般的な構成を表します。
図2 iOSアプリケーション内の構成
iOSアプリケーション内はMVCで構築されていますが、Webアプリケーションに慣れた開発者にとっては、MVCというよりも、RIAクライアントにおけるMVVMに近いと感じるかもしれません。
ViewはUIWindow(アプリケーションの画面) 、UIView(各ビューと配置されたテキストボックス、ボタンなど)からなります。これらはXcode内のInterface Builderというツールによって視覚的に定義することができ、その内容はXMLベースのXIBファイルとして保存されます。
Modelはデータエンティティです。クラウドのサービスにネットワークアクセスしたり、ローカルストレージにアクセスしたりして、データを取得したり保持します。
Controllerは、主にViewとModelの仲介役です。Viewの各パーツは“ アウトレット” という方法でControllerに接続します。またControllerのメソッドは、“ アクション” として、Viewのパーツに対するユーザ操作にリンクします。ユーザの操作に反応して、View間の処理や、必要に応じてModelからデータを取得して、Viewに値をセットすることで画面更新を行います。端末のロックといったサスペンドが発生するようなアプリケーション自体へのイベントは、Application Delegateを介して処理します。
ControllerとModelは、Objective-Cのヘッダファイル(.h)と実装ファイル(.m)でコーディングします。
ModelからControllerへの通知は多くの場合、 DelegateパターンやBlockを使ったコールバックによって実装されます。Delegateパターンは画面間のロジックおいても使われます。また、完全に疎結合にしたいときは、通知センターによる通知によって実装することが可能です。
Viewを構成するパーツの属性に、直接Modelの持つデータの値をバインディングするような機能はありません。Mac OS XにはCocoaバインディングがありますが、iOSではサポートされていません。
Azureプラットフォームによるクラウドサービスの構成
主にWindows AzureのWebロールとワーカーロール、そしてAzureストレージを利用した一般的なシステム構成を紹介します。
図3 Windows Azureプラットフォーム内の構成
図3 では、Windows Azure内における処理の流れとして、Webロールからワーカーロールに矢印が描かれています。これは大まかには、Webロールでサービスクライアントから受け取ったデータを、バックグラウンドでワーカーロールが扱う、という流れを示します。ただし、それぞれのロールから、Azure ストレージの各サービスへ操作が定義されているとおり、命令はキュー、データはテーブル、BLOBを介して渡すことで、Webロールからワーカーロールへの流れは、疎結合に実現されます。
まずWebロールはデータの種類に応じて、テーブル、BLOBに格納し、ワーカーロールに委譲したい処理とその対象データへのポインタをメッセージとしてキューに送ります。ワーカーロールはキューに溜まるメッセージをウォッチしており、その内容からテーブル、BLOBからデータ取得して、生成したデータを再びテーブル、BLOBに格納したり、別のサービスを呼び出したりします。
このため、ロールの数をWebロールとワーカーロールそれぞれの処理に対しての負荷に応じて、スケールアウトすることが可能になります。
iOSデバイスは、データの送信や動的に生成されるデータの取得は、Webロールに対してアクセスして行い、写真のイメージのように静的データの取得は、Azureストレージに直接取りに行くのが一般的です。
まとめ
Windows Azureというクラウド、そしてスマートデバイスのiOSのアーキテクチャについて説明してきました。次回以降は、より具体的にクラウド(Windows Azure)+スマートデバイス(iOS)のアプリケーションの開発について、紹介していきます。
Windows Azure プラットフォームは無料で試すこともできますし、MSDNサブスクリプション会員であれば、相当量の利用が無償で可能になります。これを機会に試してみては、いかがでしょうか。