Campo de código .NET da Filadélfia

Otimizar ASP.NET Core Desempenho com cache distribuído

Por Iqbal Khan
Presidente e Evangelista de Tecnologia

ASP.NET Core está rapidamente se tornando popular para o desenvolvimento de aplicativos da Web de alto tráfego. Aprenda a otimizar ASP.NET Core desempenho para lidar com cargas de transações extremas sem diminuir a velocidade usando um Cache Distribuído .NET de código aberto. Esta conversa abrange:

  • Visão geral rápida do ASP.NET Core gargalos de desempenho
  • Visão geral do cache distribuído e como ele resolve problemas de desempenho
  • Onde você pode usar o cache distribuído em seus aplicativos
  • Alguns recursos importantes de cache distribuído
  • Exemplos práticos usando código aberto NCache como o cache distribuído

O tópico de hoje é como otimizar o ASP.NET core atuação. Eu prefiro ter discussões mais interativas, então, como estou falando, se vocês tiverem alguma dúvida, por favor, levantem a mão para que possamos tirar. Então, tenho certeza que você está aqui porque o ASP.NET core é agora a tecnologia popular para o desenvolvimento de quaisquer novos aplicativos .NET ou aplicativos da Web .NET porque possui uma arquitetura limpa e leve. Você provavelmente já está no MVC do ASP.NET. Então, se for esse o caso, mudar para um ASP.NET core vai ser bem fácil. ASP.NET core é leve. É multiplataforma, é de código aberto e há uma enorme base de usuários ASP.NET herdada que torna muito provável que a maioria de vocês esteja migrando para ASP.NET Core.

Então, ASP.NET core daqui para frente será a escolha, a escolha de tecnologia para .NET, para desenvolver aplicativos da Web de alto tráfego ou aplicativos de servidor de alto tráfego e aplicativos da Web. Isso significa ASP.NET core precisa de escalabilidade e tenho certeza que é por isso que você está aqui. Vamos apenas entender as definições antes de nos aprofundarmos mais.

O que é escalabilidade?

O que é escalabilidade? Escalabilidade significa essencialmente que, se você tiver um aplicativo com cinco usuários e ele for super rápido, bom tempo de resposta, poderá manter o mesmo tempo de resposta, o mesmo desempenho com cinco mil ou cinquenta mil ou quinhentos mil usuários, usuários simultâneos do seu aplicativo é escalável. Se seu aplicativo não está funcionando bem com cinco usuários, então isso não é conversa para você, então você tem outros, você provavelmente precisa olhar a maneira como está acessando seu banco de dados e fazendo sua programação geral. Isso pressupõe que você fez um bom trabalho, desenvolvendo aplicativos para pelo menos alguns usuários e, em seguida, precisa saber como escalá-los.

O que é escalabilidade linear?

A escalabilidade linear significa que você pode adicionar mais servidores em produção e, à medida que adiciona mais servidores, pode adicionar de forma linear a capacidade de transação.

escalabilidade linear

Agora vou entrar em mais detalhes, mas o que acontece é que, digamos que você comece com dois servidores web farm balanceados. Depois de um certo número de usuários, esses dois servidores vão atingir o máximo e seu desempenho vai começar a diminuir e então você adiciona o terceiro servidor e de repente a capacidade deve aumentar em pelo menos um terço ou qualquer que seja a nova fórmula e então quando você vai quando você atinge o máximo de três servidores, com certeza, adicione novamente o incremental. se você puder fazer isso, terá uma arquitetura de aplicativo linearmente escalável. Se você não é capaz de fazer isso, então você tem um não linear.

O que é escalabilidade não linear?

Não linear basicamente significa que, depois de alguns servidores, adicionar mais servidores não fará diferença porque há algum gargalo em seu aplicativo que o impede de dimensionar. Portanto, seu desempenho na verdade cairá à medida que você adicionar mais carga e falará na medida em que seu aplicativo pode até travar. Então, você definitivamente não quer escalabilidade não linear, o que basicamente significa que depois de certo ponto não há escalabilidade.

escalabilidade não linear

Quais aplicativos precisam de escalabilidade

Então, que tipo de aplicativos precisam de escalabilidade? Esses são todos os aplicativos de servidor. Estas são suas aplicações web que tem o ASP.NET core serviços web, novamente ASP.NET core. Se você desenvolve em microsserviços, os microsserviços estão se tornando um grande chavão agora e, devido ao fato de poder executá-los em contêineres e em ambiente conteinerizado, você pode executar até ASP.NET core em ambiente conteinerizado, mas os microsserviços são outro caso de uso muito bom para escalabilidade ou qualquer outro aplicativo de servidor em que você esteja processando muitas transações no back-end.

Portanto, se você tiver algum desses tipos de aplicativos, geralmente eles são voltados para o cliente, voltados para a saída ou, pelo menos, fazem parte do aplicativo voltado para a saída. Digamos que, se o seu aplicativo de serviços da Web, você fizer parte de um aplicativo da Web geral e houver uma camada de serviços da Web, o mesmo acontece com os microsserviços, mas geralmente são voltados para o cliente ou voltados para a saída, mas nem sempre. Se você é uma grande empresa, pode ter dezenas de milhares de usuários internos, mas na maioria das vezes são coisas externas.

O problema e a solução de escalabilidade

Portanto, há um problema de escalabilidade e é por isso que estamos tendo essa conversa hoje e o problema de escalabilidade não está na sua camada de aplicativo. Portanto, se você tiver um ambiente com balanceamento de carga, sua camada de aplicativo será dimensionada de forma muito linear. Você pode adicionar mais servidores, sem problemas. É o banco de dados ou o armazenamento de dados. Qualquer tipo de dados que está armazenando, que podem ser seus dados de aplicativo, que podem ser suas sessões, que podem ser quaisquer outros dados que você está armazenando ou buscando que se torna um gargalo e é por isso, é uma das razões pelas quais NoSQL databases ganhou popularidade.

NoSQL Database

