Otimizar o desempenho do Database

Há algumas maneiras diferentes de melhorar o desempenho do Firebase Realtime Database no app. Para descobrir o que fazer para otimizar o desempenho do Realtime Database, colete dados com as diferentes ferramentas de monitoramento do Realtime Database e faça mudanças no app ou no uso do Realtime Database.

Monitorar o desempenho do Realtime Database

Você pode usar ferramentas diferentes para coletar dados sobre o desempenho do Realtime Database, de acordo com o nível de granularidade necessário:

  • Visão geral: use a ferramenta de criação de perfil para ter acesso a uma lista de consultas não indexadas e uma visão geral das operações de leitura/gravação em tempo real.
  • Estimativa de uso faturado: use as métricas de uso disponíveis no console do Firebase para conferir o uso faturado e as métricas de desempenho gerais.
  • Análise detalhada: use o Cloud Monitoring para ter uma visão mais detalhada do desempenho do banco de dados ao longo do tempo.

Melhorar o desempenho por métrica

Depois de coletar os dados, siga as práticas recomendadas e estratégias a seguir de acordo com a área de desempenho que você quer melhorar.

Resumo das estratégias para melhoria de desempenho
Métrica Descrição Práticas recomendadas
Carga/utilização Otimize a capacidade do seu banco de dados que está em uso para solicitações de processamento em um momento específico (dados refletidos nas métricas **Load** ou **io/database_load**). Otimizar a estrutura de dados
Fragmentar dados entre bancos de dados
Melhorar a eficiência dos listeners
Limitar downloads com regras baseadas em consultas
Otimizar conexões
Conexões ativas Equilibre o número de conexões ativas simultâneas com seu banco de dados para não exceder o limite de 200.000 conexões. Fragmentar dados entre bancos de dados
Reduzir novas conexões
Largura de banda de saída Se os downloads do seu banco de dados parecerem maiores do que você gostaria, melhore a eficiência das suas operações de leitura e reduza a sobrecarga de criptografia. Otimizar conexões
Otimizar a estrutura dos dados
Limitar downloads com regras baseadas em consultas
Reutilizar sessões SSL
Melhorar a eficiência dos listeners
Restringir o acesso aos dados
Armazenamento Verifique se você está armazenando dados não utilizados ou distribua seus dados entre outros bancos e/ou produtos do Firebase para não exceder a cota. Limpar os dados não utilizados
Otimizar a estrutura de dados
Fragmentar dados entre bancos de dados
Usar o Cloud Storage for Firebase

Otimizar conexões

Solicitações RESTful como GET e PUT ainda exigem uma conexão, mesmo que ela seja de curta duração. Essas conexões frequentes e de curta duração podem resultar em mais custos de conexão, carga de banco de dados e largura de banda de saída do que as conexões ativas em tempo real.

Sempre que possível, use os SDKs nativos da plataforma do seu app em vez da API REST. Eles mantêm conexões abertas e, assim, reduzem os custos de criptografia SSL e a carga do banco de dados em comparação à API REST.

Se você usa a API REST, considere utilizar um sinal de atividade HTTP para manter uma conexão aberta ou, então, use eventos enviados pelo servidor para reduzir os custos de handshakes de SSL.

Fragmentar dados entre vários bancos de dados

A divisão de 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. O processo aumenta a quantidade total de conexões ativas e simultâneas permitidas no seu app, dividindo-as em instâncias de banco de dados.
  2. Ele distribui a carga entre instâncias do banco de dados.
  3. Se você tem grupos independentes de usuários que precisam de acesso apenas a conjuntos de dados distintos, é possível usar instâncias diferentes do banco de dados para aumentar a capacidade e diminuir a latência.

Se você usa o plano de preços Blaze, poderá criar várias instâncias do banco de dados no mesmo projeto do Firebase, além de aproveitar o mesmo método de autenticação utilizado nelas.

Saiba mais sobre como e quando fragmentar dados.

Criar estruturas de dados eficientes

Como o Realtime Database recupera os dados dos nós filhos de um caminho, bem como do próprio caminho, é recomendável simplificar a estrutura de dados ao máximo. Assim, é possível recuperar os dados de que precisa de maneira seletiva, sem fazer o download de dados desnecessários para os clientes.

Considere principalmente as gravações e exclusões quando estiver estruturando seus dados. Por exemplo, a exclusão de caminhos com milhares de folhas pode ser cara. Dividi-los em caminhos com várias subárvores e menos folhas por nó pode agilizar 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 maneira que permita gravações 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 PATCH RESTful.

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

Impedir acessos não autorizados

Evite operações não autorizadas no seu banco de dados com o Realtime Database Security Rules. Por exemplo, o uso de regras pode evitar que um usuário malicioso faça downloads repetidos de todo o seu banco de dados.

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

Usar regras baseadas em consultas para limitar downloads

Além de restringirem o acesso aos dados no banco de dados, Realtime Database Security Rules também podem limitar os dados retornados pelas operações de leitura. Quando você usa regras baseadas em consultas, conforme definido pelas expressões query. como query.limitToFirst, as consultas recuperam apenas os dados delimitados pela regra.

Por exemplo, a seguinte regra limita o acesso de leitura somente aos primeiros 1.000 resultados de uma consulta, ordenados por prioridade:

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

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

Saiba mais sobre Realtime Database Security Rules.

Indexar consultas

Indexar seus dados reduz a largura de banda total usada para cada consulta que seu app executa.

Reutilizar sessões SSL

Reduza os custos gerais de criptografia SSL nas conexões retomadas emitindo tickets de sessão TLS. Isso é muito útil caso você precise de conexões frequentes e seguras ao banco de dados.

Melhorar a eficiência dos listeners

Coloque os listeners na última parte possível do caminho para limitar a quantidade de dados que eles sincronizam. Seus listeners devem estar perto dos dados que você quer detectar. Não coloque listeners na raiz do banco de dados, pois isso resulta em downloads de todo o banco de dados.

Adicione consultas para limitar os dados retornados pelas suas operações de detecção e use listeners que fazem o download somente de atualizações de dados. Por exemplo, on() em vez de once(). Use .once() somente em ações que realmente não exigem atualizações de dados. Além disso, classifique suas consultas com orderByKey() sempre que possível para alcançar o melhor desempenho. A classificação com orderByChild() pode ser de seis a oito vezes mais lenta. Por sua vez, a classificação com orderByValue() pode ser muito lenta para grandes conjuntos de dados porque requer uma leitura de todo o local, desde a camada de persistência.

Lembre-se também de adicionar listeners de maneira dinâmica e de removê-los quando não forem mais necessários.

Limpar dados não utilizados

Remova periodicamente os dados não utilizados ou duplicados do seu banco de dados. Você pode executar backups para inspecionar os dados manualmente ou configurar um backup periódico deles em um bucket do Google Cloud Storage. Além disso, considere hospedar os dados armazenados no Cloud Storage for Firebase.

Enviar códigos escalonáveis que podem ser atualizados

Os apps criados em dispositivos de IoT devem incluir códigos escalonáveis que possam ser atualizados facilmente. Teste os casos de uso cuidadosamente, prepare-se para um possível aumento significativo da sua base de usuários e inclua a possibilidade de implantar atualizações no seu código. Analise bem as principais mudanças que podem ser necessárias no futuro se você decidir, por exemplo, fragmentar seus dados.