マルチデバイス + クラウドの実装レベルのアーキテクチャ

執筆者: 株式会社アークウェイ プリンシパル コンサルタント 福井 厚 氏

更新日: 2012 年 11 月 20 日

本記事では、マルチデバイス + Azure スターター キット (以下、スターター キット) を例として、「Azure アーキテクチャの視点」の章で取り上げた、「視点 2: マルチデバイス+クラウド」の議論 (PDF: 1.76 MB) を継続する形で、マルチデバイス+クラウドの実装レベルのアーキテクチャの概要について解説します。

ご注意ください】 本ページおよび各ドキュメントに記載されている会社名および製品名、サービス名、ロゴ等は、執筆時点のものです。


  • スターター キットとは
  • アーキテクチャの概要
  • ポイント 1: ユーザー インターフェース
  • ポイント 2: サービスの公開
  • ポイント 3: 認証
  • ポイント 4: Windows Azure SQL データベースの利用
  • 想定シナリオ
  • 将来の拡張性について

スターター キットとは

スターター キットは、Visual Studio 2012 用のプロジェクト テンプレートと、その解説を含む利用ガイドから構成されています。スターター キットのテンプレートを展開すると、Windows 8 の WinRT アプリ用プロジェクト、jQuery Mobile コードを含む ASP.NET MVC4 用プロジェクト、Windows Azure 用プロジェクトを含む Visual Studio ソリューションが生成されます。マルチデバイスに対応した Windows Azure のサービスを実装したい開発者は、スターター キットを利用することで、最初から動作するコードをベースに容易に開発を進めることができるようになっています。このスターター キットは、CSV カウンシルのディスカッションで取り上げた マルチデバイス+クラウドにおける Azure アーキテクチャの一実装例としても開発されました。

スターター キットにはマルチデバイス + クラウドのシナリオにおけるアーキテクチャのポイントとなるいくつかの実装が含まれています。この章では、認証やデータ アクセスなどポイントとなるアーキテクチャの実装について解説を行います。

スターター キットの詳細については、利用ガイドを参照してください。
スターター キット利用ガイドは以下の URL より入手できます。

http://msdn.microsoft.com/ja-jp/jj677081

アーキテクチャの概要

「Azure アーキテクチャの視点」の章で取り上げた、「視点2: マルチデバイス + クラウド」の「マルチデバイスに対応するための考慮点」では、設計レベルからの考慮すべきポイントを取り上げました。ここでは、スターター キットの実装を例として取り上げ実装レベルのアーキテクチャの概要とポイントを説明します。

下記の図にあるように、マルチデバイス + クラウドのアーキテクチャではクライアント側でデータ アクセスの要求を発行し、クラウド上のアプリケーションがサービスを公開してリクエストを受け取り、データソースをアクセスして取得したデータをクライアント側に送信します。クライアント側では送信されたデータを利用してクライアントのビューをレンダリングします。

マルチデバイス + クラウドのアーキテクチャ

ポイント 1: ユーザー インターフェース

スターター キットでは、Windows 8 で動作する WinRT アプリ、Windows Phone、iPad、iPhone Android などのデバイスで動作する HTML + jQuery Mobile アプリケーションのコードが予めテンプレートの中に用意されています。「Azure アーキテクチャの視点」の章の「マルチデバイス対応における指針」のセクションでも述べていますが、Windows Phone などのデバイスに対応するアプリケーションを開発する方法として、デバイス独自のプラットフォーム上で動作するネイティブ アプリケーションを開発する方法 (例えば iPhone の場合はiOS 上で動作するアプリケーションを Objective C で開発するなど) と各デバイスの Web ブラウザー上で動作する HTML + JavaScript をベースにした Web アプリケーションを開発する方法の 2 つの選択肢があります。