O problema com NoSQL databases é que, eles exigem que você se afaste dos bancos de dados relacionais. O que vimos é que para muitas situações, deixe-me dizer que na maioria dos casos, você pode usar NoSQL databases para alguns dados, mas muitos dados ainda precisam residir em bancos de dados relacionais. Portanto, você ainda usará o SQL Server ou o banco de dados SQL no Azure. Portanto, você precisa resolver esse problema de escalabilidade com bancos de dados relacionais. NoSQL databases nem sempre são a resposta porque você não pode usá-los, você não pode substituir um banco de dados relacional por um NoSQL database sempre. E, se você não pode substituí-lo, se você não pode usá-lo, você não pode se beneficiar dele. Mesmo se você pudesse usar um NoSQL database, eles ainda não fornecem o desempenho que o cache distribuído de memória fornece. Então, você ainda precisaria de muitas das coisas de que estou falando.

Então, vamos ver o que acontece na verdade e deixe-me realmente entrar nisso. O problema de escalabilidade é algo que você realmente não quer esperar até que aconteça. Porque se você está desenvolvendo um aplicativo e diz que ele está funcionando bem hoje e é bom para mil usuários ou qualquer que seja o número de usuários que você tem e de repente sua empresa começa a se tornar popular, você tem muito mais clientes vindo em sua direção. Você está no marketing ou seu departamento de negócios fez um bom trabalho e de repente seu aplicativo começa a desacelerar e isso foi documentado por meio de estudos que estão a cada segundo de lentidão, um aplicativo da web resulta em perda de receita. Como seus clientes em muitos desses negócios on-line, os tipos de negócios on-line são negócios de comércio eletrônico, negócios de varejo com lojas on-line, isso pode ser assistência médica, governo eletrônico, mídia social, jogos de azar on-line, indústria de viagens. Muitas empresas estão online porque qualquer empresa que tenha que lidar com consumidores que fará negócios com eles. Estes são consumidores ou dezenas de milhares, eles geralmente vão ficar online com eles. E on-line nem sempre é um aplicativo da Web, também pode ser um aplicativo de serviços da Web, porque você pode ter um aplicativo móvel que se comunicará com um back-end.

Portanto, não é uma boa ideia esperar até que você tenha problemas de escalabilidade, porque isso será muito caro para o seu negócio. Esses aplicativos ficarão mais lentos, pois você viu que a curva não linear naquele momento, adicionando mais serviço, não ajudará. Então, você precisa planejar isso com antecedência. Certifique-se de que a arquitetura do seu aplicativo esteja correta e esteja aproveitando isso. É quase obrigatório como prática recomendada para você incorporar um cache distribuído em sua arquitetura de aplicativo.

Cache distribuído

Então, como um cache distribuído ajuda? vou usar NCache como exemplo aqui e NCache é um cache distribuído de código aberto para .NET. Você pode encontrá-lo no GitHub e também em nosso site e também há a Enterprise Edition. Então, se você não tem dinheiro ou não tem orçamento, vá com o código aberto. Se você deseja uma versão mais suportada com mais recursos do que o código aberto, vá com o Enterprise. Então, eu vou usar NCache como o exemplo, mas não estou falando NCache. Estou falando de cache em geral. Então, como um cache distribuído ajuda? Bem, digamos que no caso de NCache ele cria um cluster de dois ou mais servidores para que você possa ver essa camada intermediária, que é uma camada de cache, que terá dois e esses dois servidores e talvez mais de dois, dependendo de quantos servidores você tem aqui? Quanta carga você tem aqui?

ncache-desdobramento, desenvolvimento

Então, quando você não tem um cache distribuído, o banco de dados é apenas um servidor, você não pode realmente distribuir um banco de dados relacional. Quero dizer, os bancos de dados relacionais do SQL Server estão tentando melhorar seu desempenho. Por exemplo, eles têm tabelas de memória agora. O SQL também possui réplicas somente leitura do banco de dados. Então, que as leituras podem ser replicadas, mas o problema com as réplicas é que cada atualização é muito mais lenta porque toda vez que você atualiza, serão atualizados cinco ou quatro lugares. Portanto, não é a maneira ideal de resolver isso. Há uma maneira melhor que é o cache distribuído e o motivo pelo qual um cache distribuído é escalável é a palavra distribuído e o motivo pelo qual ele pode ser distribuído é porque é um armazenamento de valor de chave. Tudo é armazenado com base em uma chave. A chave pode ser facilmente mapeada por hash em várias partições e cada partição é um servidor e é assim que você obtém a distribuição.

Então, você tem um mínimo de dois servidores de cache, uma configuração típica que vemos é cerca de 16 a 32 giga por servidor como memória porque, novamente, é um armazenamento na memória, então você precisa ter muita memória. E ele forma um cluster, é um cluster baseado em TCP que puxa essa memória e CPU como um recurso do cluster. Então, digamos que você começou com um aplicativo da Web claro com 4 ou 6 servidores da Web, então, você terá 2 servidores de cache e digamos 16 a 32 GB de memória e agora você está começando a obter mais e mais e 80% do tempo que você entra no cache, 20% você vai ao banco de dados para as atualizações. Pode até ser menos de 20% depende de quantas atualizações você está fazendo. Para alguns dados, as atualizações são mais do que outras, mas digamos novamente, você adicionará mais servidores à camada de aplicativo aqui e fará novamente o que fez com o banco de dados. Vai maximizar a camada de cache. Então, você tem apenas 2 servidores. Digamos que você tenha alcançado cerca de 8 servidores no web farm aqui. Porque como eu disse, quanto mais usuários você tem mais serviço de aplicativo. Então, isso vai atingir o máximo. Assim que atinge o máximo, adicionamos o terceiro servidor. E estes não são servidores muito sofisticados. Estes são servidores de baixo custo.

