Otimize o desempenho do banco de dados

Existem algumas maneiras diferentes de melhorar o desempenho do Firebase Realtime Database no seu aplicativo. Para descobrir o que você pode fazer para otimizar o desempenho do Realtime Database, reúna dados por meio das diferentes ferramentas de monitoramento do Realtime Database e, em seguida, faça alterações no seu aplicativo ou no uso do Realtime Database de acordo.

Monitore o desempenho do Realtime Database

Você pode coletar dados sobre o desempenho do Realtime Database por meio de algumas ferramentas diferentes, dependendo do nível de granularidade necessário:

  • Visão geral de alto nível: use a ferramenta profiler para obter uma lista de consultas não indexadas e uma visão geral em tempo real das operações de leitura/gravação.
  • Estimativa de uso faturado: use as métricas de uso disponíveis no Console do Firebase para ver seu uso faturado e métricas de desempenho de alto nível.
  • Detalhamento detalhado: use o Cloud Monitoring para uma visão mais granular do desempenho do seu banco de dados ao longo do tempo.

Melhore o desempenho por métrica

Depois de coletar os dados, explore as práticas recomendadas e estratégias a seguir com base na área de desempenho que você deseja melhorar.

Visão geral das estratégias de melhoria de desempenho
Métrica Descrição Melhores Práticas
Carga/Utilização Otimize quanto da capacidade do seu banco de dados está em uso para processar solicitações a qualquer momento (refletido nas métricas **Load** ou **io/database_load**). Otimize sua estrutura de dados
Fragmentar dados em bancos de dados
Melhore a eficiência do ouvinte
Limite downloads com regras baseadas em consulta
Otimizar conexões
Conexões ativas Equilibre o número de conexões simultâneas e ativas com seu banco de dados para permanecer abaixo do limite de 200.000 conexões. Fragmentar dados em bancos de dados
Reduza novas conexões
Largura de banda de saída Se os downloads do seu banco de dados parecerem maiores do que você deseja, você poderá melhorar a eficiência das suas operações de leitura e reduzir a sobrecarga de criptografia. Otimizar conexões
Otimize sua estrutura de dados
Limite downloads com regras baseadas em consulta
Reutilizar sessões SSL
Melhore a eficiência do ouvinte
Restringir o acesso aos dados
Armazenar Certifique-se de não armazenar dados não utilizados ou equilibre seus dados armazenados em outros bancos de dados e/ou produtos do Firebase para permanecer dentro da cota. Limpe os dados não utilizados
Otimize sua estrutura de dados
Fragmentar dados em bancos de dados
Use o armazenamento em nuvem para Firebase

Otimizar conexões

Solicitações RESTful como GET e PUT ainda exigem uma conexão, mesmo que essa conexão tenha vida curta. Essas conexões frequentes e de curta duração podem, na verdade, resultar em custos de conexão, carga de banco de dados e largura de banda de saída significativamente maiores do que conexões ativas em tempo real com seu banco de dados.

Sempre que possível, use os SDKs nativos da plataforma do seu app, em vez da API REST. Os SDKs mantêm conexões abertas, reduzindo os custos de criptografia SSL e a carga do banco de dados que podem ser somados à API REST.

Se você usar a API REST, considere usar um keep-alive HTTP para manter uma conexão aberta ou usar eventos enviados pelo servidor , o que pode reduzir os custos de handshakes SSL.

Fragmentar dados em vários bancos de dados

A divisão de seus dados em várias instâncias do Realtime Database, também conhecida como fragmentação de banco de dados, oferece três benefícios:

  1. Aumente o total de conexões ativas simultâneas permitidas em seu aplicativo dividindo-as entre instâncias de banco de dados.
  2. Equilibre a carga entre instâncias de banco de dados.
  3. Se você tiver grupos independentes de usuários que só precisam de acesso a conjuntos de dados discretos, use diferentes instâncias de banco de dados para obter maior rendimento e menor latência.

Se você estiver no plano de preços Blaze , poderá criar várias instâncias de banco de dados no mesmo projeto do Firebase, aproveitando um método comum de autenticação de usuário em todas as instâncias de banco de dados.

