Se a sua aplicação depende muito de dados e interage frequentemente com um banco de dados, o armazenamento em cache torna-se crucial para mitigar quaisquer custos associados. Aplicativos online que usam cache para acelerar a recuperação de dados, implementando forte replicação e consistência de dados é essencial.
A replicação de dados é fundamental para criar backup de dados críticos em vários servidores, garantindo informações precisas e acessíveis. Da mesma forma, esses mecanismos de consistência são vitais para sincronizar perfeitamente essas cópias distribuídas, evitando quaisquer discrepâncias no processo de aplicação. Portanto, para garantir que seu aplicativo interaja com dados precisos e atualizados, você deve empregar esses recursos para backups, alta disponibilidade e consistência de dados.
Felizmente, NCache fornece um conjunto confiável de mecanismos de replicação e sincronização exatamente para esses sistemas distribuídos. Este blog detalha como NCache preenche essas condições.
NCache Topologias
As topologias de cache suportadas por NCache incluem o Topologia espelhada, Topologia replicada, Topologia de Partição e Réplica de Partição e Topologia de cache do cliente.
- Topologia do espelho: Para todas as operações de leitura e gravação na topologia de Cache Espelhado, os nós clientes se conectam apenas ao nó do servidor ativo do cluster. Os aplicativos cliente estabelecem imediatamente uma conexão com o nó anteriormente passivo se o nó do servidor ativo ficar inativo.
- Topologia replicada: A Topologia Replicada garante que, se vários servidores falharem ao mesmo tempo, os dados não serão perdidos, pois cada servidor possui a mesma cópia dos dados.
- Topologia de partição: Ao conectar todos os aplicativos clientes aos servidores de cache, a Topologia de Partição oferece alta disponibilidade de dados, dividindo os dados em partes – conectando, portanto, todos os aplicativos clientes aos servidores de cache. Desta forma, a aplicação obtém os dados necessários mesmo que o servidor conectado fique inativo, solicitando os demais servidores.
- Topologia Partição-Réplica: A Topologia Partição-Réplica não cria apenas partições dinâmicas, mas também réplicas dinâmicas dessas partições em outros nós do servidor, que atuam como backup no caso de falha de conexão ou de nó. Nessas situações, NCache obtém dados do nó de réplica e os distribui.
- Topologia de cache do cliente: na topologia de cache do cliente, o cache reside muito próximo do seu aplicativo e permite armazenar rapidamente os dados do cache distribuído.
Saiba mais sobre topologias no blog: Expandindo e mantendo-se atualizado: explorando topologias em NCache.
Replicação de dados em NCache
O objetivo principal da replicação de dados é garantir a consistência, disponibilidade e tolerância a falhas dos dados. Ao manter cópias idênticas de dados em locais diferentes, os sistemas podem melhorar o desempenho, reduzir a latência e proteger contra possíveis perdas de dados ou falhas de servidor.
É síncrono ou assíncrono, dependendo da topologia utilizada. Na replicação síncrona, NCache garante que os dados sejam gravados simultaneamente no servidor de cache primário e em suas réplicas. No entanto, este método garante uma forte consistência de dados, mas o desempenho pode ser prejudicado, uma vez que qualquer operação de gravação em cache deve aguardar a confirmação de todas as réplicas.
Como alternativa, a replicação assíncrona atualiza as réplicas após gravar dados no servidor de cache primário. Como essas operações de escrita em caches não aguardam a confirmação da réplica, esta estratégia oferece maiores ganhos de desempenho. Embora esta estratégia possa resultar em inconsistências temporárias de dados entre as réplicas e o servidor de cache primário.
Topologias para replicação de dados síncrona e assíncrona
Cada uma das topologias discutidas oferece seu próprio conjunto de características, nem todas atendem à replicação de dados. Por exemplo, a replicação sincronizada, empregada no Topologia de Cache Espelhada, garante a consistência dos dados gravando simultaneamente nos nós primários e de réplica. Por outro lado, escrevendo primeiro nos nós primários e atualizando as réplicas depois, a replicação assíncrona, usada no Topologia de cache replicado, melhora a eficiência, mas ocasionalmente pode resultar em erros.
Felizmente, o Topologia Partição-Réplica atinge um equilíbrio entre redundância, disponibilidade e desempenho combinando as vantagens das topologias de cache particionado e replicado. Os usuários podem selecionar a melhor técnica com base em suas necessidades.
Mecanismos de consistência de dados
A consistência dos dados refere-se à confiabilidade e precisão das informações em um sistema ou banco de dados, garantindo que os dados permaneçam precisos e confiáveis durante várias operações. Para garantir a consistência dos dados, NCache fornece um mecanismo de Bloqueio distribuído que permite bloquear itens de cache específicos durante atualizações simultâneas. Vários usuários podem trabalhar em vários itens de cache simultaneamente sem comprometer a integridade dos dados aplicando bloqueios. Portanto, os bloqueios de cache são úteis para gerenciar recursos compartilhados em um ambiente distribuído.
Para manter a consistência dos dados, NCache atua como um gerenciador de bloqueio distribuído e fornece dois tipos de bloqueio: Bloqueio otimista (versões de itens de cache) e Bloqueio Pessimista (Bloqueio Exclusivo). Usos de bloqueio otimista Controle de versão do item de cache. Nesse tipo de bloqueio, o método Add adiciona um novo item ao cache e salva a versão do item pela primeira vez, enquanto o método insert sobrescreve o valor de um item existente e atualiza sua versão do item. O exemplo a seguir cria um LockHandle e, em seguida, bloqueia um item com a chave Product:1001 por um intervalo de tempo de 10 segundos, para que o item seja desbloqueado automaticamente após 10 segundos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Prerequisite: Cache is already connected // Item is already added in the cache // Specify the key of the item string key = $"Product:1001"; // Create a new LockHandle LockHandle lockHandle = null; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = TimeSpan.FromSeconds(10); // Lock the item for a time span of 10 seconds bool lockAcquired = cache.Lock(key, lockSpan, out lockHandle); // Verify if the item is locked successfully if (lockAcquired == true) { // Item has been successfully locked } else { // Key does not exist // Item is already locked with a different LockHandle } |
Alternativamente, o Bloqueio Pessimista bloqueia o item usando o Alça de bloqueio, impedindo que todos os outros usuários executem qualquer operação de gravação nesse item de cache. Ao adquirir o bloqueio com sucesso ao buscar o item, o aplicativo agora pode executar operações com segurança, sabendo que nenhum outro aplicativo poderá obter ou atualizar esse item enquanto você tiver esse bloqueio. O exemplo a seguir bloqueia um item no cache e, em seguida, obtém o item usando lockHandle. O item é então atualizado e reinserido no cache usando a API Insert.
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 |
// Specify the key of the item string key = $"Product:1001"; // Set acquireLock flag as true bool acquireLock = true; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = new TimeSpan(0, 0, 10); // Initialize the lockHandle LockHandle lockHandle = null; CacheItem item = cache.GetCacheItem(key, acquireLock, lockSpan, ref lockHandle); var product = new Product(); product = item.GetValue(); // Update the unitsinstock for the product product.UnitsInStock = 200; bool releaseLock = true; // Item is already locked with a LockHandle // Update the item and release the lock as well since releaseLock is set true // Make sure that the LockHandle matches with the already added LockHandle cache.Insert(key, item, null, lockHandle, releaseLock); |
Melhores práticas para replicação e consistência de dados
Agora que aprendemos sobre os mecanismos de replicação e consistência de dados fornecidos pelo NCache, vamos explorar as práticas recomendadas neste contexto. A Topologia Replicada é a melhor escolha para uma aplicação que precisa de alta disponibilidade e pode sobreviver a falhas de (n-1) nós sem qualquer perda de dados. Considerando que a topologia partição-réplica fornece alta disponibilidade e capacidade para satisfazer necessidades de dados em expansão.
Embora não seja tão altamente disponível quanto a topologia replicada, ainda pode suportar falhas de nós sem qualquer perda de dados. Cada partição possui um backup; assim, cada nó possui essencialmente uma partição e um backup de outra partição. Por outro lado, a Topologia Espelhada oferece confiabilidade e disponibilidade de dados por meio de replicação assíncrona do Nó Ativo para o Nó Passivo.
NCache também oferece suporte a estratégias de invalidação de dados baseadas em tempo para expirar dados de cache. Invalidação de dados através Expiration significa que você pode especificar o tempo durante o qual os dados permanecem no cache, após o qual eles expiram. Dessa forma, seu cache terá os dados atualizados na próxima solicitação do cliente, eliminando assim dados obsoletos – garantindo a consistência dos dados. Invalidação através Dependências garante que os dados do cache sejam removidos sempre que ocorrerem alterações no banco de dados.
Conclusão
A replicação e a consistência dos dados são a espinha dorsal de um aplicativo confiável e de alto desempenho. Felizmente, com NCache, você terá acesso a recursos robustos que permitem criar aplicativos altamente escaláveis e tolerantes a falhas que podem lidar até mesmo com as necessidades de dados mais complexas.