Normalmente, um servidor típico tem cerca de 8 núcleos. Se você conseguir mais de 30 GB de ram, então você deve ir para 16 núcleos porque mais RAM você tem mais coleta de lixo que tem que fazer porque não é coisa de memória gerenciada e então você precisa de mais poder de processamento. Mas, recomendamos para a maioria dos nossos clientes, e novamente essas recomendações também se aplicam ao código aberto, recomendamos aos nossos clientes que usem entre 16 e 32 GB de RAM por servidor. Basta adicionar mais servidores em vez de obter realmente alguns serviços de última geração que adicionam mais servidores. Então, quando dois servidores estão no máximo, basta adicionar um terceiro e a mesma coisa acontece, você pode adicionar um quarto ou quinto e provavelmente nunca atingirá o máximo, porque qualquer capacidade de transação necessária, digamos, se você tiver 20,000 a 30,000 usuários simultâneos, isso é praticamente no topo da maioria dos aplicativos da web, quero dizer, pode haver alguns que são mais, talvez haja mais de cem mil usuários simultâneos, mas se você tiver 20,000 usuários simultâneos, isso significa que provavelmente terá milhões de pessoas acessando o site todos os dias . Então, quero dizer, estamos falando dessa escala.

Então, por causa disso, agora de repente o banco de dados não é mais o gargalo. Seus dados de aplicativo de cache… Então, é um cache comum. É um cache compartilhado. Então, quando você coloca esse cache aqui, porque é um cache na memória, na memória significa que se qualquer servidor de cache cair, você perderá dados. Então, isso significa que o cache deve fornecer replicação inteligente, mas NCache faz para garantir que, se qualquer servidor cair, outro servidor tenha uma cópia desses dados, mas se você fizer muitas cópias, isso também diminui a velocidade da coisa toda. Então, NCache faz apenas uma cópia dos dados e particiona. Cada partição tem backup em algum outro servidor e, assim que um servidor cai, as partições fazem outra cópia. E, por ter um cache compartilhado, agora essas caixas se tornam sem estado. Sem estado significa que não há dados armazenados na camada do aplicativo.

Portanto, o que você deve fazer é quando atingir esse objetivo de que sua camada de aplicativo não tenha estado, o que significa que você pode desativar qualquer servidor de aplicativos sem causar interferência. Digamos que você tenha que aplicar um patch, patch do sistema operacional ou uma atualização de aplicativo ou algo que você possa continuar aplicando aqui porque todos os dados estão no banco de dados ou nesta camada para que possam ser facilmente corrigidos.

Casos de uso de cache distribuído

Então, agora que estabelecemos o motivo pelo qual você deve usar o cache, qual é o benefício? Que problema ele resolve e como ele resolve esse problema. A primeira pergunta é para que você usa? Quais são os casos de uso? Onde no aplicativo você usa um cache distribuído?

Cache de dados do aplicativo

O número um é o cache de dados do aplicativo. Esse é o caso de uso que eu já falei que é que você tem um banco de dados que tem os dados do aplicativo, você armazena esses dados no cache para que você não precise ir ao banco de dados. Agora, há uma coisa que você deve ter em mente e eu voltarei a isso que no cache de dados do aplicativo, os dados têm duas cópias, uma está no mestre que é o banco de dados e uma está no cache. Sempre que você tem aquela situação em que os dados ficam em dois lugares, o que pode dar errado? Sim, as duas cópias podem ficar inconsistentes ou fora de sincronia, o que significa que o cache pode ficar obsoleto. Portanto, qualquer cache que se torna ainda força você a armazenar em cache apenas dados estáticos, dados somente leitura. E, dados somente leitura são apenas 20% de seus dados totais 80% é o que chamamos de dados transacionais. Se você não puder armazenar dados transacionais em cache, esse cache irá limitá-lo e é aqui que NCache tem alguns recursos realmente poderosos e, novamente, todos de código aberto, todos recursos realmente poderosos que ajudarão você a garantir que o cache permaneça sempre atualizado. É bom e eu vou entrar nesse momento.

ASP.NET Core Cache específico

O caso de uso número 2 é que, novamente, o cache de dados do aplicativo é para ASP.NET core e também outros aplicativos, mas para ASP.NET core, existem pelo menos dois outros usos, um é as sessões que você pode restaurar sua sessão em um cache distribuído como NCache e não há necessidade de programação para fazer isso, então é realmente muito rápido. Se você deseja obter o desempenho mais rápido dos benefícios para seu aplicativo e digamos que seu aplicativo já esteja ativo ou pronto, basta começar a mostrar suas sessões em cache distribuído como NCache. E, como não há programação, há muito pouco teste que você precisa fazer se precisar fazer, é claro, alguns testes básicos de sanidade para garantir que tudo esteja funcionando em seu ambiente, mas não há nenhum esforço de desenvolvimento envolvido. por causa disso, nenhum cronograma de desenvolvimento e nenhum cronograma de lançamento está envolvido nisso. Então, muito muito rápido.

O segundo ASP.NET core cache específico é o cache de resposta que está no ASP.NET costumava ser chamado de cache de saída, no ASP.NET core eles realmente o tornaram mais baseado em padrões. Então agora ele usa as diretivas de cache baseadas em HTTP que podem ser entendidas por soluções de cache de borda de terceiros, mas é essencialmente você está armazenando em cache a saída de uma página, então da próxima vez que a página for chamada, se a saída for a mesma, por que executar a página? Por que não apenas entregar a saída? Agora, isso é bom naquelas situações em que a saída não muda com muita frequência, o que ocorre em muitos casos, mas se você tiver um aplicativo muito dinâmico, provavelmente não terá muito contato estático, mas mesmo se você pode tê-lo por um curto período que ainda o salva. Então, ASP.NET core o cache de resposta tem um conceito de middleware e você pode conectar um cache distribuído como NCache como um middleware que basicamente vive na mesma camada que o ASP.NET core ou é o mesmo, mas o cache do middleware pode estar aqui e aqui está o ASP real.NET core inscrição. Então, esse é o segundo maior caso de uso comum para armazenamento em cache distribuído e vou entrar em um pouco mais de detalhes sobre isso, mas estou apenas dando uma visão geral.

Mensagens e eventos do Pub/Sub

