AzureCosmosDBは新しいものです NoSQL 最近人気が高まっているクラウドベースのデータベース ソリューション。 Cosmos DB でキャッシュを使用すると、データベースへのアクセスが減り、アプリケーションのパフォーマンスが向上し、トランザクション コストが最適化されることは誰もが知っています。
ただし、Cosmos DB データを分散キャッシュにキャッシュすると、このデータの XNUMX つのコピー (データベース内に XNUMX つとキャッシュ内に XNUMX つ) が作成される可能性があります。 キャッシュにアクセスできないアプリケーションが Cosmos DB 内のこのデータを直接変更しても、キャッシュはそれを認識しません。 その結果、キャッシュにはデータベースと比較して古いデータのコピーが含まれることになります。
この古いデータは、古いデータを扱うとパフォーマンスに大きな影響を与える高トランザクションのマルチ環境アプリケーションでは大きな問題になります。 このブログでは、キャッシュを使用し続けながら、この「古いデータ」の問題を回避する方法について説明します。
Cosmos DB とのキャッシュ同期を使用する NCache
NCache は、豊富な強力な機能セットを備えた非常に強力な分散キャッシュ ソリューションです。 他の分散キャッシュと同様に、 NCache データベースとアプリケーション自体の間に位置し、アプリケーションが使用するデータベースのデータをキャッシュします。 したがって、読み取り/書き込み時間が大幅に短縮されます。 また、として知られる機能によって、古いデータの問題 (前述) も解決されます。 NotifyExtensibleDependency.
NotifyExtensibleDependency を使用すると、データベース (この場合は Cosmos DB) からの通知を処理する独自のカスタム データ依存関係ロジックを作成できます。 NCache を利用して フィードの変更 Cosmos DBの仕組み。
Cosmos DB 内の変更は、NotifyExtensibleDependency コードに統合されている Cosmos DB Change Feed プロセッサ ロジックを使用してキャプチャできます。 これは、イベント処理メカニズムを使用して、データベース コンテンツの変更に応じてキャッシュの無効化を強制し、古いデータがキャッシュに残らないようにする方法です。
ReadThru プロバイダー機能を使用するオプションもあります。 NCache Cosmos DB アプリケーションのパフォーマンスをさらに向上させることができます。 この機能を使用すると、キャッシュに存在しないアイテムをデータベースで直接検索できるようになります。 キャッシュは、データベース (Cosmos DB) 内で要求されたアイテムを検索するだけでなく、検出が成功すると、要求されたアイテムをキャッシュ内に保存します。
NCache 詳細 NotifyExtensibleDependency キャッシングを読む
Cosmos DB とキャッシュを同期する: 簡単な例
たとえば、Cosmos DB を E コマース ストアのデータベースとして使用し、頻繁に使用されるデータを NCache。 ストアには何万もの商品があり、毎日平均して XNUMX 万件の取引が行われます。 NCache Cosmos Database の負荷を軽減するのに役立ちますが、キャッシュ内のデータが古くなる可能性があります。 上で説明したように、 NCache は、電子商取引ストアの最適な機能を保証する NotifyExtensibleDependency 機能によってこの問題を解決します。
次のコード例は、NotifyExtensibleDependency 機能の使用法を示しています。 この例では、製品はその ID に基づいてデータベースからロードされます。 次に、NotifyExtensibleDependency が作成され、フェッチされた製品に対して登録されます。 最終的には、次のような形で製品が完成します。 キャッシュ項目 指定されたキーでキャッシュに挿入されます。
また、CosmosDbNotificationDependency は、キャッシュにデプロイされているプロバイダーの名前です。 このプロバイダーは、 ICustomDependencyProvider インタフェース。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Product product = LoadProductFromDatabase(productId); string providerName = "CosmosDbNotificationDependency"; //This is the name of your provider deployed on cache server string key = "Product#" + product.Id ; IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("Key", key); parameters.Add("CacheId", "myCache"); parameters.Add("EndPoint", ""); parameters.Add("AuthKey", ""); parameters.Add("DatabaseName", "demoDatabase"); parameters.Add("MonitoredCollection", "Customers"); parameters.Add("LeaseEndPoint", ""); parameters.Add("LeaseAuthKey", ""); parameters.Add("LeaseDatabaseName", "demoDatabase"); parameters.Add("LeaseCollection", "leases"); CacheItem item = new CacheItem(product); item.Dependency = new CustomDependency(providerName, parameters); _cache.Insert(key, item); |
実装に関する詳細については、こちらをご覧ください。 GitHubの リポジトリ。
NCache 詳細 NotifyExtensibleDependency のキャッシュ操作 NCache
キャッシュ用のリードスループロバイダー
のリードスルー機能 NCache (名前が示すように) キャッシュ内に項目が見つからない場合に、キャッシュを介してデータベース (Cosmos DB) に直接読み取ることができます。 この機能により、基本的に、要求されたアイテムがキャッシュ内に見つからない場合に、データベースでアイテムを自分で探す手間が省けます。 この機能により、 NCache 要求されたアイテムのデータベースを読み取りますが、将来の迅速な取得のためにそれらをキャッシュに挿入します。
次のコード例では、Get<> メソッドを使用して、指定されたキー「Product:1001」に対応する、リードスルーが有効になっている項目を取得します。
1 2 3 4 5 6 7 8 9 |
// Specify the key of the item string key = "Product:1001"; // Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product data = cache.Get(key, readThruOptions); |
NCache 詳細 キャッシングを読む のキャッシュ操作 NCache
まとめ
総括する、 NCache は、Cosmos DB とキャッシュの間でデータを同期するための柔軟なソリューションを提供し、データの不整合を回避します。 NCacheは、メモリ内分散キャッシュ ソリューションであり、Cosmos DB が最新のデータを維持してアクセスと処理を容易にする理想的な媒体となります。