Share via


Cache integrado do Azure Cosmos DB - Visão geral

APLICA-SE A: NoSQL

O cache integrado do Azure Cosmos DB é um cache na memória que ajuda a garantir custos gerenciáveis e baixa latência à medida que o volume de solicitações cresce. O cache integrado é fácil de configurar e você não precisa gastar tempo escrevendo código personalizado para invalidação de cache ou gerenciamento de infraestrutura de back-end. O cache integrado usa o gateway dedicado em sua conta do Azure Cosmos DB. Ao provisionar seu gateway dedicado, você pode escolher o número de nós e o tamanho do nó com base no número de núcleos e memória necessários para sua carga de trabalho. Cada nó de gateway dedicado tem um cache integrado separado dos outros.

Um cache integrado é configurado automaticamente dentro do gateway dedicado. O cache integrado tem duas partes:

  • Um cache de itens para leituras pontuais
  • Um cache de consulta para consultas

O cache integrado é um cache de leitura e gravação com uma política de remoção LRU (Least Recently Used). O cache de itens e os caches de consulta compartilham a mesma capacidade dentro do cache integrado e a política de remoção LRU se aplica a ambos. Os dados são removidos do cache estritamente com base em quando foram usados menos recentemente, independentemente de ser uma leitura pontual ou consulta. Os dados armazenados em cache dentro de cada nó dependem dos dados que foram recentemente gravados ou lidos através desse nó específico. Se um item ou consulta é armazenado em cache em um nó, ele não é necessariamente armazenado em cache nos outros.

Nota

Você tem algum feedback sobre o cache integrado? Queremos ouvi-lo! Sinta-se à vontade para compartilhar comentários diretamente com a equipe de engenharia do Azure Cosmos DB: cosmoscachefeedback@microsoft.com

Cargas de trabalho que se beneficiam do cache integrado

O principal objetivo do cache integrado é reduzir os custos para cargas de trabalho de leitura pesada. A baixa latência, embora útil, não é o principal benefício do cache integrado porque o Azure Cosmos DB já é rápido sem cache.

As leituras de pontos e consultas que atingem o cache integrado têm uma carga de RU de 0. Os acertos de cache têm um custo por operação muito menor do que as leituras do banco de dados de back-end.

As cargas de trabalho que se ajustam às seguintes características devem avaliar se o cache integrado ajuda a reduzir os custos:

  • Cargas de trabalho de leitura pesada
  • Muitas leituras pontuais repetidas em itens grandes
  • Muitas consultas repetidas de alta RU
  • Tecla de partição quente para leituras

O maior fator para a poupança esperada é o grau em que as leituras se repetem. Se sua carga de trabalho executa consistentemente as mesmas leituras ou consultas pontuais em um curto período de tempo, é um ótimo candidato para o cache integrado. Ao usar o cache integrado para leituras repetidas, você usa apenas RUs para a primeira leitura. As leituras subsequentes roteadas através do mesmo nó de gateway dedicado (dentro da MaxIntegratedCacheStaleness janela e se os dados não tiverem sido removidos) não usam a taxa de transferência.

Algumas cargas de trabalho não devem considerar o cache integrado, incluindo:

  • Cargas de trabalho pesadas de gravação
  • Raramente repetidas leituras pontuais ou consultas
  • Cargas de trabalho lendo o feed de alterações

Cache de itens

O cache de itens é usado para leituras de pontos (pesquisas de chave/valor com base na ID do item e na chave de partição).

Preenchendo o cache de itens

  • Novas gravações, atualizações e exclusões são preenchidas automaticamente no cache de itens do nó pelo qual a solicitação é roteada
  • Os itens de solicitações de leitura pontual em que o item ainda não está no cache (perda de cache) do nó pelo qual a solicitação é roteada são adicionados ao cache de itens
  • As solicitações que fazem parte de um lote transacional ou no modo em massa não preenchem o cache de itens

Invalidação e remoção do cache de itens

Como cada nó tem um cache independente, é possível que os itens sejam invalidados ou removidos no cache de um nó e não dos outros. Os itens no cache de um determinado nó são invalidados e removidos com base nos critérios abaixo:

  • Atualizar ou excluir item
  • Menos recentemente usado (LRU)
  • Tempo de retenção de cache (em outras palavras, o MaxIntegratedCacheStaleness)

Cache de consultas

O cache de consultas é usado para armazenar consultas em cache. O cache de consulta transforma uma consulta em uma pesquisa de chave/valor, onde a chave é o texto da consulta e o valor são os resultados da consulta. O cache integrado não tem um mecanismo de consulta, ele apenas armazena a pesquisa de chave/valor para cada consulta. Os resultados da consulta são armazenados como um conjunto e o cache não controla itens individuais. Um determinado item pode ser armazenado no cache de consultas várias vezes se aparecer no conjunto de resultados de várias consultas. As atualizações dos itens subjacentes não são refletidas nos resultados da consulta, a menos que a obsolescência máxima do cache integrado para a consulta seja atingida e a consulta seja atendida a partir do banco de dados de back-end.

