Cosmos DB は Microsoft の新しい NoSQL Azure クラウドでリリースされたストア。 リレーショナル データベースとは異なり、ホストされたデータベース サービスであるためスケーラブルであるため、高トランザクション .NET および .NET Core アプリケーション。 ただし、Cosmos DB を使用する場合は、パフォーマンスのボトルネックと、データベースへのアクセスにかかるコスト オーバーヘッドに注意する必要があります。これは、Microsoft がデータベースへのトランザクションごとに料金を請求するためです。
Cosmos DB はトランザクション容量の点でスケーラブルですが、データベース サービスがアプリケーションとは別の VNet またはサブスクリプションに存在するため、それほど高速ではありません。 そのため、アプリケーションが Azure クラウドで実行されている場合でも、VNet を介してデータベースにアクセスすると、パフォーマンスに大きな打撃を与えます。
これら 80 つの問題に取り組むには、Cosmos DB アプリケーションにキャッシュを導入することが理想的です。 アプリケーションのパフォーマンスが大幅に向上すると同時に、90 ~ XNUMX% の時間でアプリケーションがデータベースではなくキャッシュからデータをフェッチするため、運用コストが大幅に削減されます。
NCache 詳細 キャッシュをCosmosDBと同期する CosmosDBでキャッシングを使用する-ウェビナー
CosmosDBでのキャッシングの使用
次のコード スニペットは、Cosmos DB でキャッシュを使用する方法を説明しています。 おそらく、Cosmos DB インスタンスには Customers のコレクションが含まれています。
- キャッシュキーに基づいて、キャッシュ内の指定された顧客を検索します。
- アイテムがキャッシュにない場合は、Cosmos DB にクエリを実行して顧客を検索します。
- 顧客がデータベースコレクションに存在する場合は、アイテムを取得します。
- データの整合性を確保するために、指定された顧客を 5 分の有効期限値でキャッシュに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// Generate a unique cache key string key = $"Customer:ALFKI"; // First look for data in cache var retrievedItem = cache.Get<Customer>(key); // If not found in the cache, fetch data from the database and add it to the cache if (retrievedItem == null) { // New instance of CosmosClient class using a primary connection string CosmosClient client = new CosmosClient("connection-string-from-portal"); // Get container object Container container = client.GetContainer("Northwind", "Customer"); // Create partition key and id // Here, the id is CustomerID and Partition Key is City in the Customer class PartitionKey partitionKey = new PartitionKey("Seattle"); String id = "ALFKI"; // Read item from the container using the id and partitionKey var itemResponse = container.ReadItemAsync<Customer>(id, partitionKey).Result; // get customer object from database response Customer customer = itemResponse.Resource; // Initialize cache item with customer data and set expiration var cacheItem = new CacheItem(customer); cacheItem.Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); // Insert cacheItem in cache against the given key cache.Insert(key, cacheItem); } |
NCache 詳細 通知の拡張可能な依存関係 NCache ドキュメント
使い方 NCache CosmosDBを使用した分散キャッシュとして
Cosmos DB を使用する場合、アプリケーションは、ロード バランサーを介してマルチサーバー環境で実行され、大量のデータベース呼び出しを行う高トランザクション アプリケーションである可能性が最も高くなります。 さらに、この環境ではスタンドアロンのキャッシュは使用できないため、次のような分散キャッシュが必要です。 NCache アプリケーションとデータベースの間。
A 分散キャッシュ トランザクション負荷の増大に合わせてキャッシュ サーバーを追加できるため、キャッシュがボトルネックになることはありません。 したがって、スケーラビリティの主要な障害となるリレーショナル データベースとは異なり、アプリケーションとデータベースの間に十分な数のキャッシュ サーバーを配置できるため、アプリケーション サーバーの数は重要ではありません。
Cosmos DB はリレーショナル データベースよりもはるかに効率的にスケーリングしますが、それでも、次のようなインメモリ分散キャッシュには匹敵しません。 NCache これは、アプリケーションの VNet と一緒に配置されます。 実際、キャッシュの一部はアプリケーション プロセス自体に存在します ( クライアントキャッシュ)、あなたを与える inProc キャッシング 速度。
NCache 詳細 のキャッシュ操作 NCache NCache ドキュメント
データベースアイテムのキャッシュコレクション
分散キャッシュを使用すると、特に読み取り操作の場合に、ネットワーク全体のデータベース トリップを減らすことで、Cosmos DB アプリケーションのパフォーマンスを大幅に向上させることができます。 したがって、データベースから単一のエンティティを取得することもできますが、スループットと削減された R/U (ユニットあたりの要求) の点ではるかに経済的なアプローチは、データベースからアイテムのコレクションを取得し、キャッシュ層で操作を適用することです。
この目的のために、 NCache コレクションを単一のキャッシュされた項目としてキャッシュするとともに、コレクションの個々の要素を独自に指定されたキャッシュ キーに対してキャッシュすることができます。 コレクションの状態に対する変更は、後で操作の最後にデータベースにプッシュできます。
NCache 詳細 キャッシュをCosmosDBと同期する NCache ドキュメント
単一アイテムとしてのキャッシュコレクション
たとえば、すべてのドイツの顧客など、コレクション アイテムをまとめてロードする場合は、コレクションを XNUMX つのアイテムとしてキャッシュできます。 ドイツのすべての顧客について Cosmos DB に対してクエリを実行し、その結果を XNUMX つのリストとして返します。このリストは、後で使用するためにキャッシュに追加できます。
次のコード サンプルは、データベースからドイツの顧客のリストを取得するためにこれを行う方法を示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
string key = $"CustomersFromGermany"; // First look for data in cache IDistributedList<Customer>germanCustomers = cache.DataTypeManager.GetList<Customer>(key); // If not found in the cache, fetch data from the database and add it to the cache if (germanCustomers == null) { // Create a query var query = new QueryDefinition("SELECT * FROM Customers c WHERE c.Country = 'Germany'"); // Get query iterator FeedIterator<Customer>feedIterator = container.GetItemQueryIterator<Customer>(query); // Specify expiration attribute for List var attributes = new DataTypeAttributes(); attributes.Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); // Create a list to store customers as a collection germanCustomers = cache.DataTypeManager.CreateList<Customer>(key, attributes); // Read DB data using feed while (feedIterator.HasMoreResults) { var response = feedIterator.ReadNextAsync().Result.Resource; foreach (Customer customer in response) { germanCustomers.Add(customer); } } } |
NCache 詳細 キャッシュ内の有効期限 のキャッシュ操作 NCache
コレクションアイテムを個別にキャッシュする
メタデータをキャッシュアイテムに関連付けることができます NCache 次のような一意の識別子を介してデータを分類する タグ. このようにして、ドイツに属する顧客など、単一の識別子に対してキャッシュから複数のアイテムを取得できます。
これを実現するには、Cosmos DB でドイツの顧客に対してクエリを実行し、結果の項目に対して Customer: Country: Germany などのタグを関連付けます。 これらのアイテムを個別にキャッシュすると、さまざまなクエリの組み合わせで使用できるようになり、単一の顧客のフェッチがさらに高速になります。
前の例を使用して、まず Customer: Country: Germany というタグを持つ顧客のキャッシュを検索します。 アイテムがキャッシュに存在しない場合は、「国」属性が「ドイツ」として指定されている Customer コレクション内のアイテムについて、Cosmos DB にクエリを実行します。 ただし、コレクション アイテムを個別にキャッシュする必要があるため、次のようにします。
- データベースからアイテムを取得したら、アイテムの有効期限の値を指定します。
- 各キャッシュ アイテムに対してタグ Customer: Country: Germany を指定します。
- アイテムを一括でキャッシュに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// Create a dictionary to add bulk items in the cache var collectionItems = new Dictionary<string, CacheItem>(); CacheItem cacheItem = null; var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); // Read DB data using feed while (feedIterator.HasMoreResults) { var response = feedIterator.ReadNextAsync().Result.Resource; foreach (Customer customer in response) { cacheItem = new CacheItem(customer); cacheItem.Expiration = expiration; //Create a unique key for each item in collection string itemKey = $"Customer:{customer.CustomerID}"; // Add cacheItem to dictionary collectionItems.Add(itemKey, cacheItem); } } // Insert customer collection items seperately using bulk operation if (collectionItems.Count > 0) { cache.InsertBulk(collectionItems); } |
NCache 詳細 キャッシュ内のタグ のキャッシュ操作 NCache
NCache Azureでのデプロイ
主要なクラウド マーケットプレイスが提供するもの NCache、Azure や AWS など、およびオンサイトで使用するためのダウンロード。 他のすべてのクラウド システムについては、ダウンロードしてインストールできます。 NCache Bring Your Own License(BYOL)のモデルの仮想マシン上。 NCache 次の方法でAzureにデプロイされます。
- 配備します NCache Cloud Azureで
- 配備します NCache 仮想マシンとして
- 使い方 NCache AzureのPlatform-as-a-Service(PaaS)オファリングで。
これらのオプションの詳細については、をご覧ください。 のクラウド導入オプション NCache.
NCache 詳細 NCache AWSで NCache Cloud Service
まとめ
まとめると、Cosmos DB アプリケーションにキャッシュを導入すると、速度、信頼性、および可用性が向上します。 使用することで NCache Cosmos DB を使用すると、キャッシュがアプリケーション プロセス内に存在するため、アプリケーションのパフォーマンスが大幅に向上します。 次に、コストのかかる Cosmos DB へのデータベース移動を行わなくても、データの 80 ~ 90% にアクセスできるため、コストが大幅に削減されます。