Início Tecnologia As muitas camadas de cache: todos os lugares de lugares vive em...

As muitas camadas de cache: todos os lugares de lugares vive em sistemas modernos

19
0

A velocidade dos sistemas modernos de software program depende do cache, pois é um fator essencial para melhorar o desempenho. A discussão sobre armazenamento em cache se estende além das implementações de Redis e Memcached. O cache de dados ocorre em várias camadas sobrepostas, que começam no nível do navegador de usuários finais e estendem através de internos do banco de dados e índices de pesquisa. Cada camada de cache oferece vantagens distintas ao lidar com seu próprio conjunto de compensações. O entendimento adequado dessas interações se torna essencial para o desenvolvimento de aplicativos que atingam velocidade e escalabilidade e resiliência.


Uma vista de várias camadas de cache

O cache não é um monólito; O cache existe como uma rede de otimizações estrategicamente implantadas que servem a propósitos diferentes e funções do sistema de cache por meio de vários níveis de otimização. Examinaremos cada camada de cache, fornecendo exemplos concretos.

  • Cache do navegador: O cache do navegador serve como o sistema de cache inicial na hierarquia. O primeiro carregamento de páginas da Net permite que os navegadores armazenem CSS, JS e arquivos de imagem em seu sistema de armazenamento native. Por exemplo, os usuários que retornam ao Gmail experimentam carregamentos quase instantâneos de login porque o aplicativo armazena fontes e arquivos de script localmente. Os desenvolvedores devem lidar com cabeçalhos, incluindo Controle de cacheAssim, Etag, e Último modificado Para obter um equilíbrio adequado entre frescura e velocidade de desempenho.

  • CDN (rede de entrega de conteúdo): Dados de cache do CDNS em locais próximos às posições geográficas dos usuários. O cache de HTML e imagens, juntamente com a resposta da API, normalmente ocorre no CDNS. Através da tecnologia de computação de borda, o conteúdo dinâmico agora pode ser processado e armazenado em cache perto dos locais dos usuários. Por exemplo, através do uso de Akamai e Cloudfront, a Netflix transmite o conteúdo de vídeo com eficiência para os usuários espalhados por todo o mundo.

  • Cache de memória de aplicativo: Os aplicativos geralmente usam bibliotecas de sistemas de cache de memória como cafeína ou goiaba (Java) para armazenar objetos acessados ​​recentemente na memória. Por exemplo, as plataformas de comércio eletrônico usam armazenamento em cache de memória para armazenar catálogos de produtos porque reduz o acesso ao banco de dados. Os tempos de resposta são muito mais rápidos com velocidades de microssegundos, mas os dados desaparecem da memória quando o sistema reinicia.

  • Cache distribuído: Um sistema de cache distribuído que inclui Redis ou Memcached mantém objetos compartilhados que diferentes serviços de aplicativos podem acessar. Os sistemas de cache distribuídos oferecem desempenho rápido com recursos de compartilhamento de dados, mas requer monitoramento contínuo de valores de tempo para viver e consumo de memória. Por exemplo, o Instagram usa os tokens de sessão Redis para armazenar em cache e metadados do usuário. Os recursos Redis, como conjuntos classificados usados ​​como mecanismo de armazenamento para os feeds classificados em cache.

  • Buffer de banco de dados swimming pools e índices e visualizações materializadas: O PostgreSQL mantém um pool de buffer compartilhado para armazenar as páginas que os usuários acessaram recentemente. Consultas que recuperam os mesmos dados várias vezes acessam o pool de buffer para evitar operações de E/S de disco que consomem tempo. Em geral, a camada de aplicação não pode detectar esse sistema de cache interno.

    Amazon Redshift Supplies Views Materials Pré-Compute Advanced Junções e agregações, como produtos mais vendidos por região, por meio de atualizações por hora. A velocidade do painel e as consultas de relatórios se torna significativamente mais rápida após a implementação dessa camada.

  • Mecanismos de pesquisa: A implementação do cache de resultados usando sistemas como o Elasticsearch para facetas e filtros de consulta aprimora a experiência geral do usuário. A tecnologia funciona melhor ao lidar com dados desnormalizados que requer operações de leitura pesadas. Por exemplo, o Shopify permite a pesquisa rápida de produtos em milhões de itens através do uso do Elasticsearch.

  • Corretores de mensagens: Sistemas como Kafka e RabbitMQ operam como corretores de mensagens em vez de caches tradicionais, embora forneçam armazenamento temporário para eventos. Por exemplo, os registros de viagem do Uber operam como eventos que permitem análises em tempo actual e detecção de fraude antes de sua eventual exclusão.


Por que cache?

O cache permite escalabilidade além dos benefícios da velocidade. Aqui está o porquê:

  • Reduza a latência: O cache native e de nó de borda de listas de reprodução personalizadas do Spotify permite que os usuários acessem seu conteúdo instantaneamente.

  • Melhorar a taxa de transferência: A Amazon usa o armazenamento de cache para carrinho de compras e dados de recomendação para gerenciar volumes de tráfego alto.

  • Menor custo operacional: Twitter usa cache da linha do tempo para reduzir os custos operacionais, minimizando a necessidade de junções distribuídas caras no tempo de leitura

  • Aumente a resiliência: O website de notícias mantém o acesso ao usuário a artigos somente leitura através de conteúdo em cache quando o banco de dados fica indisponível.


Invalidação do cache