Preenchendo o cache de consulta

  • Se o cache não tiver um resultado para essa consulta (falha de cache) no nó pelo qual foi roteado, a consulta será enviada para o back-end. Depois que a consulta for executada, o cache armazenará os resultados dessa consulta
  • Consultas com a mesma forma, mas parâmetros diferentes ou opções de solicitação que afetam os resultados (por exemplo.max contagem de itens) são armazenadas como seu próprio par chave/valor

Remoção do cache de consulta

A remoção do cache de consulta é baseada no nó pelo qual a solicitação foi roteada. É possível que as consultas possam ser removidas ou atualizadas em um nó e não nos outros.

  • Menos recentemente usado (LRU)
  • Tempo de retenção de cache (em outras palavras, o MaxIntegratedCacheStaleness)

Trabalhando com o cache de consulta

Você não precisa de código especial ao trabalhar com o cache de consultas, mesmo que suas consultas tenham várias páginas de resultados. As práticas recomendadas e o código para paginação de consulta são os mesmos, independentemente de sua consulta atingir o cache integrado ou ser executada no mecanismo de consulta de back-end.

O cache de consultas armazena automaticamente em cache tokens de continuação de consulta quando aplicável. Se você tiver uma consulta com várias páginas de resultados, todas as páginas armazenadas no cache integrado terão uma cobrança de RU de 0. Se as páginas subsequentes dos resultados da consulta exigirem a execução de back-end, elas terão um token de continuação da página anterior para evitar a duplicação do trabalho anterior.

Importante

As instâncias de cache integradas em diferentes nós de gateway dedicados têm caches independentes uns dos outros. Se os dados são armazenados em cache dentro de um nó, eles não são necessariamente armazenados em cache nos outros. Não é garantido que várias páginas da mesma consulta sejam roteadas para o mesmo nó de gateway dedicado.

Consistência de cache integrada

O cache integrado suporta solicitações de leitura apenas com sessão e consistência eventual. Se uma leitura tiver prefixo consistente, obsoletismo delimitado ou consistência forte, ela ignorará o cache integrado e será servida a partir do back-end.

A maneira mais fácil de configurar a sessão ou a consistência eventual para todas as leituras é defini-la no nível da conta. No entanto, se você quiser que apenas algumas de suas leituras tenham uma consistência específica, você também pode configurar a consistência no nível da solicitação.

Nota

Solicitações de gravação com outras consistências ainda preenchem o cache, mas para ler do cache a solicitação deve ter sessão ou consistência eventual.

Consistência de sessão

A consistência de sessão é o nível de consistência mais usado para contas do Azure Cosmos DB distribuídas globalmente e de região única. Com consistência de sessão, sessões de cliente único podem ler suas próprias gravações. Qualquer leitura com consistência de sessão que não tenha um token de sessão correspondente incorrerá em cobranças de RU. Isso inclui a primeira solicitação para um determinado item ou consulta quando o aplicativo cliente é iniciado ou reiniciado, a menos que você passe explicitamente um token de sessão válido. Os clientes fora da sessão que executam gravações verão uma eventual consistência quando estiverem usando o cache integrado.

MaxIntegratedCacheStaleness

O MaxIntegratedCacheStaleness é o atraso máximo aceitável para leituras e consultas de pontos armazenados em cache, independentemente da consistência selecionada. O MaxIntegratedCacheStaleness é configurável no nível da solicitação. Por exemplo, se você definir um MaxIntegratedCacheStaleness de 2 horas, sua solicitação só retornará dados armazenados em cache se os dados tiverem menos de 2 horas. Para aumentar a probabilidade de leituras repetidas utilizando o cache integrado, você deve definir o MaxIntegratedCacheStaleness mais alto que seus requisitos de negócios permitam.

O MaxIntegratedCacheStaleness, quando configurado em uma solicitação que acaba preenchendo o cache, não afeta por quanto tempo essa solicitação fica armazenada em cache. MaxIntegratedCacheStaleness Impõe consistência quando você tenta ler dados armazenados em cache. Não há nenhuma configuração global de TTL ou retenção de cache, portanto, os dados só são removidos do cache se o cache integrado estiver cheio ou se uma nova leitura for executada com uma idade inferior MaxIntegratedCacheStaleness à da entrada em cache atual.

