Ir para o console

Escalonar com vários bancos de dados

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 poder realizar balanceamento de carga e otimizar o 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 nos seguintes cenários:

  • Você quer escalonar além do limite de 100.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 bate-papo 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 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, você pode procurar programaticamente qual instância de banco de dados corresponde ao cliente conectado. Tenha em mente que isso poderá gerar 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 agrupadas por usuário ou tipo de dados. Por exemplo, ao criar um aplicativo de bate-papo que atende a várias empresas, você pode 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 bate-papo.

Então, você poderá criar várias instâncias de banco de dados com antecedência e usar o código da empresa para mapear uma equipe à respectiva instância. Por exemplo, a empresa A fica mapeada para o Realtime Database A.

A maneira como você mapeia dados para seu app depende do seu caso de uso específico, mas as condições e estratégias descritas acima podem ajudar você a definir qual é a mais adequada para os seus dados.

Criar várias instâncias do Realtime Database

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

crie um banco de dados no Firebase console com o menu de contexto na seção de bancos de dados

  1. No Console do Firebase, acesse a guia Dados na seção Desenvolvimento > Database.
  2. Selecione Criar novo banco de dados no menu da seção Bancos de dados.
  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 regras do Firebase Realtime Database. Assim, você pode ajustar o acesso aos seus dados.

Editar e implantar regras do Realtime Database para cada instância

Confirme se suas regras 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 a partir do Console do Firebase ou usando a Firebase CLI para implantar destinos.

  • Para editar e implantar regras usando o Console do Firebase, siga estas etapas:

    1. Acesse a guia Regras na seção Desenvolvimento > Database.
    2. Selecione o banco de dados que você quer editar e modifique as regras.
  • Para editar e implantar regras a partir da Firebase CLI, 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. 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

Edite e implante as regras consistentemente a partir do mesmo local. A implantação de regras a partir da Firebase CLI modifica qualquer edição feita no Firebase console, e a edição de regras diretamente no Firebase console modifica qualquer alteração recente implantada por meio da Firebase CLI.

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. Você pode ver 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, verá a referência da instância de banco de dados padrão do app.

Web
// init
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 database1 = firebase.database(app2);
Swift
// Get the default database instance for an app
var ref: DatabaseReference!
ref = Database.database().reference()
// Get a secondary database instance by 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];
// Get a secondary database instance by URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"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();

Kotlin

// Get the default database instance for an app
val primary = FirebaseDatabase.getInstance().reference

// Get a secondary database instance by URL
val secondary = FirebaseDatabase
        .getInstance("https://testapp-1234.firebaseio.com").reference

Especificar uma instância ao usar a Firebase CLI

Use a opção --instance para especificar em qual Firebase Realtime Database você quer aplicar um comando da Firebase CLI. 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 (ambos em inglês).