Escalonar com vários bancos de dados

A melhor maneira de otimizar o desempenho e dimensionar dados no Firebase Realtime Database é dividir os dados em várias instâncias do Realtime Database, um processo também conhecido como fragmentação de banco de dados. Com a fragmentação, você tem 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 o balanceamento de carga e otimizar o desempenho.

Quando fragmentar seus dados

É recomendado fragmentar os dados em vários bancos de dados ao usar o Realtime Database quando sua situação corresponde a 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:

  1. Mapeie seus dados para vários bancos de dados de acordo com as necessidades específicas do seu app.
  2. Crie várias instâncias de banco de dados.
  3. Configure o app para que ele se conecte à instância do Realtime Database necessária para cada conjunto de dados.

Associar 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 dá suporte a 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.

criar um banco de dados no <span class=Console do Firebase com o menu de contexto na seção de bancos de dados" />

  1. No console do Firebase, acesse a guia Dados na seção Desenvolver > Database.
  2. Selecione Criar banco de dados no menu na seção Realtime Database.
  3. 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 Firebase Realtime Database Security Rules. Assim, você pode ajustar o acesso aos 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 o Realtime Database Security Rules para cada instância

Confirme se Realtime Database Security Rules permitem o acesso adequado a cada instância de banco de dados no 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:

    1. Acesse a guia Regras na seção Desenvolver > Database.
    2. Selecione o banco de dados que você quer editar e modifique as regras.
  • Para editar e implantar regras usando a CLI do Firebase, siga estas etapas:

    1. Modifique as regras nos arquivos correspondentes das suas instâncias do banco de dados (por exemplo, foo.rules.json).
    2. 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
    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"}
        ]
      }
      
    4. Execute o comando de implantação:

      firebase deploy

Edite e implante as regras consistentemente do mesmo local. Implantar regras com a CLI do Firebase modifica as edições feitas no console do Firebase, e editar regras diretamente no console do Firebase modifica as alterações recentes implantadas pela 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.

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);

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
Observação: este produto do Firebase não está disponível no destino Clipes de apps.
// Get the default database instance for an app
var 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
Observação: este produto do Firebase não está disponível no destino Clipes de apps.
// 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 este comando para executar o criador de perfil para a instância de banco de dados 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.