エクスポート (0) 印刷
すべて展開

同時実行モデル (Azure Cache の In-Role Cache)

更新日: 2014年9月

noteメモ
アプリケーションに対して適切な Azure Cache サービスを選択するためのガイダンスについては、「どの Azure Cache を利用すればよいですか。」を参照してください。

このキャッシュ アーキテクチャでは、クライアントに適切なネットワーク アクセスと構成設定があれば、あらゆるキャッシュ クライアントがキャッシュされているあらゆるデータにアクセスできます。この場合、同時実行が難しくなります。

アプリケーションで同時実行の問題に対処するために、オプティミスティック同時実行モデルとペシミスティック同時実行モデルがサポートされます。

オプティミスティック同時実行モデルでは、キャッシュされたオブジェクトに対する更新はロックされません。代わりに、キャッシュ クライアントがキャッシュからオブジェクトを取得するとき、そのオブジェクトの現行バージョンが取得され、格納されます。更新が必要になると、キャッシュ クライアントはオブジェクトの新しい値と格納されているバージョン オブジェクトを送信します。送信されたバージョンがキャッシュにあるオブジェクトの現行バージョンに一致する場合にのみ、オブジェクトが更新されます。オブジェクトが更新されるたびにそのバージョン番号が変わります。これにより、更新時に他のユーザーの変更に上書きをしないようにすることができます。

このトピックの例は、オプティミスティック同時実行がデータの一貫性を維持するしくみを図示しています。

この例では、2 つのキャッシュ クライアント (cacheClientAcacheClientB) は、同じキー RadioInventory を持つ、キャッシュされている同じオブジェクトを更新しようとします。

タイム 0:両方のクライアントが同じオブジェクトを受け取ります

タイム 0 (T0) では、両方のキャッシュ クライアントが DataCacheItem クラスをインスタンス化し、更新を意図するキャッシュ済みオブジェクトと、バージョンやタグの情報など、そのキャッシュ済みオブジェクトに関連付けられている追加情報を取得します。これを次のコード例に図示します。

'cacheClientA pulls the FM radio inventory from cache
Dim clientACacheFactory As DataCacheFactory = New DataCacheFactory()
Dim cacheClientA As DataCache = _
        clientACacheFactory.GetCache("catalog")
Dim radioInventoryA As DataCacheItem = _
        cacheClientA.GetCacheItem("RadioInventory")

'cacheClientB pulls the same FM radio inventory from cache
Dim clientBCacheFactory As DataCacheFactory = New DataCacheFactory()
Dim cacheClientB As DataCache = _
       clientBCacheFactory.GetCache("catalog")
Dim radioInventoryB As DataCacheItem = _
        cacheClientB.GetCacheItem("RadioInventory")

noteメモ
この例では、DataCacheItem オブジェクトを取得する GetCacheItem メソッドを使用してバージョン情報を取得していますが、Get メソッドを使用し、取得するキャッシュ項目に関連付けられている DataCacheItemVersion オブジェクトを取得することもできます。

タイム 1:最初の更新が成功します

タイム 1 (T1) では、cacheClientA は、キャッシュ済みオブジェクト RadioInventory を新しい値で更新します。cacheClientAPut メソッドを実行すると、RadioInventory キャッシュ項目に関連付けられているバージョンがインクリメントします。この時点で、cacheClientB のキャッシュ項目が古くなります。これを次の例に図示します。

'at time T1, cacheClientA updates the FM radio inventory
Dim newRadioInventoryA As Integer = 155

cacheClientA.Put("RadioInventory", newRadioInventoryA, _
                 radioInventoryA.Version)

タイム 2:2 番目の更新が失敗します

タイム 2 (T2) では、cacheClientB は、古くなってしまったバージョン番号を使用し、キャッシュされたオブジェクト RadioInventory を更新しようとします。cacheClientA からの変更が上書きされないように、cacheClientBPut メソッドの呼び出しは失敗します。キャッシュ クライアントは ErrorCode プロパティを CacheItemVersionMismatch に設定し、DataCacheException オブジェクトをスローします。これを次のコード例に図示します。

'later, at time T2, cacheClientB tries to 
'update the FM radio inventory, receives DataCacheException with
'an error code equal to DataCacheErrorCode.CacheItemVersionMismatch.
Dim newRadioInventoryB As Integer = 130

cacheClientB.Put("RadioInventory", newRadioInventoryB, _
                 radioInventoryB.Version)

ペシミスティック同時実行モデルでは、クライアントは明示的にオブジェクトをロックし、操作を実行します。ロックが解除されるまで、ロックを要求する他の操作は拒否されます (要求をブロックされません)。オブジェクトがロックされると、出力パラメーターとしてロック ハンドルが返されます。オブジェクトのロックを解除するにはロック ハンドルが必要です。ロックされたオブジェクトを解放せずにクライアント アプリケーションが終了した場合に備え、ロックを解放するためのタイムアウトが用意されています。ロックされたオブジェクトの有効期限が切れることはありませんが、ロックが解除されたときに有効期限を過ぎている場合、すぐに有効期限切れになる可能性があります。

ペシミスティック同時実行モデルで使用するメソッドの詳細については、「同時実行メソッド」を参照してください。

noteメモ
複数の操作にまたがるトランザクションはサポートされません。

noteメモ
キャッシュを使用するアプリケーションは、必要に応じて、ロックの順序を決定し、デッドロックを検出する必要があります。

Warning警告
キャッシュ内のロックされているオブジェクトであっても、任意のキャッシュ クライアントから Put メソッドを使用して置換できます。キャッシュが有効なアプリケーションは、ペシミスティック同時実行モデルを使用する項目について、常に PutAndUnlock を使用する必要があります。

関連項目

表示:
© 2015 Microsoft