O terceiro caso de uso é algo que muitas pessoas não sabem que você pode fazer mensagens pub/sub e eventos com um cache distribuído. As mensagens do Pub/Sub permitem que vários aplicativos ou várias instâncias do seu aplicativo coordenem o trabalho entre si compartilhando informações de dados de maneira assíncrona orientada a eventos. Quais são alguns dos exemplos que podemos vincular isso? Microsserviços, novamente, microsserviços são serviços desacoplados independentes, mas eles precisam ser coordenados. Quero dizer, um microsserviço pode produzir algo que é usado por outros microsserviços, é assim que o fluxo de trabalho será feito, mas eles não querem depender um do outro diretamente, caso contrário, todo o modelo quebra. Então, o que você faz é pensar nisso como não mais um cache para seu banco de dados, mas pense nisso, e eu vou na verdade... me dê um segundo, vou girar apenas para uma foto, pense em o cache distribuído agora como uma plataforma de mensagens.

pubsub-messaging-usecase

Então, toda a mudança de paradigma é que agora você tem aplicações. Podem ser várias VMs ou contêineres executando seus microsserviços ou qualquer outro aplicativo e podem se comunicar entre si de maneira pub/sub. Então, existem tópicos e existem editores e assinantes e isso simplifica muito sua aplicação.

Agora, existem outras soluções Pub/Sub, como o requisito de enfileiramento de mensagens coelho e MSMQ. O que há de tão especial em um cache distribuído como NCache? Por que você deve usar isso sobre isso? A razão para usar um cache distribuído é porque isso é muito rápido. Está tudo na memória. Ele não tem todos os recursos que uma fila de mensagens terá porque eles também serão persistentes e armazenarão as mensagens por longos períodos de tempo, mas em muitas situações você não precisa mantê-las por tanto tempo se tudo estiver funcionando dentro o mesmo data center e é um ambiente realmente transacional, mas você está usando isso mais para fluxo de trabalho, então a replicação é mais do que suficiente. O fato de você ter todos os dados mantidos em mais de um servidor é mais do que suficiente para garantir que suas mensagens e eventos não sejam perdidos. Portanto, ao contrário do cache de dados do aplicativo, onde havia duas cópias dos dados, a natureza do problema era diferente, você precisa manter o cache atualizado. No segundo e terceiro caso é o contrário, há apenas uma cópia dos dados que é o cache. Portanto, agora dentro do cache deve haver mais de uma cópia consistente para fins de replicação, porque se você não tiver isso, o cache estar na memória perderá seus dados. Portanto, você não quer perder suas mensagens, suas sessões e sua saída de página apenas porque o servidor está inativo. Portanto, as mensagens do Pub/Sub em eventos geralmente são um caso de uso realmente poderoso para um cache distribuído e, novamente, tudo isso é de código aberto.

Então, há outro recurso em NCache chamada de consulta contínua que, na verdade, nenhum outro cache de espaço .NET possui, alguns dos caches Java têm, e uma consulta contínua permite que você especifique um tipo SQL de uma consulta no cache, então, por exemplo, você poderia dizer algo como selecionar clientes onde customer.city é Nova York e você diz que estou interessado neste caso e está perguntando ao cache, por favor, monitore esse conjunto de dados. Então. qualquer objeto de cliente com este atributo, já adicionado, atualizado ou excluído do cache, por favor notifique. Então, agora você não precisa observar todos os objetos que você não pode de qualquer maneira ou é para verificar, o cache fará isso por você. É semelhante a como o SQL Server na dependência do SQL. Você pode pedir ao seu servidor para monitorar o conjunto de dados e notificá-lo quando esse conjunto de dados for alterado. Exceto que é uma ou mais linhas em uma tabela, mas aqui são objetos em um cache distribuído. Então, esses são os três casos de uso comuns.

ASP.NET Core – Cache de dados do aplicativo

Então, acho que o caso de uso mais comum é o cache de dados do aplicativo. Na verdade, a palavra cache distribuído é mais uma palavra do ecossistema da Microsoft. No lado Java, é chamado na grade de dados da memória. Usamos três palavras. Usamos o cache distribuído, usamos na grade de dados de memória para vantagem web do pessoal de Java, embora estejamos no ecossistema da Microsoft. Então, não somos muito e há o armazenamento de dados distribuído na memória. Portanto, o cache de dados do aplicativo é o caso de uso do cache distribuído.

Interface IDistributedCache

Portanto, se você for usar o cache de dados do aplicativo, há três maneiras de fazer isso. Existe uma interface IDistributedCache e está disponível no ASP.NET 4, que é basicamente assim aqui.

cache distribuído

Interface muito simples. A Microsoft finalmente deu uma interface que permite conectar qualquer cache distribuído abaixo. O único problema com isso é que é realmente muito simples. Então, você não pode fazer muito com isso. Você pode apenas fazer realmente básico. E, a única coisa que ele faz é lhe dar expirações. Você pode especificar a opção de entrada de cache que são as expirações. Então sim! NCache implementa isso, portanto, se você estiver programando através da interface IDistributedCache, basta conectar NCache sem qualquer alteração de código, qualquer alteração de código adicional e você fez a programação, mas eu não recomendaria que você fizesse isso porque se você realmente vai acessar um cache distribuído e o benefício, então você quer entender o que todos os outros recursos? Por que você não deve usá-los? Agora eu vou com Isso.

Entity Framework Core Cache

Outra é se você estiver fazendo o EF core, novamente, se quiser minimizar o código que deseja escrever, NCache atual provedor de métodos de extensão do núcleo EF, deixe-me mostrar isso rapidamente. Portanto, os métodos de extensão do núcleo EF realmente simplificam a maneira como você usaria o cache. Novamente, assim como IDistributedCache, os recursos não são tão extensos.

ef-core-cache

