normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

アーキテクチャに影響しそうな 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の機能を利用するには、以下を実施する必要がある。

Servie Namespaceがアクティブになった画面については、以下を参考にしてほしい。

Windows Azure AppFabric Cachingを利用したアプリケーションを作成する

まずはVisual Studioを立ち上げ、新規にWebRoleを追加したWindows Azure Projectを作成してほしい(今回は手順を割愛する)。次に、AppFabric LabsのサイトからCacheのページに移動し、Cacheを利用する場合の設定を参照する。

「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


上記で確認して頂けると思うが、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版のサービスであるため、落とし穴のある技術かもしれないが、今後に期待したいところである。

参考サイト

*1:恐縮だが人聞きだ

*2:クラウド上でのSQL Server

*3:この時点でそろそろ説明が力尽きてきたので、気合いで読み取って頂けると有り難い…orz