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:
- 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.
- Ele distribui a carga entre instâncias do banco de dados.
- 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.