Cosmos DB è il nuovo di Microsoft NoSQL store rilasciato nel cloud di Azure. A differenza dei database relazionali, è scalabile in quanto è un servizio di database ospitato, quindi gode di molta popolarità tra .NET ad alta transazione e .NET Core applicazioni. Tuttavia, usando Cosmos DB, devi fare attenzione ai colli di bottiglia delle prestazioni e ai costi generali per l'accesso al database, poiché Microsoft addebita ogni transazione al database.
Anche se Cosmos DB è scalabile in termini di capacità delle transazioni, non è altrettanto veloce perché il servizio di database si trova in una rete virtuale o sottoscrizione separata rispetto alle applicazioni. Pertanto, anche se le tue applicazioni sono in esecuzione nel cloud di Azure, l'accesso al database attraverso la rete virtuale causerà un duro colpo alle prestazioni.
Per affrontare questi due problemi, è ideale introdurre la memorizzazione nella cache nell'applicazione Cosmos DB. Vedrai un drastico miglioramento delle prestazioni della tua applicazione e, allo stesso tempo, una significativa riduzione dei costi operativi perché l'80-90% delle volte, la tua applicazione recupererà i dati dalla cache anziché dal database.
NCache Dettagli Sincronizza la cache con Cosmos DB Usa la memorizzazione nella cache con Cosmos DB-Webinar
Utilizzo della memorizzazione nella cache con Cosmos DB
Il frammento di codice seguente illustra come usare la memorizzazione nella cache con Cosmos DB. Presumibilmente, un'istanza di Cosmos DB contiene una raccolta di Customers.
- Cerca il cliente specificato nella cache in base alla chiave della cache.
- Se l'elemento non è nella cache, eseguire una query su Cosmos DB per cercare il cliente.
- Se il cliente esiste nella raccolta del database, recuperare l'articolo.
- Aggiungi il cliente specificato alla cache con un valore di scadenza di 5 minuti per garantire la coerenza dei dati.
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 Dettagli Dipendenza estensibile di notifica NCache Docs
utilizzando NCache come cache distribuita con Cosmos DB
Quando si lavora con Cosmos DB, è molto probabile che l'applicazione sia un'applicazione a transazioni elevate in esecuzione in un ambiente multiserver tramite un servizio di bilanciamento del carico, che effettua numerose chiamate al database. Inoltre, una cache autonoma non sarà possibile in questo ambiente, quindi è necessaria una cache distribuita come NCache tra l'applicazione e il database.
A cache distribuita ti consente di aggiungere più server cache man mano che il carico transazionale aumenta, in modo che la cache non diventi mai un collo di bottiglia. Pertanto, il numero dei server delle applicazioni non ha importanza perché è possibile disporre di server di cache sufficienti tra l'applicazione e il database, a differenza di un database relazionale che rappresenta un importante punto di strozzamento per qualsiasi scalabilità.
Sebbene Cosmos DB si ridimensioni in modo molto più efficiente rispetto a un database relazionale, non è ancora all'altezza di una cache distribuita in memoria come NCache che si trova con la rete virtuale dell'applicazione. Infatti, una parte della cache risiederà all'interno del processo applicativo stesso (chiamato a cache del cliente), dandoti memorizzazione nella cache inProc velocità.
NCache Dettagli Operazioni nella cache in NCache NCache Docs
Memorizzazione nella cache della raccolta di elementi del database
Usando una cache distribuita, è possibile migliorare notevolmente le prestazioni dell'applicazione Cosmos DB riducendo i viaggi del database attraverso la rete, in particolare per le operazioni di lettura. Pertanto, sebbene sia possibile recuperare singole entità dal database, un approccio molto più economico in termini di throughput e R/U (richiesta per unità) ridotto consiste nel recuperare la raccolta di elementi dal database e applicare le operazioni a livello di memorizzazione nella cache.
Per questo scopo, NCache consente la memorizzazione nella cache della raccolta come un singolo elemento memorizzato nella cache insieme alla memorizzazione nella cache dei singoli elementi della raccolta, ciascuno rispetto alla propria chiave di cache designata. Eventuali modifiche allo stato della raccolta possono essere successivamente inviate al database al termine delle operazioni.
NCache Dettagli Sincronizza la cache con Cosmos DB NCache Docs
Raccolta cache come elemento singolo
È possibile memorizzare nella cache la collezione come singolo articolo se si desidera caricare collettivamente gli articoli della collezione, ad esempio tutti i clienti tedeschi. È possibile eseguire una query su Cosmos DB per tutti i clienti in Germania e restituire i risultati come un unico elenco che può quindi essere aggiunto alla cache per un ulteriore utilizzo.
L'esempio di codice seguente mostra come eseguire questa operazione per recuperare l'elenco dei clienti tedeschi dal database.
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 Dettagli Scadenza nella cache Operazioni nella cache in NCache
Elementi della raccolta della cache separatamente
Puoi associare i metadati agli elementi della cache in NCache per classificare i dati attraverso identificatori univoci come tag. In questo modo è possibile recuperare più elementi dalla cache rispetto a un unico identificatore, ad esempio clienti appartenenti alla Germania.
A tale scopo, è possibile eseguire una query per i clienti tedeschi in Cosmos DB e associare un tag come Customer: Country: Germany agli elementi risultanti. La memorizzazione nella cache di questi elementi separatamente li renderà disponibili per varie combinazioni di query e recuperi ancora più veloci di un singolo cliente.
Utilizzando l'esempio precedente, per prima cosa cerchiamo nella cache i clienti con il tag Cliente: Paese: Germania. Se gli elementi non esistono nella cache, eseguire una query su Cosmos DB per gli elementi nella raccolta Customer, con l'attributo "Paese" specificato come "Germania". Tuttavia, poiché ora vogliamo memorizzare nella cache gli elementi della raccolta separatamente, procediamo come segue:
- Dopo aver recuperato gli elementi dal database, specificare il valore di scadenza per gli elementi.
- Specifica il tag Cliente: Paese: Germania per ogni elemento della cache.
- Aggiungi elementi alla cache in blocco.
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 Dettagli Tag nella cache Operazioni nella cache in NCache
NCache Distribuzione in Azure
Offerta dei principali mercati cloud NCache, come Azure e AWS, e il download per l'utilizzo in loco. Per tutti gli altri sistemi cloud, puoi scaricare e installare NCache su una macchina virtuale in un modello di Bring Your Own License (BYOL). NCache viene distribuito in Azure nei modi seguenti:
- Schierare NCache Cloud in azzurro
- Schierare NCache come Macchine Virtuali
- utilizzando NCache in un'offerta Platform-as-a-Service (PaaS) in Azure.
Per maggiori dettagli su queste opzioni, dai un'occhiata a Opzioni di distribuzione cloud per NCache.
NCache Dettagli NCache nell'AWS NCache Cloud Service
Conclusione
Per riassumere, l'introduzione della memorizzazione nella cache nell'applicazione Cosmos DB migliora la velocità, l'affidabilità e la disponibilità. Usando NCache con Cosmos DB, c'è un notevole incremento delle prestazioni dell'applicazione perché la cache risiede all'interno del processo dell'applicazione. In secondo luogo, una drastica riduzione dei costi in quanto l'80-90% dei dati è accessibile senza effettuare costosi viaggi di database in Cosmos DB.