Saiba mais sobre como e quando fragmentar dados .

Crie estruturas de dados eficientes

Como o Realtime Database recupera os dados dos nós filhos de um caminho, bem como do caminho, faz sentido manter sua estrutura de dados o mais simples possível. Dessa forma, você pode recuperar seletivamente os dados necessários, sem baixar dados desnecessários para os clientes.

Em particular, considere gravações e exclusões ao estruturar seus dados. Por exemplo, caminhos com milhares de folhas são potencialmente caros para serem excluídos. Dividi-los em caminhos com múltiplas subárvores e menos folhas por nó pode acelerar as exclusões.

Além disso, cada gravação pode ocupar 0,1% da utilização total do banco de dados. Estruture seus dados de uma forma que permita gravar em lote em uma única operação como atualizações de vários caminhos por meio dos métodos update() nos SDKs ou nas solicitações RESTful PATCH .

Para otimizar sua estrutura de dados e melhorar o desempenho, siga as práticas recomendadas para estruturas de dados .

Impedir acesso não autorizado

Evite operações não autorizadas no seu banco de dados com as regras de segurança do Realtime Database. Por exemplo, o uso de regras pode evitar um cenário em que um usuário mal-intencionado baixe repetidamente todo o seu banco de dados.

Saiba mais sobre como usar as regras do Firebase Realtime Database .

Use regras baseadas em consulta para limitar downloads

As regras de segurança do banco de dados em tempo real restringem o acesso aos dados do seu banco de dados, mas também podem servir como limites aos dados retornados por meio de operações de leitura. Quando você usa regras baseadas em consulta, conforme definido por query. expressões como query.limitToFirst , as consultas recuperam apenas os dados limitados pela regra.

Por exemplo, a regra a seguir limita o acesso de leitura apenas aos primeiros 1.000 resultados de uma consulta, conforme ordenado por prioridade:

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

Saiba mais sobre as regras de segurança do Realtime Database .

Consultas de índice

A indexação dos seus dados reduz a largura de banda total usada para cada consulta executada pelo seu aplicativo.

Reutilizar sessões SSL

Reduza os custos indiretos de criptografia SSL em conexões retomadas emitindo tickets de sessão TLS . Isto é particularmente útil se você precisar de conexões seguras e frequentes com o banco de dados.

Melhore a eficiência do ouvinte

Coloque seus ouvintes o mais longe possível para limitar a quantidade de dados que eles sincronizam. Seus ouvintes devem estar próximos dos dados que você deseja que eles obtenham. Não escute na raiz do banco de dados, pois isso resultará em downloads de todo o seu banco de dados.

Adicione consultas para limitar os dados que suas operações de escuta retornam e use ouvintes que baixam apenas atualizações de dados — por exemplo, on() em vez de once() . Reserve .once() para ações que realmente não exijam atualizações de dados. Além disso, classifique suas consultas usando orderByKey() , sempre que possível, para obter o melhor desempenho. A classificação com orderByChild() pode ser de 6 a 8 vezes mais lenta, e a classificação com orderByValue() pode ser muito lenta para grandes conjuntos de dados, pois requer uma leitura de todo o local da camada de persistência.

Certifique-se também de adicionar ouvintes dinamicamente e removê-los quando não forem mais necessários.

Limpe os dados não utilizados

Remova periodicamente quaisquer dados não utilizados ou duplicados do seu banco de dados. Você pode executar backups para inspecionar manualmente seus dados ou fazer backup deles periodicamente em um intervalo do Google Cloud Storage. Considere também hospedar dados armazenados por meio do Cloud Storage para Firebase .

Envie código escalonável que você pode atualizar

Os aplicativos integrados em dispositivos IoT devem incluir código escalável que você possa atualizar facilmente. Certifique-se de testar os casos de uso minuciosamente, considerar cenários em que você pode aumentar sua base de usuários exponencialmente e desenvolver a capacidade de implantar atualizações em seu código. Considere cuidadosamente as principais alterações que você pode precisar fazer no futuro, se, por exemplo, decidir fragmentar seus dados.