Масштабирование с несколькими базами данных

Лучший способ оптимизировать производительность и масштабировать ваши данные в базе данных Firebase Realtime — разделить ваши данные на несколько экземпляров базы данных реального времени, что также называется сегментированием базы данных. Сегментирование дает вам возможность масштабирования за пределами ограничений , применимых к отдельным экземплярам базы данных, а также балансировку нагрузки и оптимизацию производительности.

Когда сегментировать данные

Возможно, вам захочется распределить данные по нескольким базам данных, если вы используете базу данных реального времени и подходите для любого из следующих сценариев:

  • Вы хотите выйти за пределы 200 000 одновременных подключений, 1 000 операций записи в секунду или любого другого ограничения для одного экземпляра базы данных.
  • У вас есть несколько отдельных наборов данных и вы хотите оптимизировать производительность (например, приложение чата, которое обслуживает отдельные, независимые группы пользователей).
  • Вы хотите сбалансировать нагрузку между несколькими базами данных, чтобы увеличить время безотказной работы и снизить риск перегрузки одного экземпляра базы данных.

Как сегментировать ваши данные

Чтобы сегментировать ваши данные, выполните следующие действия (подробнее описанные ниже):

  1. Сопоставьте свои данные с несколькими базами данных в соответствии с конкретными потребностями вашего приложения.
  2. Создайте несколько экземпляров базы данных.
  3. Настройте свое приложение так, чтобы оно подключалось к экземпляру базы данных реального времени, необходимому для каждого набора данных.

Сопоставьте свои данные

При сопоставлении данных с несколькими базами данных постарайтесь удовлетворить следующие условия:

  • Каждый запрос выполняется только к одному экземпляру базы данных. База данных реального времени не поддерживает запросы между экземплярами базы данных.
  • Никакого совместного использования или дублирования данных между экземплярами базы данных (или минимальное совместное использование или дублирование).
  • Каждый экземпляр приложения в любой момент подключается только к одной базе данных.

При сопоставлении данных рассмотрите возможность применения следующих стратегий:

Создайте «главный осколок»

Сохраните карту того, как ваши данные хранятся в разных экземплярах базы данных. Таким образом, вы можете программно определить, какой экземпляр базы данных соответствует подключающемуся клиенту. Имейте в виду, что это может потребовать больше накладных расходов, чем прямое подключение к конкретному экземпляру базы данных, когда вам это нужно.

Данные сегмента по категориям или по клиентам

Храните данные в изолированных экземплярах базы данных, сгруппированных по пользователям или типам данных. Например, если вы создаете приложение чата, которое обслуживает несколько организаций, вы можете создать экземпляр базы данных для каждой организации и хранить все данные чата в уникальных экземплярах базы данных.

В этом случае организации A и B не обмениваются данными, в ваших базах данных нет повторяющихся данных, и вы выполняете запросы только к одному экземпляру базы данных. Кроме того, пользователи в каждой организации подключаются к базе данных своей организации только тогда, когда используют приложение чата.

Затем вы можете заранее создать несколько экземпляров базы данных и использовать идентификатор организации, чтобы сопоставить команду с ее экземпляром базы данных. Например, организация A сопоставляется с базой данных реального времени A.

Способ сопоставления данных для вашего приложения зависит от вашего конкретного варианта использования, но условия и стратегии, изложенные выше, могут помочь вам определить, что лучше всего подходит для ваших данных.

Создайте несколько экземпляров базы данных реального времени.

Если вы используете тарифный план Blaze , вы можете создать до 1000 экземпляров базы данных в одном проекте Firebase.

создайте базу данных в консоли Firebase с помощью контекстного меню в разделе баз данных

  1. В консоли Firebase перейдите на вкладку «Данные» в разделе «Разработка» > «База данных» .
  2. Выберите Создать новую базу данных в меню в разделе База данных реального времени .
  3. Настройте ссылку на базу данных и правила безопасности , затем нажмите «Понятно» .

Повторите процесс, чтобы создать столько экземпляров базы данных, сколько вам нужно. Каждый экземпляр базы данных имеет свой собственный набор правил безопасности базы данных Firebase Realtime, поэтому вы можете точно настроить доступ к своим данным.

Вы можете создавать экземпляры базы данных и управлять ими в консоли Firebase или с помощью REST API Realtime Database Management .

Редактируйте и развертывайте правила безопасности базы данных в реальном времени для каждого экземпляра.

Убедитесь, что ваши правила безопасности базы данных в реальном времени разрешают соответствующий доступ к каждому экземпляру базы данных в вашем проекте. Каждая база данных имеет свой собственный набор правил, которые вы можете редактировать и развертывать из консоли Firebase или использовать интерфейс командной строки Firebase для развертывания целей .

  • Чтобы редактировать и развертывать правила из консоли Firebase, выполните следующие действия:

    1. Перейдите на вкладку «Правила» в разделе «Разработка» > «База данных» .
    2. Выберите базу данных, которую хотите редактировать, затем измените правила.
  • Чтобы редактировать и развертывать правила из Firebase CLI, выполните следующие действия:

    1. Измените правила в файлах правил для экземпляров вашей базы данных (например, foo.rules.json ).
    2. Создайте и примените цели развертывания, чтобы связать базы данных, использующие один и тот же файл правил. Например:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. Обновите файл конфигурации firebase.json , указав цели развертывания:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Запустите команду развертывания:

      firebase deploy

Убедитесь, что вы постоянно редактируете и развертываете правила из одного и того же места. Развертывание правил из интерфейса командной строки Firebase отменяет любые изменения, внесенные вами в консоли Firebase, а редактирование правил непосредственно в консоли Firebase отменяет любые недавние изменения, которые вы развернули через интерфейс командной строки Firebase.

Подключите свое приложение к нескольким экземплярам базы данных

Используйте ссылку на базу данных для доступа к данным, хранящимся в экземплярах базы данных-получателя. Вы можете получить ссылку на конкретный экземпляр базы данных по URL-адресу или приложению. Если вы не укажете URL-адрес, вы получите ссылку на экземпляр базы данных приложения по умолчанию.

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);
Быстрый
Примечание. Этот продукт Firebase недоступен для цели App Clip.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Получение вторичного экземпляра базы данных по URL-адресу var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Цель-C
Примечание. Этот продукт Firebase недоступен для цели App Clip.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Получение вторичного экземпляра базы данных по URL-адресу @property (strong, неатомарный) FIRDatabaseReference *ref; self.ref = [[FIRDatabase DatabaseWithURL:@"https://testapp-1234.firebaseio.com"] ссылка];

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

Укажите экземпляр при использовании Firebase CLI

Используйте параметр --instance , чтобы указать, к какой базе данных Firebase Realtime вы хотите применить команду Firebase CLI. Например, используйте следующую команду для запуска профилировщика для экземпляра базы данных с именем my-example-shard.firebaseio.com :

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

Оптимизируйте соединения в каждой базе данных

Если каждому клиенту необходимо подключиться к нескольким базам данных во время сеанса, вы можете уменьшить количество одновременных подключений к каждому экземпляру базы данных, подключаясь к каждому экземпляру базы данных только до тех пор, пока это необходимо.

Получить больше советов

Если вам нужна дополнительная помощь в распределении данных по нескольким экземплярам базы данных, обратитесь к экспертам Firebase на нашем канале Slack или на Stack Overflow .