環境 : 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 Cachevar factory1 = new DataCacheFactory();// Factory2 は Local CacheDataCacheFactoryConfiguration 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” を目指してさらに努力していきますので、来年も、スタッフ一同、お待ちしております。
Categories: Uncategorized
1 reply»