获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Escalar com vários bancos de dados

A melhor maneira de otimizar o desempenho e dimensionar seus dados no Firebase Realtime Database é dividi-los em várias instâncias do Realtime Database, também conhecido como fragmentação de banco de dados. A fragmentação oferece a flexibilidade de escalar além dos limites que se aplicam a instâncias de banco de dados individuais, além de balanceamento de carga e otimização de desempenho.

Quando fragmentar seus dados

Talvez você queira fragmentar seus dados em vários bancos de dados se estiver usando o Realtime Database e se encaixar em qualquer um dos seguintes cenários:

  • Você deseja dimensionar 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 discretos e deseja otimizar o desempenho (por exemplo, um aplicativo de bate-papo que atende a grupos de usuários separados e independentes).
  • Você deseja equilibrar 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 estas etapas (descritas com mais detalhes abaixo):

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

Mapeie seus dados

Ao mapear seus dados para vários bancos de dados, tente atender às seguintes condições:

  • Cada consulta é executada apenas em uma única instância de banco de dados. O Realtime Database não oferece suporte a consultas em instâncias de banco de dados.
  • Sem compartilhamento ou duplicação de dados entre instâncias de banco de dados (ou compartilhamento ou duplicação mínima).
  • Cada instância do aplicativo se conecta apenas a um banco de dados em um determinado momento.

Ao mapear seus dados, considere aplicar as seguintes estratégias:

Criar um "fragmento mestre"

Armazene um mapa de como seus dados são armazenados em instâncias de banco de dados. Dessa forma, você pode pesquisar programaticamente qual instância de banco de dados corresponde ao cliente conectado. Lembre-se de que isso pode ter mais sobrecarga do que conectar-se diretamente à instância de banco de dados específica de que você precisa, quando precisar.

Dados do bucket por categorias ou por cliente

Armazene dados em instâncias de banco de dados em silos, agrupadas por usuário ou tipo de dados. Por exemplo, se você criar um aplicativo de bate-papo que atende a várias organizações, poderá criar uma instância de banco de dados para cada organização e armazenar todos os dados de bate-papo em instâncias de banco de dados exclusivas.

Nesse caso, a organização A e a organização B não compartilham dados, não há dados duplicados em seus bancos de dados e você realiza consultas apenas em uma única instância de banco de dados. Além disso, os usuários de cada organização só se conectam ao banco de dados da organização quando usam o aplicativo de bate-papo.

Você pode criar várias instâncias de banco de dados antecipadamente e usar o ID da organização para mapear uma equipe para sua instância de banco de dados. Por exemplo, a organização A mapeia para o Realtime Database A.

A maneira como você mapeia os dados para seu aplicativo depende do seu caso de uso específico, mas as condições e estratégias descritas acima podem ajudá-lo a definir o que funciona para seus dados.

Crie várias instâncias do Realtime Database

Se você estiver no plano de preços Blaze , poderá criar várias instâncias de banco de dados no mesmo projeto do Firebase.

crie um banco de dados no 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 > Banco de dados.
  2. Selecione Criar novo banco de dados no menu da seção Realtime Database .
  3. Personalize a referência do banco de dados e as regras de segurança e clique em Entendi .

Repita o processo para criar quantas instâncias de banco de dados forem necessárias. Cada instância de banco de dados tem seu próprio conjunto de regras do Firebase Realtime Database para que você possa ajustar o acesso aos seus dados.

Você pode criar e gerenciar instâncias de banco de dados no console do Firebase ou usando a API REST de gerenciamento de banco de dados em tempo real .

Edite e implante regras do Realtime Database para cada instância

Certifique-se de que suas regras do Realtime Database permitam o acesso apropriado a cada instância de banco de dados em seu projeto. Cada banco de dados tem seu próprio conjunto de regras, que você pode editar e implantar no Firebase console ou usando a Firebase CLI para implantar destinos .

  • Para editar e implantar regras no Firebase console, siga estas etapas:

    1. Vá para a guia Regras na seção Desenvolver > Banco de dados .
    2. Selecione o banco de dados que deseja editar e modifique as regras.
  • Para editar e implantar regras da Firebase CLI, siga estas etapas:

    1. Modifique as regras nos arquivos de regras para suas instâncias de 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. Por 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 deploy:

      firebase deploy

Certifique-se de editar e implantar regras consistentemente no mesmo local. A implantação de regras da Firebase CLI substitui todas as edições feitas no Firebase console, e a edição de regras diretamente no Firebase console substitui todas as alterações recentes implantadas por meio da Firebase CLI.

Conecte seu aplicativo a várias instâncias de banco de dados

Use a referência de banco de dados para acessar dados armazenados em instâncias de banco de dados secundárias. Você pode obter a referência para uma instância de banco de dados específica por URL ou aplicativo. Se você não especificar uma URL, obterá a referência da instância de banco de dados padrão do aplicativo.

Web version 9

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 version 8

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);
Rápido
Observação: este produto Firebase não está disponível no destino App Clip.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Obtém uma instância de banco de dados secundária por URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objetivo-C
Observação: este produto Firebase não está disponível no destino App Clip.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Obtém uma instância de banco de dados secundária por URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] referência];

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

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

Especifique uma instância ao usar a Firebase CLI

Use a opção --instance para especificar a qual Firebase Realtime Database você deseja aplicar um comando da Firebase CLI. Por exemplo, use o comando a seguir para executar o criador de perfil para uma instância de banco de dados chamada my-example-shard.firebaseio.com :

firebase database:profile --instance "my-example-shard"

Otimize as conexões em cada banco de dados

Se cada cliente precisar se conectar a vários bancos de dados durante uma sessão, você poderá reduzir o número de conexões simultâneas a cada instância de banco de dados conectando-se a cada instância de banco de dados apenas pelo tempo necessário.

Obtenha mais conselhos

Se 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 em nosso canal do Slack ou no Stack Overflow .