Então, por exemplo, digamos que você queira ver sua consulta típica baseada em EF Core ou EF LINQ, o que fizemos foi implementar um método de extensão de cache de farm e existem outros métodos de extensão, assim que você diz que, quando estiver atrás da equipe, essa consulta será examinada primeiro e no cache. Se o cache o tiver, você o obterá do cache, caso contrário, você irá para o banco de dados, obterá e armazenará em cache antes que ele seja entregue a você. Assim, simplifica bastante a sua programação. Se isso é algo que você deseja, digamos que você já tenha algum aplicativo EF core e queira conectá-lo o mais rápido possível, esta é a maneira mais rápida de obter NCache lá como você pode ver isso é.

NCache API

A terceira opção é usar NCache API que também é uma API bastante simples. NCache A API parece quase idêntica ao objeto ASP.NETcache, mas mais do que isso, tentamos, mas saímos há muito tempo. ASP.NET Core é a única interface para objetos que existia, então tentamos mantê-la o mais próximo possível.

ncache-api-app-data-caching

Então, é um conceito simples, você se conecta ao cache, você obtém um identificador de cache, você faz um cache.get, há um índice ou esquece, você pode fazer contém, você adiciona, insere, remove e são versões assíncronas destes para que você não tenha que esperar que o cache seja atualizado. Há obviamente mais do que isso. Então, isso dá uma ideia de como é simples usar um cache.

Recursos de cache de dados de aplicativos – mantenha o cache atualizado

Agora, a principal coisa que eu queria ver era esta página. Sim, acho que te disse que há duas cópias do cache. Se o cache não for capaz de se manter atualizado, você realmente limitará o uso. Isso é muito importante entender. O que os caches fazem?

Expirações (Absoluto + Deslizante)

A maioria das caches fornece-lhe Expirações. A expiração também é chamada de TTL, Time to live, chamamos isso de expiração absoluta porque é onde o objeto de cache do ASP.NET usa esse termo, então continuamos com ele. O que isso faz? Você está adicionando um objeto ao cache, você está dizendo, por favor, expire daqui a cinco minutos ou daqui a dez minutos, porque acho que é seguro armazená-lo em cache por tanto tempo. Você está fazendo uma suposição educada, o que é bom em alguns casos de dados de referência. Por exemplo, você tem um catálogo de produtos. Provavelmente não vai mudar a cada 10 minutos. O preço não vai mudar lá. Então, são mudanças mais previsíveis para algumas das situações. Então, não há problema em usar expressões lá. Mas, se você está armazenando em cache um cliente ou uma atividade, você não sabe quando isso vai mudar porque os clientes vão ligar e fazer algumas alterações, então você pode não conseguir viver apenas de Expirações. Então, é aí que você precisa de outros recursos no cache e é aí que todos esses recursos estão no Cache em NCache como Código Aberto.

Sincronizar Cache com Banco de Dados

Uma das características é o NCache pode sincronizar-se com o banco de dados. Agora o banco de dados pode ser SQL Server, pode ser Oracle ou pode ser OLEDb em caso de polling, mas sincronização significa que NCache torna-se um cliente, o servidor de cache torna-se um cliente do banco de dados. Ele agora usará a dependência SQL que eu estava falando. A mesma coisa que uma consulta contínua, mas para o SQL Server. Ele usará uma dependência SQL e mostrarei como isso funciona.

banco de dados sincronizado

Então, digamos... Então, quando você está adicionando, digamos que você está adicionando este objeto de produto ao cache para que você tenha uma chave e tenha o item de cache que contém o produto. O que você deseja fazer é especificar uma instrução SQL que identifica um produto específico na tabela de produtos e, novamente, essa instrução SQL é para o SQL Server. Você está passando o cache de eventos, NCache vamos passá-lo para o servidor SQL. NCache, quando ele armazenar em cache este produto, ele agora notificará um registro no servidor SQL de uma dependência SQL e manterá o mapeamento. Portanto, se o SQL Server enviar um evento para NCache dizendo que este produto foi atualizado no banco de dados agora NCache sabe que ainda está no cache. Então, ele fará uma de duas coisas. você precisa apenas removê-lo do cache. Quero dizer, seu aplicativo não precisa fazer nada, tudo está sendo feito pelo cache ou, se você implementou esse recurso chamado read-through, ele recarregará automaticamente o item. Então, eu vou chegar ao banco de dados em um pouco. Portanto, a sincronização de banco de dados é um recurso muito poderoso. Dá-lhe a paz de espírito e armazena em cache todos os dados. Sem o qual, se você está apenas fazendo suas explorações, você é limitado e é tão ruim que se você conversar com uma pessoa típica que conhece o cache da maneira básica, dará uma reação ao cache, “oh, isso é para dados somente leitura”. O cache é apenas para dados estáticos. Todo mundo tem medo de mexer nos dados transacionais e isso é por causa dessas coisas, porque expirações nada mais são do que um palpite, que pode ser válido para casos mais previsíveis como catálogo de produtos e outros, mas não é válido para dados transacionais.

Sincronizar Cache com Não Relacional

Portanto, o mesmo problema se você tiver um armazenamento de dados não relacional. Pode ser algo na nuvem, pode ser bancos de dados legados, pode ser mainframe. Você pode atingir o mesmo objetivo que a dependência do SQL, exceto que nesse caso você não está nessa notificação. Uma dependência personalizada é algo que você implementa. É o seu código que este é o código do lado do servidor, então NCache tem esse conceito de código do lado do servidor. Código que você escreve, que vive no servidor de cache.

Read-Thru e Write-Thru

A dependência personalizada é uma, a gravação por meio de leitura é outra. Acabei de falar sobre ser de leitura, que você pode recarregar a coisa se estiver em uma sincronização de banco de dados, se estiver removendo o item NCache pode ir e recarregar. Como pode recarregar? Embora seu código de leitura. O que é Read-through? Parece que estou pulando para frente e para trás, mas eu queria conectar esses .s é por isso. Como você… escrever e ler é apenas uma interface simples, então você tem uma interface de leitura aqui. Sim três métodos existe um Init que permite que você se conecte à fonte de dados. Dispose é a desconexão e eles são muito sobrecargas de LoadFromSource. Então, LoadFromSource é uma chave e você devolve um item de cache e LoadFromSource tem uma sobrecarga onde você pode devolver um Dicionário Então, LoadFromSource é algo que NCache chama seu manipulador de leitura .

