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 flexibilidade para escalar além dos limites aplicáveis ​​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 enquadrar em qualquer um dos seguintes cenários:

  • Você deseja escalar além do limite de 200.000 conexões simultâneas, 1.000 operações de gravação/segundo ou qualquer outro limite 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 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.
  • Nenhum compartilhamento ou duplicação de dados entre instâncias de banco de dados (ou compartilhamento ou duplicação mínimos).
  • Cada instância do aplicativo se conecta apenas a um banco de dados a qualquer momento.

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

Crie um "fragmento mestre"

Armazene um mapa de como seus dados são armazenados nas instâncias de banco de dados. Dessa forma, você pode procurar programaticamente qual instância de banco de dados corresponde ao cliente conectado. Lembre-se de que isso pode gerar mais sobrecarga do que conectar-se diretamente à instância específica do banco de dados necessária, quando necessário.

Dados do intervalo por categorias ou por cliente

Armazene dados em instâncias de banco de dados isoladas, agrupadas por usuário ou tipo de dados. Por exemplo, se você criar um aplicativo de chat que atenda a diversas organizações, poderá criar uma instância de banco de dados para cada organização e armazenar todos os dados de chat 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ê executa 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 chat.

Você pode então criar diversas 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 é mapeada para o Realtime Database A.

A maneira como você mapeia 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 até 1.000 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, vá para a guia Dados na seção Desenvolvimento > 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 de segurança 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 do Realtime Database Management .

Editar e implantar regras de segurança do Realtime Database para cada instância

Certifique-se de que suas regras de segurança do Realtime Database permitam 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 console do Firebase ou usando a CLI do Firebase para implantar destinos .

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

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

    1. Modifique as regras nos arquivos de regras das instâncias do seu banco de dados (por exemplo, foo.rules.json ).
    2. Crie e aplique destinos de implementaçã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 de implantação:

      firebase deploy

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

Conecte seu aplicativo 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. Você pode obter a referência para uma instância de banco de dados específica por URL ou aplicativo. Se não especificar um URL, você obterá a referência da instância de banco de dados padrão do aplicativo.

Web modular API

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 namespaced API

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 do 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").referência()
Objetivo-C
Observação: este produto do 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];
// Obtenha uma instância de banco de dados secundária pela URL @property (forte, não atômica) FIRDatabaseReference *ref; self.ref = [[banco de dados FIRDatabaseWithURL:@"https://testapp-1234.firebaseio.com"] referência];

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

Especifique uma instância ao usar a CLI do Firebase

Use a opção --instance para especificar a qual Firebase Realtime Database você deseja aplicar um comando Firebase CLI. Por exemplo, use o seguinte comando 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 com 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 Slack ou no Stack Overflow .