テスターですが何か?

ホビープログラマ略してHPです

【日本語訳】Building Windows Azure Applications with the Caching Service part7

leave a comment »

このエントリーはMSDNのチュートリアル「Building Windows Azure Applications with the Caching Service」の「Task 2 – Measuring the Data Access Latency」の日本語訳になります。このコンテンツ、日本語訳全体については、こちらのエントリーを参照してください。

Task 2 – Measuring the Data Access Latency

このエントリーでは、UIからキャッシュの利用を制御し、SQL Azureからのデータ取得にかかる時間とキャッシュからの時間を比較できるように、データ取得時間を表示するようにアプリケーションを変更します。

1.ControllerフォルダにあるHomeController.csファイルを開き、Indexアクションメソッドへ移動します。ProductsRepositoryをインスタンス化しGetProductsメソッドを呼び出している行へ移動し、以下のようにコードを置き換えます。

public ActionResult Index()

{   

    // Services.IProductRepository productRepository = new Services.ProductsRepository();

    //var products = productRepository.GetProducts();

 

    bool enableCache = (bool)this.Session["EnableCache"];

    // リポジトリから商品情報を取得し、経過時間を計測する

    Services.IProductRepository productRepository = new Services.ProductsRepository(enableCache);

    Stopwatch stopWatch = new Stopwatch();

    stopWatch.Start();

 

    var products = productRepository.GetProducts();

    stopWatch.Stop();

 

    // add all products currently not in session

    var itemsInSession = this.Session["Cart"] as List<string> ?? new List<string>();

    var filteredProducts = products.Where(item => !itemsInSession.Contains(item));

 

    IndexViewModel model = new IndexViewModel()

    {

        Products = filteredProducts

    };

 

    return View(model);

}

2.同じメソッドにて、IndexViewModelインスタンスを生成している箇所へ移動し、以下のコードに置き換えます。

public ActionResult Index()

{

    bool enableCache = (bool)this.Session["EnableCache"];

    // リポジトリから商品情報を取得し、経過時間を計測する

    Services.IProductRepository productRepository = new Services.ProductsRepository(enableCache);

    Stopwatch stopWatch = new Stopwatch();

    stopWatch.Start();

 

    var products = productRepository.GetProducts();

    stopWatch.Stop();

 

    // add all products currently not in session

    var itemsInSession = this.Session["Cart"] as List<string> ?? new List<string>();

    var filteredProducts = products.Where(item => !itemsInSession.Contains(item));

 

    IndexViewModel model = new IndexViewModel()

    {

        Products = filteredProducts,

        ElapsedTime = stopWatch.ElapsedMilliseconds,

        IsCacheEnabled = enableCache,

        ObjectId = products.GetHashCode().ToString()

    };

    return View(model);

}

Note: ViewModelに追加された内容は、リポジトリから商品情報の取得にかかった時間(フラグでキャッシュから取得したかどうかを判断)、GetProductsメソッドから返された一意識別情報です。このオブジェクトIDを画面に表示して、リポジトリから返されたインスタンスが変更されたかどうかを判断します。この機能は後のエントリーのローカルキャッシュで使用します。

3.HomeControllerに新しいアクションメソッドを追加し、UIからキャッシュを有効/無効に制御できるようにします。

public ActionResult EnableCache(bool enabled)

{

    this.Session["EnableCache"] = !((bool)this.Session["EnableCache"]);

    return RedirectToAction("Index");

}

Note: 理想を言えばこのコードはWindows Azureでテストすべきです。コンピュートエミュレーター上でアプリケーションを実行している場合は、SQL AzureへのアクセスもWindows Azure Cachingへのアクセスもローカルネットワークの外側へリクエストを要求しています。地理的な影響によって、両方のリクエストは高いレイテンシー(時間がかかる)結果になり、キャッシュ/キャッシュを利用しないというシナリオの違いよりも大きくなってしまうかもしれません。(キャッシュを利用したほうが時間がかかる)アプリケーションをWindows Azureへデプロイすると、Windows Azure Caching ServiceとSQL Azureと同じデータセンターに配置することができるため、レイテンシーは低くなり結果が意図したものになるはずです。

6.アプリケーションを開始すると、初期状態ではキャッシュは利用不可能な状態になっています。ページを更新すると、商品情報の取得にかかった時間がページ下部に表示されます。リストの先頭の項目から、アプリケーションが商品情報をデータソース(SQL Azure)から取得したことが分かります。

Note: ページの読み込み速度が安定するまで、何度かページを更新してください。ASP.NETがページをコンパイルするため、初回リクエスト時の取得時間には大きな値が表示されるかもしれません。

image

図15.キャッシュを利用せずにアプリケーションを実行

7.商品情報の上部に表示されているオブジェクトIDに注目してください。ページをリフレッシュする毎に変更されるため、リポジトリから異なるオブジェクトを返していることが分かります。

8.そして、「Yes」をクリックしてキャッシュを有効にしてページの更新完了を待ちます。商品リストの最初の項目から、まだデータがキャッシュされていないため、商品情報をSQL Azureから取得していることが分かります。

9.「Product」をクリック、またはページを更新します。すると、アプリケーションはWindows Azure Cachingから商品情報を取得し、処理時間が短くなります。商品リストの最初の項目にキャッシュからデータを取得したことが表示されているか確認してください。

image

図16.キャッシュを有効にしてアプリケーションを実行

次は「Task3 – Enabling the Local Cache」です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。