Então, digamos que seu aplicativo faça o Cache.Get e esse item não esteja no cache e você diga NCache se não estiver no cache, vá e pergunte ao manipulador de leitura. NCache chamará o manipulador de leitura porque o manipulador de leitura é seu código que reside no cluster de cache. NCache chamará este método. Esse método é o seu código, vai para seu banco de dados, sua fonte de dados, que pode ser qualquer coisa, pode ser um SQL ou chamado mainframe e pegar os dados e depois colocá-los. Agora isso NCache tem a capacidade de ir ao seu banco de dados, isso significa que ele pode recarregar automaticamente. Então, essa é a parte da conveniência. Assim, você pode sincronizá-lo com o banco de dados relacional e o banco de dados não relacional.

Cache de dados relacionais

A última coisa é armazenar em cache dados relacionais. Você tem que fazer contabilidade com aplicação de dados e acompanhar um dado e relacionamento com outro. Vou apenas dar um exemplo de um cliente com vários pedidos. Embora você normalmente não exclua um cliente, digamos que se você o fez e o cache não o conhece, digamos que você excluiu um objeto de cliente do cache e ele tinha dez pedidos no cache, esses pedidos não são mais válidos, eles não devem ser mantidos no cache. Portanto, sempre que você tiver um um para muitos, geralmente muitos dependem de um, portanto, se você excluir um do cache, também deverá excluir muitos do cache. Agora é algo que você teria que acompanhar toda vez que você exclui um, você tem que excluir muitos. Então, o que você pode fazer é que o objeto de cache do ASP.NET foi anexado ao conceito de dependência. NCache implementou isso para que você possa relacionar esses dois e, em seguida, se o objeto do cliente for atualizado ou movido, todos os pedidos serão removidos automaticamente.

Você pode usar a dependência de cache para muitos, para um para um e também se quiser armazenar em cache coleções e, em seguida, armazenar objetos individuais separadamente também. Então, isso está em sua coleção de clientes como um objeto armazenado em cache e alguns dos clientes também foram armazenados em cache individualmente. Porque no cache você pode manter várias cópias. Está tudo sendo mantido pelo seu aplicativo. Então, ao contrário do seu banco de dados que tem que ter normalização e integridade de dados e dessa forma o cache pode ter várias cópias porque é tudo uma questão de desempenho. Quando você tem várias cópias e precisa limpar quando uma cópia é atualizada e é isso que essa dependência de cache permite que você faça. Então, essas são as quatro maneiras diferentes de manter seu cache atualizado. Estão todos disponíveis como parte de NCache open source.

Recursos de cache de dados do aplicativo – Read-Thru e Write-Thru

Estou através de leitura e gravação novamente, a gravação é o mesmo que a leitura, exceto que, quando você atualiza o cache, solicita que o cache vá e atualize o banco de dados.

Leitura e escrita

Então, read-through é quando você lê o cache você pede que o cache leia do banco de dados caso ele não tenha os dados. Agora, leitura e gravação permitem que você consolide seu código de persistência em uma camada de cache. E, deixe o cache ficar mais ciente do seu banco de dados e o aplicativo se torne cada vez mais simples.

write-behind

write-through também tem um benefício adicional que é chamado de write behind que sempre que você atualiza o banco de dados, essa é a operação mais lenta em seu aplicativo é atualizar o banco de dados. É ainda mais lento do que buscar dados do banco de dados e, se você estiver usando um cache para buscar dados, não precisará ir muito ao banco de dados. Por que não usar o cache para dados atualizados se os dados não forem tão confidenciais. Isso significa que você pode enfileirar para atualização assíncrona. Se os dados forem muito confidenciais, obviamente você não deseja enfileirar para atualização assíncrona, mas muitos dos dados podem ser enfileirados para atualização assíncrona. Quando você enfileira e basicamente faz um recurso de gravação, você pergunta NCache para gravá-lo no banco de dados de maneira assíncrona, à medida que uma fila é criada ou várias solicitações de atualização, essa fila é replicada para vários servidores, caso algum servidor fique inativo, você não está perdido. E seu aplicativo certamente acelera lá porque não está mais esperando que o banco de dados seja atualizado. Assim, write-through tem o benefício de desempenho. E, escreva atrás... A leitura tem todos os benefícios.

Recarregar itens automaticamente

Você pode até recarregar automaticamente com expirações. Portanto, quando você expirar, poderá recarregar automaticamente esse item. A expiração basicamente, digamos, provavelmente muda no servidor de banco de dados. Não é mais válido no cache, então não está removendo, por que não o carregamos, porque você precisará dele de qualquer maneira. Então provavelmente é algum tipo de dado de pesquisa, então lido automaticamente. Novamente, o cache assume cada vez mais esse trabalho do seu aplicativo.

Recursos de cache de dados do aplicativo – Agrupamento de dados

Uma vez que você consiga manter o cache atualizado e esteja confiante, agora você começa a armazenar em cache muitos dados. Quando você começa a armazenar em cache muitos dados, é muito bom poder pesquisar dados além desse par de valores-chave. Acabei de conversar com alguém ontem à noite e eles tiveram que realmente criar técnicas sobre como formatar as chaves para encontrar diferentes tipos de dados. Isso é algo que você não tem que fazer em NCache. Você pode atribuir essas metatags chamadas grupos e subgrupos e tags e tags nomeadas. Esses são metadados que você pode atribuir aos seus objetos em vez de renomear as chaves. Esses dados poderiam ser melhores e, com base nisso, você pode dizer me dê tudo o que tem essa tag ou essas duas tags ou essas três tags ou me dê tudo o que pertence a esse grupo. Isso é um.

Em segundo lugar, você pode fazer consultas SQL. Deixe-me mostrar isso. Então, novamente, o cache começa a se parecer cada vez mais com um banco de dados.

agrupamento de dados

