Com o desenvolvimento de aplicativos distribuídos de alta transação, as soluções de cache distribuído tornaram-se altamente desejáveis para alcançar escalabilidade de desempenho. NCache é uma boa escolha como um armazenamento de dados distribuído na memória, pois fornece escalabilidade linear e alta disponibilidade.
Até agora, tudo bem, mas como garantir a integridade dos dados em tais ambientes compartilhados é uma grande questão. Como dois ou mais clientes podem acessar e alterar os mesmos dados simultaneamente no seu aplicativo, o resultado pode ser dados inconsistentes. Quando ocorrem violações de integridade dos dados, os dados no cache tornam-se praticamente inúteis.
Nesta postagem do blog, explicarei como esse problema ocorre e como NCache te salva com seu bloqueio distribuído recurso.
NCache Adicionar ao carrinho NCache Bloqueio Ncache Docs
Problemas de integridade de dados sem bloqueio
Para entender o problema de integridade de dados em detalhes, consideramos o exemplo de uma loja de comércio eletrônico on-line em que os vendedores carregam seus produtos enquanto os clientes visualizam e fazem pedidos para comprar esses produtos.
Suponha que um cliente queira ver um determinado produto e o vendedor desse produto queira atualizar seu preço. Agora, se um cliente estiver visualizando um produto por um preço mais alto e o vendedor adicionar um desconto que o usuário ainda não pode ver, o usuário acaba comprando o produto por um preço mais alto.
O cenário é mostrado na Figura 1.
- O cliente 1 lê os detalhes do produto no cache.
- O Cliente 2 também lê os dados do produto. Isso está correto.
- O Cliente 1 agora atualiza os detalhes do produto no cache.
- O Cliente 2 também atualiza os detalhes do produto no cache.
- As atualizações feitas pelo cliente 1 são perdidas.
Vamos ver como NCache resolve este problema.
NCache Adicionar ao carrinho Bloqueio Pessimista Bloqueio otimista
NCache Bloqueio distribuído
NCache fornece uma maneira flexível de proteger seus dados de acordo com suas necessidades de negócios, permitindo que você bloqueie seus dados. Um usuário assume o controle de um bloco de dados e o atualiza. Enquanto isso, nenhum outro usuário pode manipular esses dados.
Com base no seu cenário de aplicação, você pode escolher qualquer um destes NCache mecanismos de travamento:
- Bloqueio pessimista (bloqueios transacionais ou exclusivos): Bloqueia um item exclusivamente o que o torna inacessível para outros usuários.
- Bloqueio otimista (bloqueio por versão de item): Usa versão de item que torna um item acessível para outros usuários.
Bloqueio pessimista para dados confidenciais
Você deve usar o estratégia de bloqueio pessimista quando os dados que requerem atualizações em seu aplicativo são confidenciais. Você pode usar um LockHandle para adquirir um bloqueio explícito em seus dados. Quando terminar, o bloqueio será liberado.
Agora, vemos que como NCache o bloqueio pessimista resolve o problema de consistência de dados em nosso exemplo. Você pode adquirir um bloqueio exclusivo no produto para atualizar enquanto isso, nenhum outro usuário pode acessar esse produto. Isso é ilustrado na figura 2.
- O Cliente 1 adquire o bloqueio do produto e começa a adicionar e atualizar os detalhes do produto.
- O cliente 2 não tem acesso para ler detalhes do produto e deve esperar até que o bloqueio seja liberado.
- Uma vez que o bloqueio é liberado, o Cliente 2 pode continuar suas operações regulares no produto.
É importante notar que, NCache suporta dois conjuntos de APIs: com e sem bloqueio. Se o usuário quiser usar o bloqueio pessimista, as APIs com parâmetros de bloqueio devem ser usadas em todos os aplicativos em que uma forte consistência de dados é o requisito. Vamos ver como você pode fazer isso com NCache recurso de travamento. No segmento de código a seguir, primeiro, um novo LockHandle é criado e, em seguida, o intervalo de tempo é definido para especificar o período de tempo para o qual o bloqueio será adquirido. Este LockHandle funciona como um ID de bloqueio para identificar o bloqueio. Um bloqueio é então adquirido usando o método Get com uma chave e LockHandle.
Agora você pode realizar suas operações comerciais e liberar manualmente o bloqueio ou aguardar o término do período de tempo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// Pre-condition: Cache is already connected // Create a new lock handle to fetch an Item using locking LockHandle lockHandle = new LockHandle(); // Timespan for which lock is to be taken TimeSpan timeSpan = TimeSpan.FromSeconds(5); // Get item from the cache and lock it var result = cache.Get(key, true, timeSpan, ref lockHandle); // Verify if the item is locked successfully if (result != null) { // Item has been successfully locked } else { // Key does not exist // Item is already locked with a different LockHandle } //Unlock item in cache manually cache.Unlock(key, lockHandle); |
Aqui, Obter API com parâmetros de bloqueio retorna imediatamente sem esperar pela aquisição de bloqueio. Você precisa fazer reties explícitos para adquirir um bloqueio em itens no caso de você falhar em primeiro lugar.
Você também pode adquirir um bloqueio usando o método Lock que associa um LockHandle a uma chave. NCache oferece várias maneiras de adquirir/liberar um bloqueio explícito que permite o travamento flexível. Se você pretende implementar NCache travamento, usando o NCache aplicativo de amostra para travamento de itens GitHub será útil.
NCache Adicionar ao carrinho Bloqueio Pessimista Bloqueio otimista
Bloqueio otimista para disponibilidade de dados
O bloqueio pessimista é ótimo, mas pode não ser uma abordagem ideal quando o tempo de resposta é crítico para seu aplicativo. É aqui que o bloqueio otimista é útil.
NCache usos de bloqueio otimista versionamento de itens de cache para superar a fome de encadeamento causada no caso de bloqueio explícito. Portanto, você pode trabalhar em uma versão do item em cache que é incrementada a cada atualização desse item. NCache mantém o controle da versão do item e você não precisa se preocupar com a consistência dos dados.
A Figura 3 mostra como isso é feito:
- O cliente 1 adiciona detalhes sobre o produto e o CacheItemVersion é definido como v1.
- O cliente 2 lê os detalhes atualizados do produto com CacheItemVersion v1.
- O cliente 1 novamente altera os detalhes devido aos quais CacheItemVersion é incrementado e se torna v2.
- Agora, quando o Cliente 2 tenta atualizar os detalhes usando o antigo CacheItemVersion v1, a operação falha com CacheItemVersion
- O cliente 2 obtém o CacheItemVersion mais recente
- O cliente 2 atualiza os detalhes do produto usando CacheItemVersion. Agora a operação é executada com sucesso e incrementa CacheItemVersion em 1 automaticamente.
Isso garante que todos os usuários tenham atualizado o CacheItemVersion em todos os momentos e nenhum usuário tenha acesso recusado a qualquer produto na loja.
O código a seguir mostra como fazer isso:
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 |
// Specify the key of the cacheItem string key = "Product:1001"; // Initialize the cacheItemVersion CacheItemVersion version = null; // Get the cacheItem previously added in the cache with the version CacheItem cacheItem = cache.GetCacheItem(key, ref version); // If result is not null if (cacheItem != null) { // CacheItem is retrieved successfully with the version var prod = cacheItem.GetValue(); prod.Discount = 0.5; // Create a new cacheItem with updated value var updateItem = new CacheItem(prod); //Set the itemversion. This version is used to compare the // item version of the cached item updateItem.Version = version; //Insert call will fail with LockingException, if cache contains a newer version of the cache item. //In case of LockingException, we can fetch the latest cache item from cache and update it cache.Insert(key, updateItem); // If it matches, the insert is successful, otherwise it fails } |
Por que usar NCache Bloqueio
Dados seguros e consistentes são cruciais para as empresas de hoje e seria uma pena se algo tão simples como transações multiusuário prejudicasse a integridade dos seus dados.
NCache garante a integridade e consistência de seus dados em ambientes altamente distribuídos com máxima flexibilidade. Com base no cenário do seu aplicativo, você pode adotar diferentes mecanismos de bloqueio de várias maneiras fornecidas pelo NCache. Eventualmente, você terá simultaneidade sem qualquer inconsistência de dados!
NCache Adicionar ao carrinho Baixar NCache Comparação de edições
Essas informações incríveis que você tem, para dar aos outros. Obrigado por nos informar sobre isso. Continue compartilhando essas informações, que garantem a segurança de nossas propriedades.