アーキテクチャに影響しそうな Windows Azure AppFabric Caching機能を試してみる
今回はWindows Azure AppFabricが提供する機能の一つであるCaching機能について紹介しようと思う。CTP版の機能は色々と利用可能だが、私見では「VM Role」「Windows Azure Connect」に続いて、Windows Azure Platform上でアプリケーションを作成する際のアーキテクチャに大きな影響を与えるであろう重要な機能である。是非一緒に学習して頂きたい。
また、概要が理解しやすいようにまとめたLT資料を id:waritohutsu:20110123:1295764343 に公開した。合わせてご参照頂きたい。
なぜAppFabric Caching機能が美味しいのか?
Windows Azure AppFabric Caching機能を見たとしても「別にキャッシュしてくれる程度だとなぁ…、Table Storage使う&インスタンス数増やしてスケールアウトすればいいんじゃないの?」という方もいると思う。もちろん通常のキャッシュ機能として利用する場合にも十二分に便利なのだが、Windows Azure Platformで同機能を利用する場合、以下の二観点で大きなメリットが得られる。
- 1. Web RoleのセッションデータをAppFabric Cachingに入れることで、容易にスケールアウトが実現できる
- 2. クラウド側からオンプレミス側に接続した際に取得したデータをキャッシュし、レスポンスタイムを大幅に向上できる
また、AppFabric Cachingは以下の特徴が存在する。詳細な内容については、是非 参考サイト の 「PDC10セッション > Introduction to Windows Azure AppFabric Caching」を参照して頂きたい。
- オブジェクトサイズに制限が無い
- シリアライズコストが発生しない
Windows Azure Platform上でのセッションデータの取り扱い
今回紹介したいのは、「1. Web RoleのセッションデータをAppFabric Cachingに入れることで、容易にスケールアウトが実現できる」機能だ。今までWindoows Azure Platform上でのセッションデータを取り扱う際に存在した課題を、以下の様に容易に解決できる。
オンプレミス側でスケールアウトを実現する場合にも同様の問題に直面することがあり、SQL Serverにセッションデータを格納することが多いらしい*1。ご存じのとおり、Windows Azure PlatformにもSQL Azure*2が存在するが、現時点でSQL AzureはAgent機能をサポートしていない。つまり、自力でSQL Azureに格納された不要なセッションデータを消さなければならないということだ。
AppFabric Caching以外を利用した手法のメリデメ整理は、参考サイト 「Windows Azure 上での Web アプリケーション開発基礎」 で公開されているスライドのP.87に記述されている。ぜひそちらも参照して頂きたい。
Windows Azure AppFabric Cachingを利用するために必要な環境
現在CTP版であるWindows Azure AppFabricの機能を利用するには、以下を実施する必要がある。
- Windows Azure AppFabric SDK V2.0 CTP – October Update をインストールする
- AppFabric Labs で新規にService Namespaceを作成し、Activeとする
Windows Azure AppFabric Cachingを利用したアプリケーションを作成する
まずはVisual Studioを立ち上げ、新規にWebRoleを追加したWindows Azure Projectを作成してほしい(今回は手順を割愛する)。次に、AppFabric LabsのサイトからCacheのページに移動し、Cacheを利用する場合の設定を参照する。
- AppFabricのアセンブリ参照を追加
「C:\Program Files\Windows Azure AppFabric SDK\V2.0\Assemblies\Cache」に格納されたアセンブリに対し、以下の画像例に従って参照を追加する。
-
- Microsoft.ApplicationServer.Caching.Client.dll
- Microsoft.ApplicationServer.Caching.Core.dll
- Microsoft.Web.DistributedCache.dll
- Microsoft.WindowsFabric.Common.dll
- Microsoft.WindowsFabric.Data.Common.dll
- Web.Configに設定を追記
Web.Configに張り付けるための設定が表示されているので、こちらをそのままWeb.Configに転記すればよい。この際、Web.Configの記述に対して「警告」や「メッセージ」が表示されるが、無視して作業を続けて頂きたい。
<configSections> <!-- Append below entry to configSections. Do not overwrite the full section. 以下二つのタグは、<configuration>タグ直後に張り付けることをオススメする --> <section name="dataCacheClient" type="Microsoft.ApplicationServer.Caching.DataCacheClientSection, Microsoft.ApplicationServer.Caching.Core" allowLocation="true" allowDefinition="Everywhere"/> </configSections> <dataCacheClient deployment="Simple"> <hosts> <host name="[Service Namespace名をこちらに記述]" cachePort="22233" /> </hosts> <securityProperties mode="Message"> <messageSecurity authorizationInfo="[認証トークンをこちらに記述]"> </messageSecurity> </securityProperties> </dataCacheClient> <!-- If session state needs to be saved in AppFabric Caching service add the following to web.config inside system.web こちらは<system.web>タグ直後の貼り付けがオススメ --> <sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider"> <providers> <add name="AppFabricCacheSessionStoreProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cacheName="default" useBlobMode="false" /> </providers> </sessionState> <!-- If output cache content needs to be saved in AppFabric Caching service add the following to web.config inside system.web こちらは<sessionState>タグ直後の貼り付けがオススメ --> <caching> <outputCache defaultProvider="DistributedCache"> <providers> <add name="DistributedCache" type="Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider, Microsoft.Web.DistributedCache" cacheName="default" /> </providers> </outputCache> </caching>
- 検証用アプリケーションの作成
上記でWindows Azure AppFabric Cachingを利用する設定は完了したので、次に検証用のアプリケーションを作成する。以下のソースコードを参照して頂きたい*3。
-
- Default.aspx
<%@ Page Title="ホーム ページ" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebRole1._Default" %> <asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent"> </asp:Content> <asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent"> <h2> ASP.NET へようこそ! </h2> <p> ASP.NET の詳細については、<a href="http://www.asp.net" title="ASP.NET Web サイト">www.asp.net</a> を参照してください。 </p> <p> <a href="http://go.microsoft.com/fwlink/?LinkID=152368" title="MSDN ASP.NET ドキュメント"> MSDN で ASP.NET に関するドキュメント</a>を参照することもできます。 </p> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> <br /> <asp:Label ID="Label2" runat="server" Text="Label"></asp:Label> <br /> <asp:Label ID="Label3" runat="server" Text="Label"></asp:Label> </asp:Content>
-
- Default.aspx.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using Microsoft.WindowsAzure; using Microsoft.WindowsAzure.ServiceRuntime; namespace WebRole1 { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Label1.Text = RoleEnvironment.CurrentRoleInstance.Id; Label2.Text = Session.SessionID; if (Session["my_data"] == null) { Session["my_data"] = "最初にアクセスした時刻:" + DateTime.UtcNow; } Label3.Text = Session["my_data"] as string; } } }
動作結果
インスタンス数を5として、Compute EmulatorとWindows Azureポータルの両方で稼働確認を行った。稼働結果のスクリーンショットを取得したので確認して頂きたい。
- Compute Emulator + Full IIS
- Windows Azureポータル + Full IIS
上記で確認して頂けると思うが、Coumpte Service側では正常に動作するが、Compute Emulator+Full IIS側ではInProcと同じ動作をすることがわかる。
せっかくなので、検証結果を以下にまとめた。
動作環境 | 検証結果 |
---|---|
Full IIS + Coumpte Service | 正常に動作 |
Hosted Web Core + Coumpte Service | 正常に動作 |
Full IIS + Coumpte Emulator | InProcと同様の動作 |
Hosted Web Core + Coumpte Emulator | 正常に動作 |
まだCTP版のサービスであるため、落とし穴のある技術かもしれないが、今後に期待したいところである。
参考サイト
- PDC10セッション > Introduction to Windows Azure AppFabric Caching
- Microsoft MVP for Windows Azure @mkzn氏ブログ > Azure AppFabric Caching Service
- Microsoft Developer Network > Learn > Courses > Windows Azure Platform Training Course > Windows Azure AppFabric > Building Windows Azure Applications with the Caching Service > Exercise 1: Using the Windows Azure AppFabric Caching for Session State
- Windows Azure AppFabric Labs
- Windows Azure 上での Web アプリケーション開発基礎
- Windows Azure AppFabric Caching CTP版のハマりどころ