Então, por exemplo, você pode dizer aqui, selecione todos os produtos com este nome, então agora você está fazendo uma pesquisa baseada em um atributo do objeto produto. Agora isso é muito NCache código para que você execute.reader como o SQL Server. É muito parecido, você pega um leitor Icache de volta e você apenas olha para o seu material. Agora, isso é algo novamente, faça o cache fazer onde quer que você precise fazer. Por um lado, você coloca muitos dados no cache, por outro, agora você pode pesquisar dados do cache.

ASP.NET Core Armazenamento de Sessão

Eu falei sobre o ASP.NET core sessões. Acho que a principal coisa a ter em mente é que existem duas maneiras de usá-lo.

Armazenamento de cache distribuído

Uma é que você se conecta NCache. NCache implementou um provedor IDistributedCache. Então, você liga NCache como um provedor IDistributedCache e ASP.NET core automaticamente começa a armazenar as sessões em NCache. Veja se tenho aqui.

armazenamento de sessão de cache distribuído

Então, por exemplo, aqui está um ASP.NET Core aplicação, você vai para os serviços de configuração e apenas adiciona NCache como um provedor IDistributedCache e agora você está usando o ASP normal.NET core sessão que sabe depender de IDistributedCache porque sabe que agora há um provedor conectado. Então, quando você fizer isso, todas as sessões serão salvas em NCache. E, eu vou mostrar a você como é o cache. Vou apenas dar-lhe uma demonstração real de NCache. Então, essa é uma maneira.

NCache Provedor de sessão

A segunda maneira é que você realmente usa NCache como seu próprio provedor de sessão, então, em vez de ir para um IDistributedCache, você entra nos mesmos serviços de configuração e diz add NCache provedor de sessão.

ncache-provedor de sessão

Agora, este provedor de sessão tem mais recursos do que o IDistributedCache regular. Tem mais recursos específicos de sessão. Quero dizer, eu recomendaria que você usasse o NCache em seu próprio provedor de sessão que foi bom para ir com IDistributedCache. Mas, você pode ir para ambas as opções, ASP.NET core te proporciona isso. Como eu disse, isso não exigia nada mais do que isso para a mudança de código. Isso é tudo. Todo o resto é automático. Então, se você vai se beneficiar de um cache distribuído como NCache, conecte-o como um ponto de entrada em seu aplicativo. Você tem que se beneficiar hoje porque o cache de objetos do cache de dados do seu aplicativo vai levar programação, então vai se encaixar em seus cronogramas de desenvolvimento e um processo um pouco mais longo do que isso. Mas, isso é feito muito, muito rapidamente e eu sei com certeza isso já aqui.

ASP.NET Core Cache de resposta

E, esta é uma configuração, então, novamente, vou revisar e da mesma forma que o cache de resposta usa um cache distribuído e você pode conectar NCache para isso e, em seguida, ele funciona automaticamente.

cache de resposta

Requisitos de arquitetura em cache distribuído

Deixe-me entrar rapidamente em algumas das coisas que NCache vai fazer.

High Availability

Um cache distribuído é algo como um banco de dados, está vivendo em produção com seu aplicativo. Então, você precisa ter certeza de que sua arquitetura é flexível, está altamente disponível.

cluster de cache de alta disponibilidade

Então, por exemplo, NCache tem uma arquitetura peer-to-peer, mas outros tipos de Redis não tem. Então, ao invés de ter um master slave, você quer ter um peer-to-peer. Como eu disse, muitos dos caches Java que eles chamam na grade de dados de memória têm arquitetura ponto a ponto. O bom do peer-to-peer é que todos são peers, então qualquer nó pode cair e nada acontece. Provavelmente o escravo mestre é o escravo que não pode se tornar mestre. Se o mestre morrer, o escravo ainda é um escravo. Então, isso requer intervenção manual para você se recuperar. No caso de peer to peer, ele se recupera automaticamente. Assim, por causa do peer to peer, ele se torna o que chamamos de cluster dinâmico de autocorreção que se ajusta automaticamente. Então, esse é o primeiro aspecto.

Escalabilidade Linear w. Replicação

O segundo aspecto é a escalabilidade linear que é o particionamento e novamente escalabilidade linear com ajuste dinâmico de partição.

dynamic-partições-1

As coisas NCache faz automaticamente é, digamos, se você tem uma configuração de dois servidores e deseja adicionar duas partições e agora deseja adicionar um terceiro servidor, então essa é a terceira partição que está sendo adicionada. NCache automaticamente, digamos que vá de , digamos que você tenha dois servidores aqui com duas partições. Cada partição como backup em um servidor e partição diferente é essencialmente uma coleção de buckets com distribuição de mapa de hash.

dynamic-partições-2

Então, digamos que se você tiver 1,000 buckets, 500 irão para a partição 1, 500 world partition 2, tudo está funcionando bem, agora você deseja adicionar um terceiro servidor. St uma vez porque novamente, adicionando um terceiro servidor agora você pode ter três partições, então NCache fará automaticamente nos bastidores enquanto o aplicativo estiver em execução, ele criará uma terceira partição e moveremos alguns dos dados das partições 1 e 2 para a 3ª partição. Mais uma vez, um terço, um terço um terço. Então, os baldes realmente se movem e tudo isso acontece dinamicamente. Uma vez que os buckets se movem, as réplicas também são reajustadas, mas as réplicas um e dois não são mais as mesmas réplicas que eram anteriormente, rapidamente têm menos dados e há a nova réplica chamada réplica três. O servidor que tinha as réplicas dois não é mais a réplica 2, vai ter três e a réplica três vai ser criada no terceiro servidor, tudo isso é feito automaticamente para você.

Então, esse dinamismo é o que o torna altamente disponível. Então, quando você adiciona um servidor, há uma intervenção manual, mas você realmente precisa... Então, ainda é muito conveniente se você puder fazer isso. Literalmente, você apenas diz adicionar e tudo é feito para você. Mas, é ainda mais importante quando você descarta um servidor, porque a queda também pode ocorrer devido à falha do servidor. Então, quando você está na configuração de três servidores, isso diz que o servidor 3 está inativo, agora a partição 3 está perdida, o que NCache fará é ativar imediatamente a réplica três porque ela tem a cópia da partição 3. Então, agora você tem a partição 1, a partição 2 e a réplica 3 porque a partição 3, temporariamente. Portanto, não há interrupção. Feito isso então NCache agora perceba que apenas dois servidores podem ter apenas três partições, ele mescla a réplica 3 na partição 1 e 2, tudo de uma vez e, uma vez que a mesclagem é feita, agora cria uma réplica 2 neste local aqui. Então, você pode voltar para esta imagem.

