キャッシュ通知機能

マイクロソフトの太田です。今回はVelocityのCTP3で導入されたキャッシュ通知機能を紹介します。Velocity CTP2までの機能の概要は、TechDays2009において解説していますので、前回のリンクを辿ってみてください。

キャッシュ通知機能は、アプリケーションプログラム内でコールバックを設定することで、キャッシュを定期的に監視し、変更があった場合にはコールバックが起動されるという仕組みになります。

そのために、まずキャッシュを作成する際に、New-Cacheのパラメータとして-NotificationsEnabledを指定します。これによって作成されたキャッシュはキャッシュ通知機能が有効になります。

このように設定したキャッシュに対して、以下のようなコールバックルーチンとそれを登録するメインを作成します。(Velocity_helpファイルから抜粋。一部修正済み)

 

操作時のコールバックの例

static void myCacheLvlDelegate(string myCacheName,

            string myRegion,

            string myKey,

            DataCacheItemVersion itemVersion,

            DataCacheOperation OperationId,

            DataCacheNotificationDescriptor nd)

{

     //display some of the delegate parameters

    Console.WriteLine("A cache-level notification was triggered at {0}", DateTime.Now);

    Console.WriteLine("    Cache: " + myCacheName);

    Console.WriteLine("    Region: " + myRegion);

    Console.WriteLine("    Key: " + myKey);

    Console.WriteLine("    Operation: " + OperationId.ToString());

    Console.WriteLine();

}

コールバックを登録するメインの例

static void Main(string[] args)

{

  // キャッシュサーバの設定

    DataCacheServerEndpoint server1 = new

       DataCacheServerEndpoint("localhost", 22233, "DistributedCacheService");

    DataCacheServerEndpoint[] servers = new  DataCacheServerEndpoint[1]{server1};

 

  // キャッシュファクトリの作成

  // 最後の引数が通知のポーリングの間隔(ここでは20秒に設定)

    DataCacheFactory cf = new DataCacheFactory(servers,true,true,  DataCacheLocalCacheSyncPolicy.TimeoutBased, 10, 20);

 

  // 通知の対象となるオペレーションをORで設定

    // ここではアイテムのAdd、Put、Removeと

    // リージョンのCreate、Clear、Removeに対して通知を受信

    DataCacheOperation allCacheOperations = DataCacheOperation.AddItem |

    DataCacheOperation.ReplaceItem | DataCacheOperation.RemoveItem |

    DataCacheOperation.CreateRegion | DataCacheOperation.ClearRegion |

    DataCacheOperation.RemoveRegion;

 

    DataCache cache = cf.GetCache("NC1");

  // 通知のためのコールバック関数の登録

  // 通知の単位としてはキャッシュレベル、リージョンレベル、アイテムレベルで設定可能

  // ここではキャッシュ全体における全操作で通知を認識する

    DataCacheNotificationDescriptor cb_desc =

                cache.AddCacheLevelCallback(allCacheOperations , myCacheLvlDelegate );

 

  // キャッシュへのアイテムの追加

    Console.WriteLine("Cache Added at {0}", DateTime.Now);

    cache.Add("K6", "V1");

    cache.Add("K7", "V2");

    Console.ReadLine();

}

 

これによりアプリケーションであるメインは設定した間隔(上記の例では20秒間隔)でキャッシュに対してポーリングを行い、キャッシュの変更を認識できます。実行時の例は以下のような状況になります。

Velocity (2) で説明しましたように、Velocity自体は可用性(Availability)に対しては、クラウドデータベースのインフラを引き継いだ、かなりしっかりとした基盤を持ちますが、キャッシュの基本的な制約は、一貫性(Consistency)の欠如です。キャッシュ通知機能は、この制約となるデータの一貫性に対する仕組みとなります。

Velocityの問い合わせが多かったために3回ほどVelocityが続きましたが、この後は当分の間(おそらくリリースされるまでの間)Velocityは扱いません。次回は違う話題になります。