Windows Azure Cache Service (Preview)を使ってみる

どうも、この間のJAZUGイベントのLTで圧倒的多数ッ! の (´・ω・`)ショボーン をゲットした@kamebuchiです。

あれか、ストアアプリ動かなかったからか!そうなのか!

あ、しばやん大先生、アプリ作成ありがとうございました。( ´∀`)bグッ! 
うまい棒贈呈します。

というのは置いといて、この間リリースされたばかりのWindows Azure Cache Service(Preview)をさっそく使ってみたいと思います。

※一応、【祝】Azure日本DC前夜祭!★Japan Windows Azure User Group 3周年のLTフォローアップ的な何かです。
※あ、Cache ServiceはPreviewなので申請が必要です。(すぐにActiveになりますが)

Cache Service概要

Cache Serviceの特徴としては

  • 占有型の分散In-Memoryキャッシュ
  • ASP.NETのセッション状態やOutputページキャッシュなどのプロバイダーを提供
  • .NETのシリアライズできるマネージドオブジェクト(CLRオブジェクトやXML、バイナリなど)をキャッシュできる (カスタムのシリアライザもサポート)
  • Windows AzureとWindows Server AppFabricの両方で一貫した開発モデルが利用できる
  • 大きめのキャッシュサイズもサポート(プランによるけど最大150GB、150GB以上は要問合せ)
  • 期限切れに対応
  • アイテム単位などでキャッシュに変更があった際にコールバックを受けることができる
  • キャッシュアイテムのタグ付け等サポート
  • ローカルキャッシュのサポート
  • キャッシュアイテムの通知サポート
  • 圧縮通信のサポート
  • memcached互換(※今時点では未サポート。将来予定)

勘のいい人はわかりますが、Windows Server AppFabric (v1.1)互換なのでどちらでも利用可能です。ざっくりそんな感じで後は実際に触ってみてましょう。

と、その前にWindows Azure にはCache周りがいくつかあるのでおさらい。今提供されているのは以下の3つ(オンプレミス用いれると4つ)です。

  • Cache Service (Preview)
    • 今日リリースされた新しいCacheサービス
  • In-Role Cache (旧名称:Windows Azure Caching)
    • クラウドサービス上で動作するキャッシュ
    • Memcached互換
  • Shared Caching
    • マルチテナントなキャッシュサービス。2014年8月29日で廃止予定。※管理するためのSilverlightな管理ポータルは2014年3月31日で廃止予定
  • AppFabric v1.1 for Windows Server
    • オンプレミス用。

料金の詳細についてはこちら。Cache Serviceはプレビュー中の割引適用ですが、課金されるので注意が必要ですね。

ユニットはそのプランでの最小単位です。例えばBasicプランだと128MBのユニットを複数指定して128MB/256MB・・・1GBとなります。

基本的にユニット単位で時間当たりおいくら、というモデルです。プランを後で変更したりも可能なので安心です。

構成とか

Cache Serviceは実はCloudapp.net上で動作しているWorkerRoleなクラウドサービスと思われます。(推測)

まぁ実際に通信見てみるとCloudapp.netドメインで自分専用のクラウドサービスにつないでいるっぽいのでそうなんでしょう。(In-Role Cacheを使ったSaaSな感じですね)

 

メモリの割り当てなどもIn-Role Cacheと同じような考え方と思われます。

ちなみにプランによって割り当てられるインスタンスサイズは異なる(だろう)ので、それぞれのサイズに見合ったネットワーク帯域の制限などもあると思われます。※キャパシティプランニングが行えるExcelなどでみてもBasicはそんなにスループット出せない感じ。

 

Cache Serviceの作成

管理ポータルの新規メニューから「データサービス」-「CACHE」を選択してEndpoint名、リージョンなどを選択します。

とりあえずこれで完了。ダッシュボードの画面で現在の利用状況やエンドポイントURL、アクセスのためのキーなどを見ることができます。

