A melhor maneira de otimizar o desempenho e escalonar seus dados no Firebase Realtime Database é dividi-los em várias instâncias do Realtime Database, método conhecido também como fragmentação de banco de dados. Com a fragmentação, você terá flexibilidade para escalonar além dos limites que se aplicam a instâncias de banco de dados individuais, além de ter a opção de realizar balanceamento de carga e otimizar o desempenho.
Quando fragmentar seus dados
É recomendado fragmentar seus dados em vários bancos de dados se você está usando o Realtime Database e se encaixa em algum dos seguintes cenários:
- Você quer escalonar além do limite de 200.000 conexões simultâneas, 1.000 operações de gravação/segundo ou qualquer um dos outros limites para uma única instância de banco de dados.
- Você tem vários conjuntos de dados distintos e quer otimizar o desempenho. Por exemplo: em um app de chat que atenda a grupos diferentes de usuários.
- Você quer balancear a carga em vários bancos de dados para melhorar o tempo de atividade e reduzir o risco de sobrecarregar uma única instância de banco de dados.
Como fragmentar seus dados
Para fragmentar seus dados, siga as etapas descritas abaixo:
- Mapeie seus dados para vários bancos de dados de acordo com as necessidades específicas do seu app.
- Crie várias instâncias de banco de dados.
- Configure seu app para que ele se conecte à instância do Realtime Database necessária para cada conjunto de dados.
Mapear seus dados
Ao mapear seus dados em vários bancos de dados, tente cumprir as seguintes condições:
- Cada consulta é executada somente em uma única instância de banco de dados. O Realtime Database não aceita consultas em várias instâncias de banco de dados.
- Não é possível compartilhar ou duplicar os dados em instâncias de banco de dados, nem fazer compartilhamento ou duplicação mínimos.
- Cada instância do app se conecta a apenas um banco de dados em um determinado momento.
Ao mapear seus dados, considere a aplicação das seguintes estratégias:
Criar um "fragmento mestre"
Salve um mapa de como seus dados são armazenados nas instâncias de banco de dados. Assim, é possível procurar programaticamente qual instância de banco de dados corresponde ao cliente conectado. Tenha em mente que isso talvez gere mais sobrecarga do que uma conexão direta com a instância de banco de dados específica que você precisa, quando houver necessidade.
Agrupar dados por categoria ou por cliente
Armazene dados em instâncias de banco de dados isoladas e agrupadas por usuário ou tipo de dados. Por exemplo, ao criar um aplicativo de chat que atende a várias empresas, é possível gerar uma instância de banco de dados para cada empresa e armazenar todos os dados nessas instâncias exclusivas.
Nesse caso, as empresas A e B não compartilham dados, não há informações duplicadas nos bancos de dados e só é possível realizar consultas em uma única instância de banco de dados. Além disso, os usuários de cada empresa só se conectam ao respectivo banco de dados quando usam o app de chat.
Então, será possível criar várias instâncias de banco de dados com antecedência e usar o ID da empresa para mapear uma equipe à respectiva instância. Por exemplo, a empresa A corresponde ao Realtime Database A.
A maneira de lidar com os dados no seu app depende do seu caso de uso específico, mas as condições e estratégias descritas acima ajudam você a definir qual é a mais adequada para os seus dados.
Criar várias instâncias do Realtime Database
Se você estiver no plano de preços Blaze, poderá criar até 1.000 instâncias de banco de dados no mesmo projeto do Firebase.
- No Console do Firebase, acesse a guia Dados na seção Desenvolver > Database.
- Selecione Criar novo banco de dados no menu da seção Realtime Database.
- Personalize a Referência do banco de dados e as Regras de segurança e clique em Ok.
Repita o processo para criar quantas instâncias de banco de dados forem necessárias. Cada instância de banco de dados tem um conjunto próprio de regras de segurança do Firebase Realtime Database. Assim, você consegue ajustar o acesso aos seus dados.
É possível criar e gerenciar instâncias de banco de dados no Console do Firebase ou usar a API REST de gerenciamento do Realtime Database.
Editar e implantar regras de segurança do Realtime Database para cada instância
Confirme se suas regras de segurança do Realtime Database permitem o acesso apropriado a cada instância do banco de dados no seu projeto. Cada banco de dados tem conjuntos de regras próprios, que podem ser editados e implantados no Console do Firebase ou usando a CLI do Firebase para destinos de implantação.
Para editar e implantar regras usando o Console do Firebase, siga estas etapas:
- Acesse a guia Regras na seção Desenvolver > Database.
- Selecione o banco de dados que você quer editar e modifique as regras.
Para editar e implantar regras com a CLI do Firebase, siga estas instruções:
- Modifique as regras nos arquivos correspondentes das suas instâncias do banco de dados (por exemplo,
foo.rules.json
). - Crie e aplique destinos de implantação para associar bancos de dados que usam o mesmo arquivo de regras. Exemplo:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
Atualize seu arquivo de configuração
firebase.json
com os destinos de implantação:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }
Execute o comando de implantação:
firebase deploy
- Modifique as regras nos arquivos correspondentes das suas instâncias do banco de dados (por exemplo,
Edite e implante as regras consistentemente do mesmo local. Implantar regras com a CLI do Firebase modifica qualquer edição feita no Console do Firebase, e alterar as regras diretamente nesse console modifica qualquer mudança recente implantada com a CLI do Firebase.
Conectar seu app a várias instâncias de banco de dados
Use a referência do banco de dados para acessar dados armazenados em instâncias de banco de dados secundárias. É possível encontrar a referência de uma instância de banco de dados específica por URL ou por app. Se você não especificar um URL, vai encontrar a referência da instância de banco de dados padrão do app.
API modular da Web
import { initializeApp } from "firebase/app"; import { getDatabase } from "firebase/database"; const app1 = initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 const database1 = getDatabase(app1); // Get a database instance for app2 const database2 = getDatabase(app2);
API com namespace da Web
const app1 = firebase.initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = firebase.initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 var database1 = firebase.database(); // Get a database instance for app2 var database2 = firebase.database(app2);
Swift
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()// Confira uma instância secundária do banco de dados por URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];// Receba uma instância de banco de dados secundária por URL @property (forte, não atômica) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];
Kotlin+KTX
// Get the default database instance for an app val primary = Firebase.database.reference // Get a secondary database instance by URL val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference
Java
// Get the default database instance for an app DatabaseReference primary = FirebaseDatabase.getInstance() .getReference(); // Get a secondary database instance by URL DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com") .getReference();
Especificar uma instância ao usar a CLI do Firebase
Use a opção --instance
para especificar em qual Firebase Realtime Database você quer aplicar um comando da CLI do Firebase. Por exemplo, use o seguinte comando para executar o criador de perfil para uma instância de banco de dados denominada my-example-shard.firebaseio.com
:
firebase database:profile --instance "my-example-shard"
Otimizar as conexões em cada banco de dados
Se cada cliente precisa se conectar a vários bancos de dados durante uma sessão, é possível reduzir o número de conexões simultâneas em cada instância de banco de dados. Basta conectá-lo a cada instância somente durante o tempo necessário.
Receber mais orientações
Se você precisar de mais ajuda para fragmentar seus dados em várias instâncias de banco de dados, entre em contato com os especialistas do Firebase no nosso canal no Slack ou no Stack Overflow.