Agora, isso é algo que com outras modas você não pode fazer automaticamente. O que isso significa é que se isso acontecer e o meio morrer, um de seus funcionários do departamento de TI terá que ir e reajustar manualmente e até que isso aconteça um cache para um e o que eles chamam de funcionalidade limitada, mas NCache faz isso automaticamente apenas assim. Portanto, você precisa garantir que a alta disponibilidade esteja realmente em um cache.

Cache de cliente

Já falei sobre a velocidade do InProc.

cliente-cache

Replicação Wan

Há outro recurso e agora este é um recurso para Enterprise Edition que é que, se você tiver vários data centers para os quais muitos aplicativos foram movidos, por causa da nuvem, é mais fácil implantar aplicativos em várias regiões.

diagrama de replicação wan

Portanto, se seu aplicativo for multicentrado em dados, seu cache também pode precisar ser replicado para vários e, como há muita latência, você não pode realmente fazer com que o cluster inteiro abranja várias regiões. Então, você vai ter um cluster em um em um cluster e há uma ponte entre a qual replica de forma assíncrona. Então, é um caso de replicação bidirecional de ativo-ativo e a ponte faz a resolução de conflitos porque a mesma chave é atualizada para ambos os locais. Agora você tem acompanhar isso.

NCache Demo

Deixe-me mostrar rapidamente o que NCache parece. Então, eu tenho o Azure, então basicamente adquiri ou provisionei, se eu puder obter o portal, aí está! Então, eu tenho... é muito lento. Vamos! Tomando quatro sim, Ok! Então, nós temos quatro VMs nisso e eu estou logado em uma delas que é… Então, eu tenho basicamente dois servidores de cache, são todos Windows, um cliente de cache Windows, um cliente de cache que é Linux. Porque é .NET core, eu posso fazer tudo. Até os servidores de cache podem estar vivos, mas NCache como eu disse é .net core então você pode simplesmente ir, quando você vier ao nosso site, Just, você pode realmente baixar o .msi ou o Tar.gz dependendo de sua preferência. Você pode instalar o Windows ou Linux. Na verdade, você pode baixar o código aberto também aqui. Nossa empresa é construída em cima de nosso código aberto, portanto, somos proprietários de código aberto e corporativo.

Criar um cache clusterizado

Então, deixe-me rapidamente agora, desculpe por isso, vou criar um cluster de cache de 2 nós, novamente, esta ferramenta não é de código aberto, mas todas essas coisas que você pode fazer em código aberto. Só não é tão bonito. Na verdade, esta será uma ferramenta baseada na web agora. Então, eu só vou em frente. Este é o meu primeiro servidor de cache. Este é o meu segundo servidor de cache. Então, vou fazer dois clusters de cache de servidor. Vou levar todos os outros padrões como estão. Vou adicionar dois clientes, um sou eu que é o cliente Windows e o segundo vou adicionar o cliente 10.0.0.7 e o cliente Linux. Vamos iniciar o cache. Quero dizer, é assim que você cria e configura caches rapidamente.

Simule o estresse e monitore o cache

Vou começar minhas primeiras estatísticas sobre isso. NCache vem com este programa chamado ferramenta de teste de estresse que permite simular carga em NCache. Então, é como um programa. Ele recebe entradas por conta própria. Eu tenho o PowerShell aberto aqui, então vou fazer o teste de estresse e digitar o nome do cache que é o nome do cache que acabei de dar aqui, escrever aqui, e eu tenho agora esta caixa, esta é a primeira. Então, estou indo para a caixa do cliente, então vou executar isso e você vê que de repente começa a atividade aqui. Então, estou fazendo cerca de 500 operações por segundo por caixa agora, ok? Então, digamos, quero aumentar minha carga, quero testar como NCache vai funcionar no meu ambiente, então vou em frente e lançar outra instância do mesmo na mesma caixa. De repente, você verá que minha carga quase dobrou e agora tenho duas caixas Linux, como você pode ver aqui é o Linux, este é o . sete caixa que está bem aqui. Então, vou iniciar o PowerShell aqui, quero apenas copiar rapidamente este módulo e farei o mesmo cache de demonstração de teste de estresse e, assim que fizer isso, você verá que isso de repente subiu para ser 60…

ncache-demonstração

Então, toda vez que eu faço isso, cerca de 500 operações por segundo por caixa estão sendo adicionadas. Eu vou fazer mais um e então vamos terminar com isso. Eu vou adicionar… Então, você pode continuar adicionando mais e mais carga até ver que eles começarão a atingir o máximo e então você adiciona um terceiro servidor. E, claro, você também precisa adicionar mais clientes. Tudo isso é perfeito que você pode facilmente monitorar, mesmo em ferramentas de terceiros. Isso é tão simples quanto é. Esses são itens em cache que você está adicionando.

Você pode acessar nosso site para download, seja o código aberto, então, o código aberto está disponível, há um instalador MSI também para que você baixe o código aberto. Portanto, você pode baixar o código aberto ou, se tiver certeza de que deseja usá-lo em um ambiente de suporte, vá em frente e faça o download imediato da empresa. Digamos, se eu vier para o código aberto, então você pode baixar o instalador, dessa forma você não precisa ser cobrado pelo código-fonte. Novamente, embora todo o código-fonte esteja no GitHub.

O que fazer a seguir?

 

Inscreva-se no boletim informativo mensal por e-mail para obter as atualizações mais recentes.

© Copyright Alachisoft 2002 - . Todos os direitos reservados. NCache é uma marca registrada da Diyatech Corp.