Azure In-Role Cache での通知
重要
Microsoft では、すべての新しい開発で Azure Redis Cache を使用することをお勧めします。 Azure Cache オファリングの選択に関する最新のドキュメントとガイダンスについては、「自分に適した Azure Cache オファリング」を参照してください。
Azure は、キャッシュ クラスターに対してさまざまなキャッシュ操作が行われたときに、アプリケーションで非同期の通知を受信できるキャッシュ通知を提供しています。 キャッシュ通知は、ローカルにキャッシュされた自動無効化も行います。
非同期キャッシュの通知を受信するには、キャッシュ通知のコールバックをアプリケーションに追加します。 コールバックを追加した場合、キャッシュ通知をトリガーするキャッシュ操作の種類と、指定した操作が発生した場合にアプリケーションで呼び出されるメソッドを定義します。 名前付きキャッシュを選択して、キャッシュ通知を有効にする必要があります。
キャッシュ通知のトリガー
これらのキャッシュ操作は、 DataCacheOperations クラスのメンバーによって定義されます。
地域の操作
地域に関する以下のキャッシュ操作が発生した場合、アプリケーションで通知を受信することができます。
CreateRegion: リージョンがキャッシュに作成されたとき。
ClearRegion: キャッシュでリージョンがクリアされたとき。
RemoveRegion: キャッシュからリージョンが削除されたとき。
項目操作
キャッシュされたオブジェクト (「キャッシュ内の項目」とも呼ばれています) に対して以下のキャッシュ操作が発生した場合、アプリケーションでキャッシュ通知を受信することがあります。
AddItem: 項目がキャッシュに追加されたとき。
ReplaceItem: キャッシュ内で項目が置き換えられる場合。
RemoveItem: キャッシュから項目が削除されたとき。
注意
これらの項目操作は単独で、地域内で発生したかどうかには依存していません。 コールバックの通知範囲を特定の地域に制限することを選択できます。 これについては、このマニュアルの「通知の範囲」で説明します。
通知の範囲
アプリケーションのアクティビティとニーズに応じて、キャッシュ全体のすべてのオブジェクトと地域に注意を払う必要がない場合があります。 通知の範囲をキャッシュレベルから、地域レベルや項目レベルに狭めることができます。 コールバックの追加時に選択する通知の範囲によって、どのキャッシュ通知を受信するかが大きく影響を受けます。
キャッシュ レベルでは、キャッシュ内のすべてのオブジェクトおよび地域からのすべてのキャッシュ操作の通知を、アプリケーションで受信することができます。 地域レベルでは、キャッシュ内の単一の地域やオブジェクトからのキャッシュ操作に関する通知だけを、アプリケーションで受信します。 項目レベルでは、単一のオブジェクトに関連するキャッシュ操作に関する通知だけを、アプリケーションで受信します。
通知範囲を指定するには上記の 3 種類の方法のいずれかを選択して、キャッシュ通知のコールバックを追加します。
AddCacheLevelCallback: すべてのリージョンと項目で発生しているリージョンベースおよび項目ベースのキャッシュ操作の通知を受け取る場合。
AddRegionLevelCallback: 1 つの特定のリージョンで発生しているリージョンおよび項目ベースのキャッシュ操作の通知を受け取る場合。
AddItemLevelCallback: 1 つの特定の項目で発生している項目ベースのキャッシュ操作の通知を受け取る場合。
Notification Order
キャッシュ クライアントが受信する通知の順番は、単一の地域というコンテキスト内で保証されます。 たとえば、RegionA
という名前の地域を作成したとします。 キャッシュ地域内に配置されるすべてのデータは同じ地域に制限されるため、RegionA
に関するすべてのキャッシュ操作 (地域レベルの通知範囲) は、相互に相対的な順番でキャッシュ クライアントに着信します。 他のキャッシュ ホストで発生した地域ベースおよび項目ベースの操作が、RegionA
で発生した操作に相対する順番で着信するとは限りません。
パフォーマンスに関しては、同じ地域に保存されない複数の地域またはオブジェクトに関する通知の順番は、保証できません。
項目イベントのバージョン情報は、 DataCacheItemVersion オブジェクトの形式で、パラメーターを使用してキャッシュ通知によって呼び出されたメソッドに version
渡されます。 この DataCacheItemVersion オブジェクトは、項目イベントをトリガーしたオブジェクトのバージョンに対応します。 CompareTo メソッドを使用すると、バージョンを比較して、どのキャッシュ操作が最初に行われるかを判断できます。
注意
バージョンの比較は、同じキーを使って指定された同じ項目のバージョンを比較した場合にのみ意味を持ちます。 異なるキーのバージョンを比較して順序を推測することはできません。 CompareTo メソッドは結果を返す場合がありますが、結果は同じキーのバージョンでのみ有効です。
ポーリング間隔
キャッシュ通知を使用する場合、アプリケーションは一定の間隔でキャッシュ クラスターを確認し、新しい通知を使用できるかどうかを確認します。 この間隔はポーリング間隔と呼ばれていますが、既定で 300 秒ごとに設定されています。 頻繁に書き込みを行うアプリケーションでこの値を小さく設定する際に、キャッシュに対する変更が頻繁に発生しない場合、大きな間隔の方が望ましいことがあります。 既定値 (300 秒) はほとんどの一般的なキャッシュにとって適切な値です。
ポーリング間隔はアプリケーション構成設定に秒単位で指定されます。 特定の間隔を指定するには、適切な構成ファイル内の pollInterval
要素の clientNotifications
属性を使用できます。 DataCacheFactoryConfiguration オブジェクトのプロパティを使用して、NotificationProperties
プログラムで特定のポーリング間隔を指定することもできます。
When Notifications Are Lost
キャッシュ ホストは、一定量のキャッシュ操作のみをメモリに保持できます。 そのため、キャッシュ ホスト キュー内の通知が削除される前に、一部のキャッシュ クライアントが通知を受信できない可能性があります。 また、他のクラスターが実行されている場合でも、キャッシュ サーバーのエラーが原因でデータが失われると、キャッシュ クライアントが通知を受信できない可能性があります。 これらのケースでは、障害通知を使うことで、キャッシュ クライアントは一部のキャッシュ通知が不足していることを検出できます。 アプリケーションでは、 AddFailureNotificationCallback メソッドを使用して、エラー通知を受信するコールバックを追加できます。 詳細については、「方法: エラー通知コールバックを追加する」を参照してください。
キャッシュ クライアントが失われた場合
通知の損失とキャッシュ クライアントの損失には重要な違いがあります。 アプリケーションで 1 つまたは複数の通知を喪失した場合、障害通知を利用することで、その喪失を認識することができます。 キャッシュ クライアント全体が停止、再起動、または失われた場合、通知はトリガーされません。 キャッシュ クライアントがクラスターに接続できない場合に、次にキャッシュを使用しようとすると、キャッシュ クライアントから例外がスローされます。 キャッシュ クライアントのイベント (キャッシュの作成や削除など) は通知で報告されません。 通知の登録後にキャッシュをサーバーから削除しても、通知の受信が停止されるだけです。 キャッシュが存在しないことと、キャッシュで操作が実行されていないことを区別することはできません。
注意
キャッシュ通知は、クラスター内のリージョンとキャッシュ アイテムのデータに関連する変更のみを報告します。クラスター自体のイベントについては報告しません。
キャッシュ通知の有効化
キャッシュ通知機能は、キャッシュ レベルのクラスター構成設定で構成されます。 通知は、キャッシュを初めて作成するときに、キャッシュのプロパティとして有効にすることができます。 新しいキャッシュを作成するときに、既定でキャッシュ通知機能は無効です。
キャッシュ通知を受信するためにコールバックを追加するには、アプリケーション構成設定は必要ありません。 アプリケーション構成設定を使って、特定のポーリング間隔を指定できます。 既定のポーリング間隔は 300 秒です。 別の期間が必要な場合は、XML ベースのアプリケーション構成ファイル内の要素を使用clientNotification
するか、DataCacheFactoryConfiguration オブジェクトのプロパティを使用してプログラムでNotificationsProperties
目的の間隔を指定します。
キャッシュ通知の使用
キャッシュ通知が有効になった後、キャッシュ通知の使用に関連する 3 つのタスクがあります。キャッシュ通知コールバックの追加、エラー通知コールバックの追加、キャッシュ通知コールバックの削除です。 これらの各タスクの手順については、この後説明します。