スターター キットでは、JavaScript をベースに各種モバイル デバイスに対応していている JavaScript ライブラリである jQuery Mobile を採用しています。jQuery Mobile を採用した理由は以下の通りです。

  • スターター キットはビジネス アプリケーションの開発を対象としており、企業内での開発を想定すると、各デバイスのネイティブ アプリケーションを開発し保守を行うのは負担が大きすぎると判断しました。jQuery Mobile を利用した HTML + JavaScript ベースのアプリケーション開発では、jQuery ライブラリが各デバイスの Web ブラウザーの違いをある程度吸収してくれるため、単一の Web アプリケーションで各デバイスに対応することが可能です。

スターター キットには、Windows 8 上で動作する WinRT アプリも含まれています。こちらは Windows 8 上で動作するネイティブ アプリケーションの例となっています。Windows 8 上で動作するネイティブ アプリケーションの開発方法には、画面レイアウトに XAML を利用し、C# または VB で開発を行うスタイルと、画面レイアウトを HTML/CSS で行い、JavaScript で開発を行うスタイルが選択できます。スターター キットでは、HTML/CSS と JavaScript で開発を行うスタイルを採用しています。その理由は以下の通りです。

  • HTML、CSS、JavaScript など、これまでの Web アプリケーション開発の経験が活用できるため、新しい技術を一から習得することに比べて学習の負担が軽減できます。またマルチデバイス対応の jQuery Mobile アプリケーションでも HTML + JavaScript ベースの開発を行うため、HTML、CSS、JavaScript に対するスキルが共通で使えるのも強みになります。

Windows 8 上で動作するネイティブ アプリケーションを加えた理由として、Web アプリケーション ベースのマルチデバイス対応アプリケーションとネイティブ アプリケーションの双方を提供する場合のサービスの利用について例示するという目的もあります。次のアーキテクチャ ポイントとしてサービスの公開について解説します。

ポイント 2: サービスの公開

マルチデバイス + クラウドのアーキテクチャでは、クラウド上にサービスを公開し、各デバイスから公開されたサービスを共通に利用する形態を取ります。現在では、様々な言語やツールからアクセスしやすいという理由で、多くの Web サービスが REST 形式で公開されています。各デバイスからサービスに対してリクエストを送信し、REST 形式のサービスを提供する側は、送信された URL からリクエストの内容を解釈、実行し、クライアント側の要求に応じてデータを送信します。JavaScript ベースのアプリケーションの場合は、親和性が高いという理由で JSON 形式で送信することが一般的です。

スターター キットでは、.NET Framework が提供する WCF Data Services を利用して REST 形式のサービスを公開しています。また、リレーショナル データベースのアクセスには、ADO.NET Entity Framework を利用しています。スターター キットが、WCF Data Services と ADO.NET Entity Framework を選択した理由は以下の通りです。

  • .NET Framework が提供する WCF Data Services と ADO.NET Entity Framework を組み合わせることによってリレーショナル データベースに対する情報の取得、追加、更新、削除の処理をコーディングすることなく実行することができます。また WCF Data Services は OData のプロトコルをサポートしているので、クライアントから URL に検索条件等を指定してクエリを実行することができます。

より複雑な問い合わせや更新処理に対しても、WCF Data Services にカスタム オペレーションを追加することによって対応することができます。以下にカスタム オペレーションの例を記述します。

//Win8starterkit.svc.cs より抜粋
[WebGet]
public IQueryable<Products> ProductsById(string categoryId)
{
   var query = from u in CurrentDataSource.Products.Include("Categories")
         select u;
   if (!string.IsNullOrEmpty(categoryId))
   {
         query = query.Where(e => e.CategoryId.Equals(categoryId));
   }
   return query;
}

カスタム オペレーションを追加することによって、より自由度の高いクエリを実装することができます。

クラウドで提供される REST 形式のサービスはクライアント側から JavaScript によって呼び出されます。スターター キットでは、マルチデバイスに対応した jQuery アプリケーションから jQuery.ajax メソッドを利用して非同期にクラウド上の REST サービスを呼び出す実装を行っています。

