Ir para o console

Práticas recomendadas para o Cloud Firestore

Use as práticas recomendadas aqui como uma referência rápida ao criar um app que usa o Cloud Firestore.

Códigos de documentos

  • Evite os códigos de documentos . e ...
  • Evite usar / barras em códigos de documentos.
  • Não use códigos de documento que aumentam constantemente, como:

    • Customer1, Customer2, Customer3, ...
    • Product 1, Product 2, Product 3, ...

    Esses códigos sequenciais podem levar a pontos de acesso que afetam a latência.

Nomes dos campos

  • Evite os seguintes caracteres nos nomes de campos, porque eles exigem escape extra:

    • . ponto final
    • [ colchete esquerdo
    • ] colchete direito
    • * asterisco
    • ` crase

Índices

  • Evite usar muitos índices. Um excesso de índices pode aumentar a latência de gravação e aumenta os custos de armazenamento para entradas de índice.

  • Esteja ciente de que os campos de indexação com valores que crescem constantemente, como carimbo de data/hora, podem levar a pontos de acesso que afetam a latência de aplicativos com altas taxas de leitura e gravação.

Isenções de índice

Para a maioria dos aplicativos, é possível confiar na indexação automática, além de links de mensagens de erro para gerenciar seus índices. No entanto, é possível adicionar isenções de campo único nos seguintes casos:

Caso Descrição
Campos de string grandes

Se você tiver um campo de string que geralmente armazena valores de string longos que você não usa para consulta, é possível reduzir os custos de armazenamento com a isenção da indexação no campo.

Taxas de gravação altas em uma coleção que contém documentos com valores sequenciais

Se você indexar um campo que aumenta ou diminui sequencialmente entre documentos em uma coleção, como um carimbo de data/hora, a taxa máxima de gravação para a coleção será de 500 gravações por segundo. Se você não fizer consultas com base no campo com valores sequenciais, pode isentar o campo da indexação para ignorar esse limite.

Em um caso de uso de Internet das Coisas (IoT na sigla em inglês) com uma alta taxa de gravação, por exemplo, uma coleção que contém documentos com um campo de carimbo de data/hora pode se aproximar do limite de 500 gravações por segundo.

Campos grandes de matriz ou de mapa

Campos grandes de matriz ou de mapa podem se aproximar do limite de 20.000 entradas de índice por documento. Se você não estiver fazendo consultas com base em um campo grande de matriz ou de mapa, é recomendável isentá-lo da indexação.

Ler e gravar operações

  • Evite gravar em um documento mais de uma vez por segundo. Para mais informações, consulte Atualizações para um único documento.

  • Em vez de operações individuais, use operações em lote para gravações e exclusões. As operações em lote são mais eficientes, porque desempenham várias operações com a mesma sobrecarga como uma única operação.

  • Quando possível, use chamadas assíncronas, em vez de chamadas síncronas. As chamadas assíncronas reduzem o impacto da latência. Por exemplo, considere um aplicativo que precisa do resultado de uma pesquisa de documento e dos resultados de uma consulta antes de renderizar uma resposta. Se a pesquisa e a consulta não tiverem dependência de dados, não haverá necessidade de aguardar a conclusão da pesquisa de maneira síncrona antes de iniciar a consulta.

  • Não use deslocamentos. Em vez disso, use cursores. O uso de um deslocamento só evita o retorno dos documentos ignorados para o aplicativo, mas ainda é possível recuperar esses documentos internamente. Os documentos ignorados afetam a latência da consulta, e as operações de leitura necessárias para recuperá-los são cobradas do seu aplicativo.

Como desenvolver um projeto para escalonar

As práticas recomendadas a seguir descrevem como evitar situações que criam problemas de contenção:

Atualizações para um único documento

Evite atualizar um único documento mais de uma vez por segundo. Ao atualizar um documento muito rápido, seu aplicativo passará por contenções, que inclui maior latência, tempos limite e outros erros.

Altas taxas de leitura, gravação e exclusão para um intervalo de documentos estreito

Evite altas taxas de leitura ou gravação para fechar documentos lexicograficamente, ou seu aplicativo sofrerá erros de contenção. Esse problema é conhecido como uso excessivo do ponto de acesso, e seu aplicativo pode sofrer isso ao fazer o seguinte:

  • Criar novos documentos em uma taxa muito alta e alocar seus próprios códigos constantemente crescentes.

    O Cloud Firestore aloca códigos de documento ao usar um algoritmo de dispersão. Não se deve encontrar um uso excessivo do ponto de acesso em gravações se criar novos documentos ao usar códigos de documentos automáticos.

  • Criar novos documentos em uma alta taxa em uma coleção com poucos documentos.

  • Criar novos documentos com um campo constantemente crescente, como um carimbo de data/hora, em uma taxa muito alta.

  • Excluir documentos em uma coleção em uma taxa alta.

  • Gravar para o banco de dados a uma taxa muito alta sem aumentar gradualmente o tráfego.

Como intensificar o tráfego

Intensifique gradualmente o tráfego para novas coleções ou documentos lexicograficamente próximos para que o Cloud Firestore tenha tempo suficiente de preparar os documentos para o aumento do tráfego. Recomendamos começar com um máximo de 500 operações por segundo para uma nova coleção e aumentar o tráfego em 50% a cada 5 minutos. Por exemplo, é possível usar essa programação de aumento para aumentar seu tráfego de leitura para 740 mil operações por segundo após 90 minutos. É possível aumentar o tráfego de gravação, mas considere os limites padrão do Cloud Firestore. Confira se as operações estão distribuídas relativamente de forma uniforme por todo o intervalo de chaves. Isso é chamado de regra "500/50/5".

Como migrar o tráfego para uma nova coleção

O aumento gradual é particularmente importante se você migrar o tráfego de aplicativos de uma coleção para outra. Uma forma simples de lidar com essa migração é ler a coleção antiga e, se o documento não existir, ler a partir da nova coleção. No entanto, isso pode causar um aumento repentino de tráfego para fechar documentos lexicograficamente na nova coleção. O Cloud Firestore pode não conseguir preparar com eficiência a nova coleção para aumentar o tráfego, especialmente quando ela contém poucos documentos.

Um problema semelhante pode ocorrer se você alterar os códigos de documentos de muitos documentos na mesma coleção.

A melhor estratégia para migrar o tráfego para uma nova coleção depende do seu modelo de dados. Abaixo está uma estratégia de exemplo conhecida como leituras paralelas. É necessário determinar se essa estratégia é ou não eficaz para seus dados, e uma consideração importante é o impacto dos custos das operações paralelas durante a migração.

Leituras paralelas

Primeiro leia a coleção antiga para implementar leituras paralelas à medida que migrar o tráfego a uma nova coleção. Se não houver documento, leia a partir da nova coleção. Uma alta taxa de leitura de documentos inexistentes pode levar ao uso excessivo do ponto de acesso. Dessa forma, certifique-se de aumentar gradualmente a carga para a nova coleção. Uma melhor estratégia é copiar o documento antigo para a nova coleção e, em seguida, excluir o documento antigo. Aumente gradualmente a leitura paralela a fim de garantir que o Cloud Firestore possa lidar com o tráfego para a nova coleção.

Uma estratégia possível para aumentar gradualmente as leituras ou gravações em uma nova coleção é gerar um hash determinístico do código do usuário para selecionar uma porcentagem aleatória de usuários que tentam gravar novos documentos. Verifique se o resultado do hash do código do usuário não foi distorcido pela função ou pelo comportamento do usuário.

Enquanto isso, gere um job em lote que copie todos os dados dos documentos antigos para a nova coleção. O trabalho em lote deve evitar gravações em códigos de documentos sequenciais para evitar pontos de acesso. Quando o trabalho em lote termina, é possível ler somente a partir da nova coleção.

Uma maneira de refinar essa estratégia é migrar em lotes pequenos de usuários de uma só vez. Adicione um campo ao documento do usuário que rastreie seus status de migração. Selecione um lote de usuários a fim migrar com base em um hash do código do usuário. Use um trabalho em lotes com o objetivo de migrar documentos a esse lote de usuários e use leituras paralelas para usuários no meio da migração.

Observe que, a menos que você faça gravações duplas das entidades antigas e novas durante a fase de migração (o que aumentaria os custos do Cloud Firestore), a reversão não é fácil.

Impedir acessos não autorizados

Evite operações não autorizadas em seu banco de dados com as regras de segurança do Cloud Firestore. Por exemplo, o uso de regras pode evitar que um usuário mal-intencionado faça downloads repetidos de todo o seu banco de dados.

Saiba mais sobre como usar as regras de segurança do Cloud Firestore.