Cosmos DB ist das neue von Microsoft NoSQL Store in der Azure-Cloud veröffentlicht. Im Gegensatz zu relationalen Datenbanken ist es skalierbar, da es sich um einen gehosteten Datenbankdienst handelt, und erfreut sich daher großer Beliebtheit bei hochtransaktionsorientierten .NET- und .NET Core Anwendungen. Bei der Verwendung von Cosmos DB müssen Sie sich jedoch vor Leistungsengpässen und Mehrkosten für den Zugriff auf die Datenbank in Acht nehmen, da Microsoft Ihnen jede Transaktion mit der Datenbank in Rechnung stellt.
Cosmos DB ist zwar in Bezug auf die Transaktionskapazität skalierbar, aber nicht so schnell, da der Datenbankdienst im Vergleich zu den Anwendungen in einem separaten VNet oder Abonnement lebt. Selbst wenn Ihre Anwendungen also in der Azure-Cloud ausgeführt werden, wird der Zugriff auf die Datenbank über das VNet die Leistung erheblich beeinträchtigen.
Um diese beiden Probleme anzugehen, ist es ideal, Caching in Ihre Cosmos DB-Anwendung einzuführen. Sie werden eine drastische Verbesserung Ihrer Anwendungsleistung und gleichzeitig eine erhebliche Reduzierung der Betriebskosten feststellen, da Ihre Anwendung zu 80-90 % der Zeit Daten aus dem Cache statt aus der Datenbank abruft.
NCache Details Cache mit Cosmos DB synchronisieren Verwenden Sie Caching mit Cosmos DB-Webinar
Verwenden von Caching mit Cosmos DB
Der folgende Codeausschnitt erläutert die Verwendung von Caching mit Cosmos DB. Angeblich enthält eine Cosmos DB-Instance eine Sammlung von Kunden.
- Suchen Sie anhand des Cache-Schlüssels nach dem angegebenen Kunden im Cache.
- Wenn sich das Element nicht im Cache befindet, fragen Sie Cosmos DB ab, um nach dem Kunden zu suchen.
- Wenn der Kunde in der Datenbanksammlung vorhanden ist, rufen Sie das Element ab.
- Fügen Sie den angegebenen Kunden mit einem Ablaufwert von 5 Minuten zum Cache hinzu, um die Datenkonsistenz sicherzustellen.
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 Details Benachrichtigung erweiterbare Abhängigkeit NCache Docs
Die richtigen NCache als verteilter Cache mit Cosmos DB
Wenn Sie mit Cosmos DB arbeiten, handelt es sich bei Ihrer Anwendung höchstwahrscheinlich um eine Anwendung mit vielen Transaktionen, die in einer Umgebung mit mehreren Servern über einen Lastenausgleich ausgeführt wird und zahlreiche Datenbankaufrufe durchführt. Darüber hinaus ist in dieser Umgebung kein eigenständiger Cache möglich, sodass Sie einen verteilten Cache wie z NCache zwischen Anwendung und Datenbank.
A verteilter Cache ermöglicht es Ihnen, weitere Cache-Server hinzuzufügen, wenn Ihre Transaktionslast wächst, sodass der Cache nie zu einem Engpass wird. Daher spielt die Anzahl Ihrer Anwendungsserver keine Rolle, da Sie genügend Cache-Server zwischen der Anwendung und der Datenbank haben können, im Gegensatz zu einer relationalen Datenbank, die ein wichtiger Engpass für jede Skalierbarkeit ist.
Während Cosmos DB viel effizienter skaliert als eine relationale Datenbank, ist es immer noch kein Vergleich zu einem verteilten In-Memory-Cache wie NCache das sich im VNET Ihrer Anwendung befindet. Tatsächlich befindet sich ein Teil des Caches im Anwendungsprozess selbst (genannt a Client-Cache), dir geben inProc-Caching Geschwindigkeit.
NCache Details Cache-Operationen in NCache NCache Docs
Caching-Sammlung von Datenbankelementen
Durch die Verwendung eines verteilten Caches können Sie die Leistung Ihrer Cosmos DB-Anwendung erheblich verbessern, indem Sie Datenbankfahrten über das Netzwerk reduzieren, insbesondere bei Lesevorgängen. Während Sie also einzelne Entitäten aus der Datenbank abrufen können, besteht ein weitaus wirtschaftlicherer Ansatz in Bezug auf Durchsatz und reduzierte R/Us (Request per Units) darin, die Sammlung von Elementen aus der Datenbank abzurufen und die Vorgänge auf der Caching-Ebene anzuwenden.
Für diesen Zweck, NCache ermöglicht das Zwischenspeichern der Sammlung als einzelnes zwischengespeichertes Element zusammen mit dem Zwischenspeichern der einzelnen Elemente der Sammlung, jedes mit seinem eigenen festgelegten Cache-Schlüssel. Alle Änderungen am Status der Sammlung können später am Ende der Vorgänge an die Datenbank übertragen werden.
NCache Details Cache mit Cosmos DB synchronisieren NCache Docs
Cache-Sammlung als einzelnes Element
Sie können die Sammlung als Einzelartikel zwischenspeichern, wenn Sie die Sammlungsartikel gesammelt laden möchten, z. B. alle deutschen Kunden. Sie können Cosmos DB für alle Kunden in Deutschland abfragen und die Ergebnisse als einzelne Liste zurückgeben, die dann zur weiteren Verwendung dem Cache hinzugefügt werden kann.
Das folgende Codebeispiel zeigt, wie dies zum Abrufen der Liste der deutschen Kunden aus der Datenbank erfolgt.
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 Details Ablauf im Cache Cache-Operationen in NCache
Sammelobjekte separat zwischenspeichern
Sie können Metadaten mit Cache-Elementen in verknüpfen NCache um Daten durch eindeutige Kennungen wie z. B. zu kategorisieren Tags. Auf diese Weise können Sie mehrere Artikel aus dem Cache mit einer einzigen Kennung abrufen, z. B. Kunden aus Deutschland.
Um dies zu erreichen, können Sie deutsche Kunden in Cosmos DB abfragen und den resultierenden Elementen ein Tag wie Kunde: Land: Deutschland zuordnen. Wenn Sie diese Elemente separat zwischenspeichern, werden sie für verschiedene Abfragekombinationen und noch schnellere Abrufe eines einzelnen Kunden verfügbar.
Anhand des vorherigen Beispiels durchsuchen wir zunächst den Cache nach Kunden mit dem Tag Kunde: Land: Deutschland. Wenn im Cache keine Elemente vorhanden sind, fragen Sie Cosmos DB nach Elementen in der Kundensammlung ab, deren Attribut „Land“ als „Deutschland“ angegeben ist. Da wir nun aber die Collection-Items separat zwischenspeichern wollen, gehen wir wie folgt vor:
- Nachdem Sie die Elemente aus der Datenbank abgerufen haben, geben Sie den Ablaufwert für die Elemente an.
- Tag Kunde: Land: Deutschland bei jedem Cache-Item angeben.
- Fügen Sie dem Cache Elemente in großen Mengen hinzu.
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 Details Tags im Cache Cache-Operationen in NCache
NCache Bereitstellung in Azure
Große Cloud-Marktplätze bieten NCache, wie Azure und AWS, und zum Herunterladen für die Verwendung vor Ort. Für alle anderen Cloud-Systeme können Sie herunterladen und installieren NCache auf einer virtuellen Maschine in einem Bring Your Own License (BYOL)-Modell. NCache wird in Azure auf folgende Weise bereitgestellt:
- Deploy NCache Cloud in Azur
- Deploy NCache als virtuelle Maschinen
- Die richtigen NCache in einem Platform-as-a-Service (PaaS)-Angebot in Azure.
Weitere Einzelheiten zu diesen Optionen finden Sie unter Cloud-Bereitstellungsoptionen für NCache.
NCache Details NCache im AWS NCache Cloud Service
Zusammenfassung
Zusammenfassend lässt sich sagen, dass die Einführung von Caching in Ihre Cosmos DB-Anwendung die Geschwindigkeit, Zuverlässigkeit und Verfügbarkeit verbessert. Durch die Nutzung NCache Mit Cosmos DB wird die Leistung der Anwendung erheblich gesteigert, da sich der Cache im Anwendungsprozess befindet. Zweitens eine drastische Kostensenkung, da auf 80–90 % Ihrer Daten zugegriffen werden kann, ohne dass kostspielige Datenbankwechsel zu Cosmos DB erforderlich sind.