//index.chtml より抜粋
var getCategories = function (e) {

   $.ajax({
      url: "../Services/Win8StarterKit.svc/Categories()",
      type: "GET",
      dataType: "JSON",
      contentType: "application/json; charset=utf-8",
      success: function (result) {
         $.each(result.d, function (index, value) {
            //... 省略
      },
      error: function (result) {
         alert(result.responseText);
      }
   });
};

同様に Windows 8 上で動作する WinRT アプリの場合も、WinJS.xhr メソッドを利用して同じサービスを呼び出しています。

//groupedItems.js より抜粋
WinJS.xhr({
   url: url,
   headers: {
      "Accept": "application/json" //結果データの形式の指定
   }
}).then(
   // サービスの処理が成功した場合に実行される関数を定義します。
   function (xhr) {
      // 結果を取得し、データ設定用のオブジェクトを生成します。
      //省略
   },
   function (xhr) {
      StarterKit.Services.handleDataServiceError(xhr);
   }
);

このように共通のサービスを利用させることで、クラウド側のサービスに対する保守の負担も軽減させることができます。

ポイント 3: 認証

「Azure アーキテクチャの視点」の章の「視点 2: マルチデバイス + クラウド」のセクションでも取り上げましたが、マルチデバイス + クラウドでは認証もポイントのひとつとなります。企業内や企業間での利用を想定した場合、多くの場面で認証が必要となります。クラウド側でデータのアクセスを要求してきたクライアントに対して認証を行い、データが不正にアクセスされないことを保証する必要があります。

スターター キットでは、 クラウド サービス ベンダーが企業向けにサービスを公開する場合に最も一般的と考えられるフォーム ベースの認証方式をサポートしています。.NET では、この目的のために ASP.NET メンバーシップの機能が提供されていますので、スターター キットでもこの機能を利用しています。ASP.NET メンバーシップには、アカウントの新規登録やログイン、ログアウト、パスワード変更など豊富な機能が予め提供されています。スターター キットに含まれる jQuery Mobile ベースのマルチデバイス用アプリケーションでは、ASP.NET MVC4 のログイン ページを使用することで ASP.NET メンバーシップの機能をそのまま利用しています。

Windows 8 上で動作する WinRT アプリの場合は WinJS.xhr メソッドから認証用のサービスを呼び出す必要があるため、ASP.NET メンバーシップをサービス経由で利用しています。

//login.js より抜粋
var url = StarterKit.Settings.app.serviceRoot +
         StarterKit.Settings.app.authUrl + "/Login";

WinJS.xhr({
   type: "POST",
   url: url,
   headers: { 'content-type': 'application/json' },
   data: JSON.stringify(data)
}).then(
   function (xhr) {
      // 認証処理の結果を取得ます。
      var result = JSON.parse(xhr.responseText);
      // 認証処理が失敗していた場合は、処理を中断します。
      if (!result.d) {
         StarterKit.Services.showPopupMessage(
               "ユーザーIDまたはパスワードが違います。");
         return;
      }
      WinJS.Navigation.navigate(StarterKit.Settings.app.groupedItemsUrl);
   },
   function (xhr) {
      //エラー処理 ...
   }
);

認証にはフォーム認証以外にも様々な認証方式があります。アーキテクチャを設計する際は、想定しているサービスの対象者がどのような認証方式を利用可能か、またサービスの提供対象のデバイスがどのような認証方式をサポートしているかによって認証方式を選択する必要があります。「将来の拡張性について」のセクションでは、この点を取り上げて議論します。

ポイント 4: Windows Azure SQL データベースの利用

4 番目のアーキテクチャ ポイントは、データソースの選択です。Windows Azure 環境では、Windows Azure SQL データベース、TABLE ストレージ、BLOB ストレージなどのデータソースを選択することができます。スターター キットでは以下の理由から Azure SQL データベースを選択しています。

  • スターター キットはビジネス アプリケーション開発での利用を想定しているため、リレーショナル データベースの利用が適している
  • ASP.NET メンバーシップのストアとして Azure SQL データベースが利用可能なため、スターター キットでも ASP.NET メンバーシップのストアとして Azure SQL データベースを利用している

ビジネス アプリケーションであっても利用目的によっては、TABLE ストレージや BLOB ストレージの利用が有効な場合もあります。この点については、「将来の拡張について」のセクションで取り上げます。

想定シナリオ

マルチデバイス + クラウド アーキテクチャの背景としてスマート クライアントやタブレットなどリッチなユーザー インターフェースを提供できるデバイスが急速に広まり、企業側も BYOD (Bring Your Own Device) の有効活用に積極的になってきたことが挙げられます。このアーキテクチャの特長として

  • リッチなユーザー インターフェースを提供する各種デバイスが利用できる
  • クラウド上の大量のデータを効率よく検索、抽出して必要な情報をサービス経由でデバイスに取り込むことができる
  • クラウド上にデータを置くことで異なるデバイスから同じデータを参照、更新することができる

などを挙げることができます。このような特長を生かす以下のようなシナリオを想定することができます。

  • セールス パーソンが外出先で顧客との商談を行う際にこれまでの取引情報や商品情報をその場で示しながら商談を進める
  • 店舗のマネージャーが店頭で顧客対応しながら商品在庫の確認や予約を行う
  • オフィス、出先、自宅など場所やデバイスを選ばすに仕事をこなすワーク スタイルにマッチしたアプリケーションの開発

ほかにも様々なシナリオに適用できます。

将来の拡張性について

マルチデバイス + クラウドの実装レベルのアーキテクチャについてスターター キットを題材にして解説してきましたが、このセクションではスターター キットの実装には含まれていない機能に対する将来の拡張性について議論します。

スターター キットをベースに開発されたクラウド上のサービスやアプリケーションの利用が拡大、成長するにつれて様々な機能要件、品質要件が発生することは容易に想像できます。例えば以下のような成長の過程と品質要件の増大が予想されます。

  • 利用者数の増加に伴って処理能力を追加する必要がある
  • 利用者数の増加に伴って負荷を分散する必要がある
  • 利用者の増加に伴ってパフォーマンスを向上させる必要がある
  • データ量の増加に伴ってストレージ容量を増加する必要がある
  • インスタンスの障害に備えてデータの冗長化を行う必要がある
  • 災害に備えて地理的に分散する必要がある
  • 利用者のニーズに合わせて様々な形式の ID で認証する必要がある

このような品質要件に対して Azure が提供する様々なサービスを活用することが可能です。処理能力の追加や負荷分散ではインスタンスのサイズや数の増加を行うことで対応することができます。パフォーマンスの向上ではキャッシュや CDN の利用を検討します。例えば、頻繁に更新することのないマスター データや複雑な計算処理の結果を分散キャッシュに配置したり、画像データや動画データを BLOB ストレージに配置して CDN を有効活用したりすることが可能です。

ライフ ログや大量のシーケンシャルなデータは NoSQL タイプの テーブル ストレージを有効に活用することができます。またクレームベースの認証方式を採用することによって、ADFS を利用したフェデレーションや Google ID、Yahoo ID、Live ID などのオープンな ID を認証に利用することができるようになります。
このようにサービスやアプリケーションの成長に合わせて、アーキテクチャも成長させていくことになります。スターター キットをベースに、そのようなアーキテクチャを含むテンプレートを追加、保守することにより、将来に渡って有効な資産化を行うことが可能となります。


福井 厚 氏は株式会社アークウェイのプリンシパル コンサルタントであり、Windows Azure を活用した企業向けシステム開発のコンサルティング、トレーニングなどを行っています。アークウェイ入社前は外資系 SIer にてソリューション アーキテクトとして NET による企業向けフレームワークの構築などをリードしていました。2008 年に Microsoft Certified Architect に認定されています。

ホームページ: 株式会社アークウェイ
Blog: archway blog

ページのトップへ