Velocity における Partitioned キャッシュとローカルキャッシュの併用


環境 : Visual Studio 2010 (.NET Framework 4), Windows Server AppFabric

こんにちは。

時間がなくてすっ飛ばした Tech Ed 2010 セッション補足 として、つぎに、Windows Server AppFabric の Velocity に関する補足を記載します。(Tech Ed Japan 2010 の補足は、本説明で終了です。。。)

Tech Ed のセッションのさいごで、「紹介した手法を駆使し、データの性質によってチューニングをおこないましょう」と説明しましたが、ローカルキャッシュ (Local Cache) の設定をおこなう場合、通常は、以下のように構成ファイル (.config) に記述をおこなうため、「データの性質によって Partitioned キャッシュとローカルキャッシュを使い分けることができない (アプリケーション全体で、ローカルキャッシュを使うか、Partitioned キャッシュを使うか決まってしまう)」  と勘違いしてしまうかもしれません。

<dataCacheClient>
  <hosts>
    <!-- 使用するキャッシュサービスを列挙 (今回は1台) -->
    <host name="machine01" cachePort="22233"/>
  </hosts>
  <localCache isEnabled="true" sync="TimeoutBased" objectCount="100000" ttlValue="300"/>
</dataCacheClient>

しかし、ちゃんと、データの種類 (参照データ、アクティビティデータ、リソースデータ) によって、キャッシュの方法をわけることが可能です。

まず、上記の <dataCacheClient /> に設定されている内容は、以下のように引数なしでキャッシュファクトリーを作成した場合に適用されます。

var factory = new DataCacheFactory();

しかし、引数を指定することで、ファクトリーを作成する際に、それぞれ異なる構成 (DataCacheFactoryConfiguration) を設定できるため、扱うデータの種類 (参照データ、アクティビティデータ、リソースデータ) によって構成を変えることができるのです。

例えば、Tech Ed 参加者の皆さん向けに公開したローカルキャッシュのサンプルを少し書き換えて、以下のように実装してみましょう。

お伝えした通り、Tech Ed 参加者の方は、セッションで使ったサンプルを入手可能です。キャッシュの中身を確認するサンプル、通知 (Notification) をおこなうサンプルなど、説明した内容のサンプルをいくつか入れておきましたので、いろいろ実験してみてください。

using Microsoft.ApplicationServer.Caching;

// Factory1 は Partitioned Cache
var factory1 = new DataCacheFactory();

// Factory2 は Local Cache
DataCacheFactoryConfiguration conf = new DataCacheFactoryConfiguration();
conf.LocalCacheProperties = new DataCacheLocalCacheProperties(
    100000,
    new TimeSpan(0, 5, 0),
    DataCacheLocalCacheInvalidationPolicy.TimeoutBased);
var factory2 = new DataCacheFactory(conf);

// ループをして、中身が反映されるか 2 秒ごとに確認
while (true)
{
    // Foo1 の確認 (Factory1)
    var cache1 = factory1.GetCache("HogeHoge");
    var test1 = cache1.Get("Foo1");
    if (test1 != null)
        Console.WriteLine("Foo1 : {0}", (string)test1);

    // Foo2 の確認 (Factory2)
    var cache2 = factory2.GetCache("HogeHoge");
    var test2 = cache2.Get("Foo2");
    if (test2 != null)
        Console.WriteLine("Foo2 : {0}", (string)test2);

    System.Threading.Thread.Sleep(2000);
}

別のアプリケーションから、上記の Foo1、Foo2 のキーの値 (Value) を変更してみましょう。
すると、Foo1 のほうはすぐに上記のアプリケーションに反映されますが、Foo2 のほうはキャッシュが効いているため、しばらくしてデータ (値) が反映されるはずです。

セッションで説明した内容の繰り返しになりますが、このローカルキャッシュを使用する場合には、以下の点に注意してください。(特に、Session オブジェクトをどう使うかは、検討の必要があります。)

  • 上記の通りファクトリーごとに設定されるため、CacheFactory を再作成すると (破棄して作成しなおすと)、ローカルキャッシュは無効になります。これは特に、Web アプリケーションなどで、ポストバックのたびに CacheFactory を作成しているような場合に注意が必要です。(このような場合には、InProc の Session を使用するなどして、必要な場所に保持しておく必要があります)
  • 1 つのアプリケーションの中で、多数の CacheFactory を作成 (もしくは、繰り返し CacheFactory を作成) することは、パフォーマンスの観点で好ましくありません。CacheFactory の作成はオーバーヘッドの原因になるので注意してください。(もちろん、極端に遅くなるわけではありませんが、厳格なレスポンスが要求されるアプリケーションなどでは注意が必要です。)

以上で Tech Ed Japan 2010 のセッション T6-402 の補足は終了です。
今後もエンジニアに響く "熱い Tech Ed" を目指してさらに努力していきますので、来年も、スタッフ一同、お待ちしております。

Comments (0)

Skip to main content