Monitorタブは、ダッシュボードより詳しい各項目の状態をグラフで見ることができます。

他にも書き込みリクエスト数や破棄されたオブジェクト数などいろいろなメトリックを追加することができます。

Configureタブではキャッシュの設定を行うことができます。

各項目については以下の通りです。 (How to: Create a Cache for Windows Azure Cache Service (Preview)

項目 内容
Name キャッシュ領域の名称です。既定は”default”でBasicプランの場合は1つだけ。スタンダードまたはプレミアプランの場合は最大10個定義できます。
Expire Policy キャッシュの有効期限について3種類のポリシーから選択します。
Absolute … アイテム追加後、Timeで指定した期限(分)が経過すると削除されます。
Sliding … アイテムにアクセスがあるたびに経過時間がリセットされます。 最終アクセス時刻からTimeで指定した期限(分)が経過したアイテムは削除されます。
Never … 有効期限は無効です。強制的に破棄されるまでアイテムはキャッシュに残ります。Neverを指定した場合はTimeに0を設定する必要があります。
詳細はExpiration and Eviction for Windows Azure Cache Service (Preview)
Time (min) キャッシュにアイテムを保持する期限(分単位)です。Expire Policyと連動します。
Notifications キャッシュ操作が発生した時に非同期通知を受信するかどうかを設定します。通知はスタンダードまたはプレミアプランでのみ設定可能です。詳細はOfferings for Windows Azure Cache Service (Preview) and Notifications for Windows Azure Cache Service (Preview)
High Availability キャッシュの高可用性オプションの使用有無を設定します。有効にした場合、キャッシュのアイテムはコピーされ障害が発生した場合でもキャッシュ内のデータを保持できるようにします。
プレミアプランでのみ利用可能。障害発生時はDataCacheExceptionを受け取るので適当なリトライ処理が必要。
詳細はHigh Availability for Windows Azure Cache Service (Preview)
Eviction キャッシュサイズがメモリ上限に達した際に、最低使用頻度(LRU)アルゴリズムに基づいてアイテムを破棄するかどうかを設定します。有効にした場合、メモリ上限に達した場合はアイテムの有効期限に関係なく利用されていないアイテムから破棄されます。
無効にした場合、キャッシュのメモリが空くまで追加しようとすると例外を受け取ることになります。(スロットリングされます)

Timeで指定する有効期限はAdd/Put操作時に個別で指定することもできるみたいですね。

スケールタブではキャッシュのサイズ(ユニット数)やプランを変えることが出来ます。

 

使ってみる

Cache ServiceのクライアントライブラリはNuGetから取得することができます。

Windows Azure Cachingで検索するか、パッケージマネージャーのコンソールからインストールします。

PM> Install-Package Microsoft.WindowsAzure.Caching

使い方的にはDataCacheFactoryのGetCacheメソッドでサーバー上で作成した名前付きキャッシュを取得し、取得したキャッシュに対してPut/AddやGetでアイテムを操作する感じです。

またFactoryクラスにDataCacheFactoryConfigrationを渡すことで明示的にサーバーや各設定を行うことができます。(指定しない場合はApp.configやWeb.configを見る感じ)

var cacheconfig = new DataCacheFactoryConfiguration()
                  {
                  AutoDiscoverProperty = new DataCacheAutoDiscoverProperty(true, "buchizo.cache.windows.net"),
		SecurityProperties = new DataCacheSecurity(@"<Key>", false)
                  };

using (var factory = new DataCacheFactory(cacheconfig))
{
	var cache = factory.GetCache("default");
	cache.Put("test", "testvalue");
	Console.WriteLine(cache.Get("test"));
}

 

レイテンシの測定例

せっかくなのでレイテンシを測ってみたいと思います。 ※スループットについては環境準備したりするのが大変だったので割愛。

とりあえずクライアント側のコード。

Console.WriteLine("maxConnectionToServer: " + cacheconfig.MaxConnectionsToServer);
var stamp = "REG" + DateTime.Now.ToString("HHmmss");
Console.WriteLine("Stamp: {0}", stamp);
factory.GetCache("default").CreateRegion(stamp);

var cache1 = factory.GetCache("default");
for (int i = 0; i < int.Parse(maxcount); i++)
{
		 var st = new Stopwatch();
		 var key = string.Format("key{0}{1:D10}", stamp, i);
		 var value = "value" + i;
		 st.Start();
		 cache1.Put(key, value, stamp);
		 st.Stop();
		 Console.WriteLine("Put (ms),(Ticks)\t{0}\t{1}", st.ElapsedMilliseconds, st.ElapsedTicks);
}

for (int i = 0; i < int.Parse(maxcount); i++)
{
		 var st = new Stopwatch();
		 var key = string.Format("key{0}{1:D10}", stamp, i);
		 st.Start();
		 cache1.Get(key, stamp);
		 st.Stop();
		 Console.WriteLine("Get (ms),(Ticks)\t{0}\t{1}", st.ElapsedMilliseconds, st.ElapsedTicks);
}

指定件数Putでキャッシュに登録して、その後Getします。

テストした際の環境はこんな感じです。

  • クライアント : Cloud Service (L) , 4CPU / East Asia / SSLなし
  • キャッシュ : Standard, 1unit (1GB) / East Asia

 

5万件のPutとGetをした結果、だいたい以下のようになりました。

  • 5万件の平均 (Regionあり)
    • PUT : 1.10854 ms , 14186.76 Ticks
    • GET : 1.08548 ms , 13524.62 Ticks
  • 5万件の平均 (Regionなし)
    • PUT : 1.14544 ms ,15162.59 Ticks
    • GET : 1.12772 ms , 14786.97 Ticks

 

Regionは指定してもしなくても誤差ぐらいの感じですね。。 だいたい1ms~1.2msといったところでしょうか。後、データ量が少ないのでデータ量が増えるともう少し重くなると思われます。各自テストされたし。

またローカルキャッシュ(クライアント側のキャッシュ)を以下のように有効にした場合、ローカルキャッシュからの読み取りは平均1ms以下(91.8Ticksぐらい)です。

cacheconfig.LocalCacheProperties = new DataCacheLocalCacheProperties(1000000,TimeSpan.FromMinutes(5),DataCacheLocalCacheInvalidationPolicy.TimeoutBased);

※5万回Putしてその後5万回Get、さらに5万回Getした2回目の平均値(でないとローカルキャッシュに入らないので)

目的に応じてうまく組み合わせるといいですね。

 

注意点

ちなみにこのテストで使用したクライアント側はLインスタンスなのですが、maxConnectionsToServerは4になっていました。(自分のPCでは8)

なのでデフォルトは論理CPU数と同じということですね。コネクションプールもあるのでこのあたりは注意して設定する必要がありそうです。(コネクションなどに関する詳細はこちら

またRoleEntryPointなどでCache Serviceを使用する場合、Web.configが参照できないので自分でConfigがんばりましょう。

HighAvailabilityオプションを有効にした場合でも、インスタンス障害があるとエラーが返されます。なので適切にリトライなど行うようにしておきましょう。

あと今のところWindows環境用のクライアントしか提供されていないので注意が必要ですね。(Node.jsはEdge.jsがあるらしいけどそれがWindows用なので?)

 

キャパシティプランニング

必要なオブジェクトサイズや想定スループットを入力すると、どのプランが必要かなどを計算してくれるExcelです。以下のURLからゲットしましょう。

 

参考

MSDNに一通り全部書いています。

当日のLTの内容はこちら

広告

Windows Azure Cache Service (Preview)を使ってみる」への1件のフィードバック

  1. ピンバック: New Windows Azure Cache に関する留意点 - 松崎 剛 Blog - Site Home - MSDN Blogs

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中