Esta é uma melhoria em relação à forma como a maioria dos caches funciona e permite as seguintes outras personalizações:

  • Você pode definir diferentes requisitos de obsoletos para cada ponto lido ou consulta
  • Clientes diferentes, mesmo que executem o mesmo ponto de leitura ou consulta, podem configurar valores diferentes MaxIntegratedCacheStaleness
  • Se você quiser modificar a consistência de leitura para dados armazenados em cache, a alteração MaxIntegratedCacheStaleness terá um efeito imediato na consistência de leitura

Nota

O valor mínimo MaxIntegratedCacheStaleness é 0 e o valor máximo é de 10 anos. Quando não configurado explicitamente, o MaxIntegratedCacheStaleness padrão é de 5 minutos.

Para entender melhor o parâmetro, considere o MaxIntegratedCacheStaleness seguinte exemplo:

Tempo Pedir Response
t = 0 seg Executar a consulta A com MaxIntegratedCacheStaleness = 30 segundos Retornar resultados do banco de dados back-end (cobranças normais de RU) e preencher o cache
t = 0 seg Executar a consulta B com MaxIntegratedCacheStaleness = 60 segundos Retornar resultados do banco de dados back-end (cobranças normais de RU) e preencher o cache
t = 20 seg Executar a consulta A com MaxIntegratedCacheStaleness = 30 segundos Retornar resultados do cache integrado (carga de 0 RU)
t = 20 seg Executar a consulta B com MaxIntegratedCacheStaleness = 60 segundos Retornar resultados do cache integrado (carga de 0 RU)
t = 40 seg Executar a consulta A com MaxIntegratedCacheStaleness = 30 segundos Retornar resultados do banco de dados back-end (cobranças normais de RU) e atualizar cache
t = 40 seg Executar a consulta B com MaxIntegratedCacheStaleness = 60 segundos Retornar resultados do cache integrado (carga de 0 RU)
t = 50 seg Executar a consulta B com MaxIntegratedCacheStaleness = 20 segundos Retornar resultados do banco de dados back-end (cobranças normais de RU) e atualizar cache

Aprenda a configurar o MaxIntegratedCacheStaleness.

Ignorar o cache integrado (Visualização)

O cache integrado tem uma capacidade de armazenamento limitada determinada pelo SKU de gateway dedicado provisionado. Por padrão, todas as solicitações de clientes configurados com a cadeia de conexão de gateway dedicada passam pelo cache integrado e ocupam espaço de cache. Você pode controlar quais itens e consultas são armazenados em cache com a opção Ignorar solicitação de cache integrado, atualmente em visualização. Essa opção de solicitação é útil para gravações de itens ou solicitações de leitura que não devem ser repetidas com frequência. Ignorar o cache integrado para itens com acesso pouco frequente economiza espaço em cache para itens com mais repetições, aumentando o potencial de economia de RU e reduzindo as remoções. As solicitações que ignoram o cache ainda são roteadas pelo gateway dedicado. Essas solicitações são atendidas a partir do back-end e custam RUs.

Aprenda a ignorar o cache integrado.

Métricas

É útil monitorar algumas métricas-chave para o cache integrado. Essas métricas incluem:

  • DedicatedGatewayCPUUsage - Uso da CPU com tipos de agregação média, máxima ou mínima para dados em todos os nós de gateway dedicados.
  • DedicatedGatewayAverageCPUUsage - (Preterido) Uso médio da CPU em todos os nós de gateway dedicados.
  • DedicatedGatewayMaximumCPUUsage - (Preterido) Uso máximo da CPU em todos os nós de gateway dedicados.
  • DedicatedGatewayMemoryUsage - Uso de memória com tipos de agregação média, máxima ou mínima para dados em todos os nós de gateway dedicados.
  • DedicatedGatewayAverageMemoryUsage - (Preterido) Uso médio de memória em todos os nós de gateway dedicados.
  • DedicatedGatewayRequests - Número total de solicitações de gateway dedicado em todos os nós de gateway dedicados.
  • IntegratedCacheEvictedEntriesSize – A quantidade média de dados removidos do cache integrado devido à LRU em todos os nós de gateway dedicados. Esse valor não inclui dados que expiraram devido ao excesso de MaxIntegratedCacheStaleness tempo.
  • IntegratedCacheItemExpirationCount - O número médio de itens que são removidos do cache integrado devido a leituras de pontos em cache que excedem o MaxIntegratedCacheStaleness tempo em todos os nós de gateway dedicados.
  • IntegratedCacheQueryExpirationCount - O número médio de consultas que são removidas do cache integrado devido a consultas em cache que excedem o MaxIntegratedCacheStaleness tempo em todos os nós de gateway dedicados.
  • IntegratedCacheItemHitRate – A proporção de leituras pontuais que usaram o cache integrado (de todas as leituras pontuais roteadas através do gateway dedicado com sessão ou eventual consistência). Esse valor é uma média de instâncias de cache integradas em todos os nós de gateway dedicados.
  • IntegratedCacheQueryHitRate – A proporção de consultas que usaram o cache integrado (de todas as consultas roteadas através do gateway dedicado com sessão ou eventual consistência). Esse valor é uma média de instâncias de cache integradas em todos os nós de gateway dedicados.

