Você ouviu sobre eBay utilização MongoDB como seu banco de dados principal? Agora, por que uma empresa multinacional de comércio eletrônico como o eBay usaria o MongoDB e não um RDBMS tradicional? É porque o MongoDB tem sido um tópico importante entre os desenvolvedores por seu armazenamento de valor-chave distribuído e orientação a documentos NoSQL recursos. E, se o eBay estiver usando, tenho certeza de que seu aplicativo de comércio eletrônico também usa o MongoDB.
Esqueça o eBay. Vamos pegar seu aplicativo de e-commerce e dissecar seus dados básicos e necessidades de desempenho. Agora no seu .NET/.NET Core app, você já sentiu que o desempenho está comprometido porque você tem solicitações limitadas por segundo? Você notou o atraso nas chamadas de leitura/gravação para seu banco de dados baseado em disco? Você já teve a sensação de que, mesmo com todos os seus recursos maravilhosos, o MongoDB ainda carece de um certo link que possa trazer glória ao seu aplicativo?
Aqui, meu amigo, é onde alguém (eu) te cutuca (apenas virtualmente) e apresenta NCache em sua vida. NCache é um in-memory, distribuído e altamente escalável cache que fica sempre ao lado do seu aplicativo; melhorando a taxa de transação e, portanto, tornando-o a solução perfeita para todas as suas necessidades de armazenamento em cache. Vamos fazer um pequeno tour de como você pode tirar o melhor proveito do seu aplicativo usando NCache.
NCache Adicionar ao carrinho Sincronizar cache com banco de dados NCache NoSql Datastore
utilização NCache como um cache distribuído com o MongoDB
Com um aplicativo de comércio eletrônico altamente transacional como o seu, executado em um ambiente multi-servidor, você não pode se dar ao luxo de ter um único cache de servidor atendendo todas as suas solicitações de dados. Quanto maior a carga em seu aplicativo, maiores são as chances de seu cache engasgar com as solicitações.
Pode chegar um momento durante a execução de seu aplicativo em que a carga de transação em seu aplicativo aumenta e o número de servidores de cache configurados inicialmente não é suficiente para atender às solicitações recebidas. Este é o lugar onde NCache dimensiona perfeitamente seu aplicativo permitindo que você adicionar servidores de cache adicionais em tempo de execução para que o cache nunca se torne um gargalo para seu aplicativo. Assim, garantindo um ótimo desempenho em seu .NET/.NET Core aplicação.
Para obter uma imagem adequada de onde exatamente NCache está dentro de sua pilha de aplicativos, vamos dar uma olhada na arquitetura básica.
O MongoDB é considerado mais escalável em comparação com bancos de dados relacionais, mas o fato de ser um armazenamento de dados baseado em disco continua sendo uma desvantagem. Então, usando NCache fornece cache de dados baseado em memória enquanto permanece dentro ou fora da VNet do seu aplicativo (totalmente sua chamada). Isso torna os processos do seu aplicativo muito mais rápidos do que o desejado, reduzindo a latência.
Isso não lhe dá mais motivos para usar NCache para armazenar em cache os dados do seu banco de dados? Não vamos parar por aqui e mergulhar um pouco mais fundo no que NCache traz para a mesa.
NCache Adicionar ao carrinho Sincronizar cache com banco de dados NCache NoSql Datastore
Como armazenar em cache com o MongoDB
O armazenamento em cache com o MongoDB é extremamente fácil. Se você deseja pesquisar dados específicos no cache ou consultar o próprio banco de dados para buscar os dados necessários, ou simplesmente adicionar novos dados ao banco de dados, tudo pode ser feito com a maior facilidade usando NCache.
O trecho a seguir explica como realizar todas essas operações mencionadas em seu aplicativo de e-commerce. Aqui buscamos um cliente seu muito fiel e inteligente, Einstein, no cache para executar Operações CRUD nele. E caso o cache não tenha o cliente solicitado, pesquisamos o banco de dados por ele. Uma vez recuperado, adicionamos esse cliente ao cache com um expiração de 5 minutos. Isso é feito para que o cache nunca tem dados obsoletos para lhe oferecer. Assim, garantindo a consistência dos dados.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var customer = cache.Get("Customer:CustomerID:EINSTEIN"); if (customer == null) { MongoClient mongoClient = new MongoClient("mongodb://20.200.20.10:27017"); IMongoDatabase mongoDatabase = mongoClient.GetDatabase("DemoDatabase"); IMongoCollection <Customer> mongoCollection = mongoDatabase.GetCollection<Customer>("Customers"); response = mongoCollection.FindAsync<Customer>(x => x.Id == "EINSTEIN").GetAwaiter().GetResult().ToList<Customer>(); customer = (Customer)response.FirstOrDefault(); var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); var cacheItem = new CacheItem(customer) { Expiration = expiration }; cache.Insert($"Customer:CustomerID:{customer.Id}", cacheItem); } |
NCache Adicionar ao carrinho Sincronizar cache com banco de dados NCache NoSql Datastore
Coleção de armazenamento em cache de itens do banco de dados
A maior vantagem de apresentar NCache à sua aplicação e ao banco de dados é que as viagens ao banco de dados especialmente para operações de leitura reduzir consideravelmente, reduzindo chamadas de rede desnecessárias e melhorando o desempenho. A única razão para esse posicionamento lógico é que toda vez que você deseja recuperar itens do banco de dados e realizar operações nele, você pode fazer tudo na camada de armazenamento em cache.
Para conseguir isso, NCache permite armazenar em cache uma coleção do MongoDB como um item de cache ou um item individual como um item de cache. Vejamos como armazenar itens em cache como pares de valores-chave em NCache do MongoDB.
Coleta de cache como item único
Cache de uma coleção de itens como um único Item de cache é útil quando os itens são semelhantes ou se enquadram na mesma categoria. Por exemplo, vamos supor que o banco de dados do seu aplicativo tenha uma lista de clientes espalhados pelo mundo, mas você queira consultar os que moram na Alemanha (porque seu Einstein sempre favorito é da Alemanha). Você deseja que essa consulta retorne todos esses clientes na forma de uma única lista para que essa lista possa ser adicionada ao cache. Veja como você faz isso:
1 2 3 4 5 6 7 |
var customersInGermany = mongoCollection.FindAsync(x => x.Country == 'Germany').GetAwaiter().GetResult().ToList(); if(customersInGermany > 0) { var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); var cacheItem = new CacheItem(customersInGermany) { Expiration = expiration }; cache.Insert("CustomersInGernamy", cacheItem); } |
Cache de itens de coleção separadamente
Caso você queira associar informações adicionais a cada item como Tag, crachás e grupos para facilitar a recuperação de dados, você deve armazenar em cache cada item separadamente usando identificadores exclusivos. Dessa forma, você pode recuperar vários itens com base em uma tag lógica, por exemplo, todos os clientes que vivem na Alemanha.
Para armazenar em cache todos os clientes que moram na Alemanha, você pode adicionar a tag Customer:Country:Germany
com o conjunto de dados da consulta. Aqui está um exemplo de como armazenar em cache todos os clientes alemães com a tag “Alemanha”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var customersInGermany = mongoCollection.FindAsync(x => x.Country == 'Germany').GetAwaiter().GetResult().ToList(); if(customersInGermany > 0) { var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); foreach (var customer in customersInGermany) { cacheItem = new CacheItem(customer) { Tags = new[] { new Tag("Customer:Country:Germany") }, Expiration = expiration }; cache.Add($"Customer:CustomerID:{customer.Id}", cacheItem); } } |
Até este ponto, discutimos em detalhes como manipular dados entre seu aplicativo e o MongoDB usando NCache. Você pode dizer como é fácil acessar e manipular dados executando Operações CRUD em tudo por causa NCache. Deixe-me agora levá-lo em um breve tour de como NCache traz eficiência ao prato; a cereja no topo, se puder.
Aqui estão algumas das características que NCache fornece para melhorar o desempenho do seu aplicativo de comércio eletrônico que usa o MongoDB.
NCache Adicionar ao carrinho Sincronizar cache com banco de dados NCache NoSql Datastore
Erradicar o custo de serialização com o cache serializado JSON
O MongoDB armazena dados na forma de JSON binário (BSON), que é a serialização codificada em binário de documentos semelhantes a JSON. Isso funciona perfeitamente com NCache uma vez que suporta o Serialização JSON de objetos. Este MongoDB-NCache a colaboração não apenas melhora o tempo de desempenho do seu aplicativo, evitando a necessidade de serializar/desserializar dados, mas também mantém a precisão de seus dados.
1 2 3 4 5 |
var response = mongoCollection.FindAsync<Customer>(x => x.Id == "EINSTEIN").GetAwaiter().GetResult().ToList<Customer>(); Customer customer = (Customer)response.FirstOrDefault(); JObject customerJson = JObject.Parse(JsonSerializer.Serialize(customer)); cache.Insert($"Customer:CustomerID:{customer.Id}", customerJson); customer = cache.Get<Customer>($"Customer:CustomerID:EINSTEIN "); |
Provedores de fonte de dados para otimização de recursos
NCache fornece Provedores de fonte de dados para garantir a entrada de um único ponto na camada de acesso a dados de seu aplicativo; o ponto de entrada é o seu cache. Caso os dados não estejam disponíveis no cache, um Leia O provedor é responsável por acessar o banco de dados, pesquisar e recuperar os dados necessários, armazená-los em cache para uso futuro e apresentá-los ao aplicativo.
1 |
var customer = cache.Get<Customer>( "EINSTEIN", new ReadThruOptions(ReadMode.ReadThru, "mongoDBReadThroughProvider")); |
Da mesma forma, você tem um Gravação provedor para quando você deseja executar uma operação de gravação no banco de dados. Você simplesmente precisa realizar a operação necessária no cache e o cache gravará automaticamente os dados no banco de dados para você. Vamos adicionar “Einstein 2” no cache para que ele adicione a versão 2.0 do seu cliente favorito no banco de dados usando WriteThru
.
1 2 3 4 |
Customer customer = new Customer(); customer.Id = "EINSTEIN2"; ... cache.Insert(customer.Id,new CacheItem(customer),new WriteThruOptions(WriteMode.WriteThru,"mongoDBWriteThroughProvider"); |
NCache Adicionar ao carrinho Sincronizar cache com banco de dados NCache NoSql Datastore
Consultar dados de cache
Ao usar NCache como a camada de cache intermediária entre seu aplicativo .NET e o MongoDB, NCache oferece-lhe a capacidade de pesquisar dados em cache indexados por meio de consultas. Consultar dados de cache na memória reduz diretamente o custo de viagem que uma consulta normalmente deveria assumir em uma rede.
Um snippet de código de exemplo que descreve o uso de consulta de dados indexados em NCache é mostrado aqui:
1 2 3 4 5 6 7 8 9 10 11 12 |
string query = "SELECT * FROM Models.Customer WHERE Country == ?"; var queryCommand = new QueryCommand (query); queryCommand.Parameters.Add("Country", "Germany"); ICacheReader reader = cache.SearchService.ExecuteReader(queryCommand); if (reader.FieldCount > 0) { while (reader.Read()) { string result = reader.GetValue("ContactName"); // Perform operations } } |
Concluindo tudo
Considerando todos os funcionalidades e funcionalidades que NCache oferece-lhe, é seguro concluir que não há melhor correspondência do que NCache cache do MongoDB. Aqui está o porquê. O MongoDB fica longe do seu aplicativo; você precisa de uma solução que permaneça próxima para aumentar o desempenho: NCache fornece isso por estar na memória. Você precisa de uma solução que permita adicionar qualquer número de servidores em tempo de execução: linearmente escalável NCache traz isso para você. Você está procurando uma solução flexível que reequilibre automaticamente seus dados dinamicamente: NCache faz exatamente isso sem qualquer interferência do cliente.
NCache oferece muito na forma de desempenho, redução de custos, flexibilidade, escalabilidade, então o que mais você está procurando? Vai pegar NCache e aproveite o cache!
NCache Adicionar ao carrinho Baixar NCache Comparação de edições