O problema mais difícil e a dificuldade do cache existe para determinar quando remover ou atualizar dados armazenados. Aqui estão alguns padrões comuns:

  • Tempo para viver (TTL): As APIs de notícias geralmente implementam um TTL de 5 minutos para impedir que o conteúdo desatualizado apareça.
  • Escreva: Aplicações financeiras como o Stripe mantêm a consistência do banco de dados por meio de atualizações simultâneas do Redis e do Postgres.
  • Write-behind: Analytics Pipelines atrasa as atualizações do banco de dados para reduzir a amplificação de gravação.
  • O cache-aside (carregamento preguiçoso): Essa abordagem permite que a Netflix obtenha metadados do present somente quando necessário e armazená -la para solicitações futuras.
  • Pub/sub invalidação: O Airbnb implementa a invalidação baseada em eventos para remover instantaneamente as análises de usuários desatualizadas do sistema de cache.

Modelos de consistência

O cache introduz trocas entre consistência e desempenho. Aqui estão alguns padrões de consistência comuns:

  • Forte consistência: Aplicativos bancários como o Chase implementam uma forte consistência para manter informações precisas sobre o saldo da conta.
  • Eventual consistência: Feeds sociais aceitam breves atrasos antes de mostrar novos curtidas e comentários porque operam com eventual consistência.
  • Leia-Your-Writs: O Slack usa atualizações locais de cache para tornar sua mensagem enviada visível imediatamente.

Arquitetura de fluxo de cache de várias camadas

Arquitetura de fluxo de cache de várias camadasArquitetura de fluxo de cache de várias camadas

Resumo do fluxo de cache:

  • Caminho de solicitação: A solicitação segue este caminho: Cache do navegador → Cache de CDN → Cache de memória → Cache Redis → Consulta do banco de dados.

  • Cache erra: O sistema verifica cada nível de cache sequencialmente até encontrar o conteúdo solicitado ou atingir a consulta do banco de dados.

  • Resposta do banco de dados: O banco de dados executa a consulta e entrega novos dados quando todos os níveis de cache não conseguem recuperar as informações.

  • População de cache: A resposta viaja de volta por toda a hierarquia de cache a partir de Redis e terminando no navegador.

  • Pedidos futuros: Servido do nível de cache disponível mais próximo para minimizar os hits de banco de dados

  • Objetivo de desempenho: A meta de desempenho do cache de várias camadas visa diminuir os tempos de resposta e a carga do sistema de banco de dados.


Armadilhas do mundo actual e Exemplos

A implementação de estratégias complexas de cache oferece grandes benefícios de desempenho, mas introduz a complexidade adicional do sistema. Esses cinco modos de falha geral incluem instâncias específicas e seus respectivos remédios:

  • Exemplo de rebanho trovejando: A venda flash de tempo limitada ativou uma demanda massiva de usuário para a página do produto simultaneamente. A expiração simultânea de entradas em cache cria uma carga de banco de dados de origem esmagadora que resulta em tempo de inatividade do sistema.
    • Solução possível: A solução implementa duas estratégias para evitar esse problema: primeiro, adicione o jitter de tempo aleatório aos tempos de expiração (TTL = 5 ± 1 minutos) e o segundo, implemente a solicitação de coalescismo para atrasar o preenchimento do cache após uma primeira falta de cache até que o novo conteúdo chegue.

  • Exemplo de penetração de cache: Bots maliciosos criam IDs de produtos aleatórios ou inválidos que ignoram os mecanismos de cache e atacam diretamente o banco de dados. O banco de dados opera como um gargalo de desempenho devido ao uso prolongado.
  • Exemplo de teclas quentes: Quando uma grande notícia ou hashtag viral gera tráfego repentino para uma chave Redis, a carga resultante causa um tempo limite em um cache de cache.
  • Exemplo de dados obsoleto: A atualização da contagem de inventários do website de comércio eletrônico depois que uma compra não invalida imediatamente o valor de “estoque” no cache, o que leva os clientes a assinarem falsas indicações “em estoque” para obter produtos indisponíveis.
    • Solução possível: Publique eventos de insuficiência de cache por meio de uma fila de mensagens (por exemplo, Kafka) após cada mudança de inventário. Cada servidor de aplicativo assina este sistema para excluir ou modificar imediatamente as entradas de cache contendo dados afetados.

  • Exemplo de incompatibilidade de versão: A implantação de uma nova versão da API resulta em mudanças de esquema JSON para perfis de usuário, mas as entradas em cache da versão 1 persistem em seu formato authentic. Os erros de desserialização do serviço ocorrem devido a esta incompatibilidade da versão.
    • Solução possível: Ao lançar novas versões, você deve incluir tags de versão (por exemplo, v2: Usuário: 123) nas teclas de cache para evitar a mistura de formato entre versões antigas e novas. O sistema deve aguardar a expiração do TTL antes de aposentar versões antigas.


Melhores práticas e toca

  • Cada camada de cache deve incluir backup Caminhos de fallback para operação.

  • Monitore o desempenho do cache por meio de ferramentas de observabilidade para rastrear Razões de acerto de cache/falta e latência e comportamento TTL.

  • Filtros de Bloom pode ser implementado para evitar erros de cache ao lidar com chaves inválidas.

  • Carregamento preguiçoso pode ser preferido, a menos que seu aplicativo exact de consistência estrita.

  • A combinação de métricas e rastreamento Ativa o diagnóstico de problemas de cache.

  • Sua arquitetura de cache deve consistir em três camadas distintas que fornecem Leituras rápidas baseadas em memória e durabilidade compartilhada baseada em Redis e durabilidade baseada em banco de dados.


Conclusão

A decisão de implementar o cache existe em vários níveis, e não como uma simples escolha binária. Os sistemas mais eficazes usam cada camada de cache para otimizar trocas específicas entre velocidade e custo e consistência e resiliência. Compreender essas múltiplas camadas de cache e sua interação ajuda os arquitetos de equipes mais inteligentes, mais rápidos e mais confiáveis. Não apenas adicione um cache, mas projete um que corresponda aos requisitos específicos de design e escala do seu produto.

fonte