Cosmos DB es el nuevo Microsoft NoSQL tienda lanzada en la nube de Azure. A diferencia de las bases de datos relacionales, es escalable ya que es un servicio de base de datos alojado, por lo que goza de mucha popularidad entre .NET de alta transacción y .NET Core aplicaciones Sin embargo, al usar Cosmos DB, debe tener cuidado con los cuellos de botella de rendimiento y los costos generales para acceder a la base de datos, ya que Microsoft le cobra por cada transacción a la base de datos.
Si bien Cosmos DB es escalable en términos de capacidad de transacción, no es tan rápido porque el servicio de la base de datos vive en una red virtual o suscripción separada en comparación con las aplicaciones. Entonces, incluso si sus aplicaciones se ejecutan en la nube de Azure, el acceso a la base de datos a través de la red virtual causará un gran impacto en el rendimiento.
Para abordar estos dos problemas, es ideal introducir el almacenamiento en caché en su aplicación Cosmos DB. Verá una mejora drástica en el rendimiento de su aplicación y, al mismo tiempo, una reducción significativa en el costo operativo porque el 80-90 % del tiempo, su aplicación obtendrá datos del caché en lugar de la base de datos.
NCache Detalles Sincronizar caché con Cosmos DB Uso del almacenamiento en caché con el seminario web de Cosmos DB
Uso del almacenamiento en caché con Cosmos DB
El siguiente fragmento de código explica cómo usar el almacenamiento en caché con Cosmos DB. Supuestamente, una instancia de Cosmos DB contiene una colección de Clientes.
- Busque el cliente especificado en el caché según la clave de caché.
- Si el elemento no está en la memoria caché, consulte Cosmos DB para buscar al cliente.
- Si el cliente existe en la colección de la base de datos, recupere el artículo.
- Agregue el cliente especificado a la memoria caché con un valor de caducidad de 5 minutos para garantizar la coherencia de los datos.
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 Detalles Dependencia extensible de notificación NCache Docs
Usar NCache como caché distribuida con Cosmos DB
Cuando se trabaja con Cosmos DB, lo más probable es que su aplicación sea una aplicación de muchas transacciones que se ejecuta en un entorno de varios servidores a través de un equilibrador de carga, lo que hace muchas llamadas a la base de datos. Además, un caché independiente no será posible en este entorno, por lo que necesita un caché distribuido como NCache entre la aplicación y la base de datos.
A caché distribuida le permite agregar más servidores de caché a medida que crece su carga transaccional, por lo que el caché nunca se convierte en un cuello de botella. Por lo tanto, la cantidad de sus servidores de aplicaciones no importa porque puede tener suficientes servidores de caché entre la aplicación y la base de datos, a diferencia de una base de datos relacional que es un obstáculo importante para cualquier escalabilidad.
Si bien Cosmos DB escala mucho más eficientemente que una base de datos relacional, aún no es rival para una caché distribuida en memoria como NCache que se encuentra con la red virtual de su aplicación. De hecho, una parte de la memoria caché residirá dentro del propio proceso de la aplicación (llamado caché del cliente), dandote almacenamiento en caché inProc velocidad.
NCache Detalles Operaciones de caché en NCache NCache Docs
Almacenamiento en caché de la colección de elementos de la base de datos
Mediante el uso de una caché distribuida, puede mejorar en gran medida el rendimiento de su aplicación Cosmos DB al reducir los viajes de la base de datos a través de la red, especialmente para las operaciones de lectura. Por lo tanto, si bien puede recuperar entidades individuales de la base de datos, un enfoque mucho más económico en términos de rendimiento y reducción de R/U (Solicitud por unidades) es recuperar la colección de elementos de la base de datos y aplicar las operaciones en el nivel de almacenamiento en caché.
Para este propósito, NCache permite el almacenamiento en caché de la colección como un solo elemento almacenado en caché junto con el almacenamiento en caché de los elementos individuales de la colección, cada uno contra su propia clave de caché designada. Cualquier cambio en el estado de la colección se puede enviar a la base de datos al final de las operaciones.
NCache Detalles Sincronizar caché con Cosmos DB NCache Docs
Colección de caché como elemento único
Puede almacenar en caché la colección como un único elemento si desea cargar los elementos de la colección de forma colectiva, por ejemplo, todos los clientes alemanes. Puede consultar Cosmos DB para todos los clientes en Alemania y devolver los resultados como una sola lista que luego se puede agregar a la memoria caché para su uso posterior.
El siguiente ejemplo de código muestra cómo hacer esto para recuperar la lista de clientes alemanes de la base de datos.
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 Detalles Caducidad en caché Operaciones de caché en NCache
Elementos de colección de caché por separado
Puede asociar metadatos con elementos de caché en NCache para categorizar los datos a través de identificadores únicos como etiquetas. De esta forma, puede recuperar varios elementos de la memoria caché con un solo identificador, por ejemplo, clientes que pertenecen a Alemania.
Para lograr esto, puede consultar los clientes alemanes en Cosmos DB y asociar una etiqueta como Cliente: País: Alemania con los elementos resultantes. El almacenamiento en caché de estos elementos por separado hará que estén disponibles para varias combinaciones de consultas e incluso búsquedas más rápidas de un solo cliente.
Utilizando el ejemplo anterior, primero buscamos en la memoria caché los clientes con la etiqueta Cliente: País: Alemania. Si los elementos no existen en la memoria caché, consulte Cosmos DB en busca de elementos en la colección del Cliente, con el atributo "País" especificado como "Alemania". Sin embargo, dado que ahora queremos almacenar en caché los elementos de la colección por separado, hacemos lo siguiente:
- Una vez que obtenga los elementos de la base de datos, especifique el valor de caducidad de los elementos.
- Especifique la etiqueta Cliente: País: Alemania para cada elemento del caché.
- Agregue elementos al caché de forma masiva.
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 Detalles Etiquetas en caché Operaciones de caché en NCache
NCache Despliegue en Azure
Los principales mercados en la nube ofrecen NCache, como Azure y AWS, y la descarga para uso en el sitio. Para todos los demás sistemas en la nube, puede descargar e instalar NCache en una máquina virtual en un modelo de Bring Your Own License (BYOL). NCache se implementa en Azure de las siguientes maneras:
- Despliegue NCache Cloud en Azure
- Despliegue NCache como máquinas virtuales
- Usar NCache en una oferta de plataforma como servicio (PaaS) en Azure.
Para más detalles sobre estas opciones, echa un vistazo a Opciones de implementación en la nube para NCache.
NCache Detalles NCache en AWS NCache Cloud Service
Conclusión
En resumen, la introducción del almacenamiento en caché en su aplicación Cosmos DB mejora la velocidad, la confiabilidad y la disponibilidad. Mediante el uso NCache con Cosmos DB, hay un aumento importante en el rendimiento de la aplicación porque la memoria caché reside dentro del proceso de la aplicación. En segundo lugar, una reducción drástica en el costo ya que se puede acceder al 80-90 % de sus datos sin realizar costosos viajes de base de datos a Cosmos DB.