Todas as métricas existentes estão disponíveis, por padrão, em Métricas no portal do Azure (não Métricas clássicas):

Screenshot of the Azure portal that shows the location of integrated cache metrics.

As métricas são média, máxima ou soma em todos os nós de gateway dedicados. Por exemplo, se você provisionar um cluster de gateway dedicado com cinco nós, as métricas refletirão o valor agregado em todos os cinco nós. Não é possível determinar os valores métricos para cada nó individual.

Resolução de problemas comuns

Os exemplos abaixo mostram como depurar alguns cenários comuns:

Não consigo saber se meu aplicativo está usando o gateway dedicado

Verifique o DedicatedGatewayRequestsarquivo . Essa métrica inclui todas as solicitações que usam o gateway dedicado, independentemente de atingirem o cache integrado. Se seu aplicativo usa o gateway padrão ou o modo direto com sua cadeia de conexão original, você não verá uma mensagem de erro, mas o DedicatedGatewayRequests será zero. Se seu aplicativo usa o modo direto com sua cadeia de conexão de gateway dedicada, você ainda pode ver alguns DedicatedGatewayRequests.

Não consigo saber se minhas solicitações estão atingindo o cache integrado

Verifique o IntegratedCacheItemHitRate e IntegratedCacheQueryHitRate. Se ambos os valores forem zero, as solicitações não atingirão o cache integrado. Verifique se você está usando a cadeia de conexão de gateway dedicada, conectando-se com o modo de gateway e se está usando a consistência de sessão ou eventual.

Quero entender se meu gateway dedicado é muito pequeno

Verifique o IntegratedCacheItemHitRate e IntegratedCacheQueryHitRate. Valores altos (por exemplo, acima de 0,7-0,8) são um bom sinal de que o gateway dedicado é grande o suficiente.

Se o ou IntegratedCacheQueryHitRateestiver baixo, olhe para o IntegratedCacheItemHitRateIntegratedCacheEvictedEntriesSize. Se o for IntegratedCacheEvictedEntriesSize alto, isso pode significar que um tamanho de gateway dedicado maior seria benéfico. Você pode experimentar aumentando o tamanho do gateway dedicado e comparando o novo IntegratedCacheItemHitRate e IntegratedCacheQueryHitRateo . Se um gateway dedicado maior não melhorar o ou IntegratedCacheQueryHitRate, é possível que as leituras simplesmente não se repitam o suficiente para que o IntegratedCacheItemHitRate cache integrado seja impactante.

Quero entender se meu gateway dedicado é muito grande

É mais difícil medir se um gateway dedicado é muito grande do que medir se um gateway dedicado é muito pequeno. Em geral, você deve começar pequeno e aumentar lentamente o tamanho do gateway dedicado até que o IntegratedCacheItemHitRate e IntegratedCacheQueryHitRate parar de melhorar. Em alguns casos, apenas uma das duas métricas de acerto de cache será importante, não ambas. Por exemplo, se sua carga de trabalho for principalmente consultas, em vez de leituras pontuais, o é muito mais importante do que o IntegratedCacheQueryHitRateIntegratedCacheItemHitRate.

Se a maioria dos dados for removida do cache devido a exceder o , em vez de LRU, o cache poderá ser maior do que o MaxIntegratedCacheStalenessnecessário. Se IntegratedCacheItemExpirationCount e combinado são quase tão grandes quanto IntegratedCacheEvictedEntriesSize, você pode experimentar com um tamanho de gateway dedicado menor e IntegratedCacheQueryExpirationCount comparar o desempenho.

Quero entender se preciso adicionar mais nós de gateway dedicados

Em alguns casos, se a latência for inesperadamente alta, você pode precisar de mais nós de gateway dedicados em vez de nós maiores. Verifique o e DedicatedGatewayMemoryUsage para determinar se a adição de mais nós de gateway dedicados reduziria a DedicatedGatewayCPUUsage latência. É bom ter em mente que, como todas as instâncias do cache integrado são independentes umas das outras, adicionar mais nós de gateway dedicados não reduzirá o IntegratedCacheEvictedEntriesSize. No entanto, adicionar mais nós melhorará o volume de solicitações que seu cluster de gateway dedicado pode lidar.

Próximos passos