Cosmos DB é o novo da Microsoft NoSQL store liberada na nuvem do Azure. Ao contrário dos bancos de dados relacionais, é escalável, pois é um serviço de banco de dados hospedado, portanto, goza de muita popularidade entre .NET de alta transação e .NET Core formulários. No entanto, usando o Cosmos DB, você precisa ter cuidado com os gargalos de desempenho e custos indiretos para acessar o banco de dados, pois a Microsoft cobra por cada transação no banco de dados.
Embora o Cosmos DB seja escalável em termos de capacidade de transação, não é tão rápido porque o serviço de banco de dados reside em uma VNet ou assinatura separada em comparação com os aplicativos. Portanto, mesmo que seus aplicativos estejam sendo executados na nuvem do Azure, acessar o banco de dados pela VNet causará um grande impacto no desempenho.
Para lidar com esses dois problemas, é ideal introduzir o armazenamento em cache em seu aplicativo Cosmos DB. Você verá uma melhoria drástica no desempenho de seu aplicativo e, ao mesmo tempo, uma redução significativa no custo operacional porque 80-90% do tempo, seu aplicativo estará buscando dados do cache em vez do banco de dados.
NCache Adicionar ao carrinho Sincronizar cache com Cosmos DB Use o cache com o Cosmos DB-Webinar
Usando o cache com o Cosmos DB
O trecho de código a seguir explica como usar o cache com o Cosmos DB. Supostamente, uma instância do Cosmos DB contém uma coleção de clientes.
- Pesquise o cliente especificado no cache com base na chave do cache.
- Se o item não estiver no cache, consulte o Cosmos DB para procurar o cliente.
- Se o cliente existir na coleção de banco de dados, recupere o item.
- Adicione o cliente especificado ao cache com um valor de expiração de 5 minutos para garantir a consistência dos dados.
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 Adicionar ao carrinho Dependência Extensível de Notificação NCache Docs
utilização NCache como um Cache Distribuído com Cosmos DB
Ao trabalhar com o Cosmos DB, é mais provável que seu aplicativo seja um aplicativo de alta transação em execução em um ambiente multiservidor por meio de um balanceador de carga, fazendo chamadas de banco de dados abundantes. Além disso, um cache autônomo não será possível neste ambiente, então você precisa de um cache distribuído como NCache entre o aplicativo e o banco de dados.
A cache distribuído permite que você adicione mais servidores de cache à medida que sua carga transacional aumenta, para que o cache nunca se torne um gargalo. Portanto, o número de seus servidores de aplicativos não importa porque você pode ter servidores de cache suficientes entre o aplicativo e o banco de dados, ao contrário de um banco de dados relacional, que é um grande ponto de estrangulamento para qualquer escalabilidade.
Embora o Cosmos DB seja dimensionado com muito mais eficiência do que um banco de dados relacional, ainda não é páreo para um cache distribuído na memória como NCache que fica com a VNet do seu aplicativo. Na verdade, uma parte do cache residirá no próprio processo do aplicativo (chamado de cache do cliente), dando-lhe cache inProc Rapidez.
NCache Adicionar ao carrinho Operações de cache em NCache NCache Docs
Coleção de armazenamento em cache de itens do banco de dados
Usando um cache distribuído, você pode aprimorar o desempenho do seu aplicativo Cosmos DB extremamente reduzindo viagens de banco de dados na rede, especialmente para operações de leitura. Assim, embora você possa recuperar entidades únicas do banco de dados, uma abordagem muito mais econômica em termos de taxa de transferência e R/Us (Request per Units) reduzido é recuperar a coleção de itens do banco de dados e aplicar as operações na camada de cache.
Para esse fim, NCache permite o armazenamento em cache da coleção como um único item armazenado em cache junto com o armazenamento em cache dos elementos individuais da coleção, cada um em relação à sua própria chave de cache designada. Quaisquer alterações no estado da coleção podem ser enviadas posteriormente para o banco de dados no final das operações.
NCache Adicionar ao carrinho Sincronizar cache com Cosmos DB NCache Docs
Coleta de cache como item único
Você pode armazenar em cache a coleção como um único item se quiser carregar os itens da coleção coletivamente, por exemplo, todos os clientes alemães. Você pode consultar o Cosmos DB para todos os clientes na Alemanha e retornar os resultados como uma única lista que pode ser adicionada ao cache para uso posterior.
O exemplo de código a seguir mostra como fazer isso para recuperar a lista de clientes alemães do banco de dados.
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 Adicionar ao carrinho Expiração no Cache Operações de cache em NCache
Cache de itens de coleção separadamente
Você pode associar metadados a itens de cache em NCache para categorizar dados por meio de identificadores exclusivos, como Tag. Dessa forma, você pode recuperar vários itens do cache em um único identificador, por exemplo, clientes pertencentes à Alemanha.
Para conseguir isso, você pode consultar clientes alemães no Cosmos DB e associar uma marca como Cliente: País: Alemanha aos itens resultantes. Armazenar esses itens em cache separadamente os tornará disponíveis para várias combinações de consulta e buscas ainda mais rápidas de um único cliente.
Usando o exemplo anterior, primeiro pesquisamos no cache os clientes com a tag Cliente: País: Alemanha. Se os itens não existirem no cache, consulte o Cosmos DB em busca de itens na coleção Customer - tendo o atributo "País" especificado como "Alemanha". No entanto, como agora queremos armazenar em cache os itens da coleção separadamente, fazemos o seguinte:
- Depois de buscar os itens do banco de dados, especifique o valor de expiração dos itens.
- Especifique a tag Cliente: País: Alemanha em cada item de cache.
- Adicione itens ao cache em massa.
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 Adicionar ao carrinho Tags no cache Operações de cache em NCache
NCache Implantação no Azure
Oferta dos principais mercados de nuvem NCache, como Azure e AWS, e download para uso no local. Para todos os outros sistemas em nuvem, você pode baixar e instalar NCache em uma máquina virtual em um modelo de Bring Your Own License (BYOL). NCache é implantado no Azure das seguintes maneiras:
- Implantação NCache Cloud no Azure
- Implantação NCache como máquinas virtuais
- utilização NCache em uma oferta de plataforma como serviço (PaaS) no Azure.
Para mais detalhes sobre essas opções, dê uma olhada em Opções de implantação na nuvem para NCache.
NCache Adicionar ao carrinho NCache na AWS NCache Cloud Service
Conclusão
Para resumir, introduzir o cache em seu aplicativo Cosmos DB aumenta a velocidade, a confiabilidade e a disponibilidade. usando NCache com o Cosmos DB, há um grande aumento no desempenho do aplicativo porque o cache reside no processo do aplicativo. Em segundo lugar, uma redução drástica no custo, pois 80-90% de seus dados são acessíveis sem fazer viagens caras de banco de dados para o Cosmos DB.
NCache Adicionar ao carrinho Baixar NCache Comparação de edições