Лучший способ оптимизировать производительность и масштабировать данные в базе данных реального времени Firebase — разделить данные между несколькими экземплярами базы данных реального времени, что также называется сегментированием базы данных. Разделение дает вам гибкость масштабирования за пределами ограничений , которые применяются к отдельным экземплярам базы данных, в дополнение к балансировке нагрузки и оптимизации производительности.
Когда разбивать ваши данные
Вы можете захотеть разбить данные по нескольким базам данных, если вы используете базу данных реального времени и соответствуете любому из следующих сценариев:
- Вы хотите выйти за пределы 200 000 одновременных подключений, 1 000 операций записи в секунду или любых других ограничений для одного экземпляра базы данных.
- У вас есть несколько дискретных наборов данных и вы хотите оптимизировать производительность (например, приложение для чата, которое обслуживает отдельные независимые группы пользователей).
- Вы хотите сбалансировать нагрузку между несколькими базами данных, чтобы улучшить время безотказной работы и снизить риск перегрузки одного экземпляра базы данных.
Как шардировать ваши данные
Чтобы разделить данные, выполните следующие действия (более подробно они описаны ниже):
- Сопоставьте свои данные с несколькими базами данных в соответствии с конкретными потребностями вашего приложения.
- Создайте несколько экземпляров базы данных.
- Настройте свое приложение, чтобы оно подключалось к экземпляру базы данных реального времени, необходимому для каждого набора данных.
Сопоставьте свои данные
При сопоставлении данных с несколькими базами данных постарайтесь выполнить следующие условия:
- Каждый запрос выполняется только для одного экземпляра базы данных. База данных реального времени не поддерживает запросы между экземплярами базы данных.
- Отсутствие совместного использования или дублирования данных между экземплярами базы данных (или минимальное совместное использование или дублирование).
- Каждый экземпляр приложения в любой момент времени подключается только к одной базе данных.
При сопоставлении данных рассмотрите возможность применения следующих стратегий:
Создайте «мастер-осколок»
Сохраните карту того, как ваши данные хранятся в экземплярах базы данных. Таким образом, вы можете программно найти, какой экземпляр базы данных соответствует подключающемуся клиенту. Имейте в виду, что это может иметь больше накладных расходов, чем прямое подключение к конкретному экземпляру базы данных, который вам нужен, когда вам это нужно.
Данные сегмента по категориям или по клиентам
Храните данные в разрозненных экземплярах базы данных, сгруппированных по пользователям или типам данных. Например, если вы создаете приложение чата, которое обслуживает несколько организаций, вы можете создать экземпляр базы данных для каждой организации и хранить все данные чата в уникальных экземплярах базы данных.
В этом случае организация A и организация B не обмениваются данными, в ваших базах данных нет повторяющихся данных, и вы выполняете запросы только к одному экземпляру базы данных. Кроме того, пользователи в каждой организации подключаются к базе данных своей организации только при использовании приложения чата.
Затем вы можете заранее создать несколько экземпляров базы данных и использовать идентификатор организации для сопоставления команды с ее экземпляром базы данных. Например, организация А сопоставляется с базой данных реального времени А.
То, как вы сопоставляете данные для своего приложения, зависит от вашего конкретного варианта использования, но описанные выше условия и стратегии могут помочь вам определить, что работает с вашими данными.
Создание нескольких экземпляров базы данных реального времени
Если вы пользуетесь тарифным планом Blaze , вы можете создать несколько экземпляров базы данных в одном проекте Firebase.
- В консоли Firebase перейдите на вкладку «Данные» в разделе «Разработка» > «База данных» .
- Выберите «Создать новую базу данных» в меню в разделе «База данных в реальном времени» .
- Настройте ссылку на базу данных и правила безопасности , затем нажмите «Понятно» .
Повторите процесс, чтобы создать столько экземпляров базы данных, сколько вам нужно. Каждый экземпляр базы данных имеет собственный набор правил безопасности базы данных Firebase Realtime, поэтому вы можете точно настроить доступ к своим данным.
Вы можете создавать экземпляры базы данных и управлять ими в консоли Firebase или с помощью REST API управления базами данных в реальном времени .
Отредактируйте и разверните правила безопасности базы данных в реальном времени для каждого экземпляра.
Убедитесь, что ваши правила безопасности базы данных реального времени разрешают соответствующий доступ к каждому экземпляру базы данных в вашем проекте. Каждая база данных имеет собственный набор правил, которые вы можете редактировать и развертывать из консоли Firebase или с помощью интерфейса командной строки Firebase для развертывания целей .
Чтобы изменить и развернуть правила из консоли Firebase, выполните следующие действия:
- Перейдите на вкладку «Правила» в разделе «Разработка» > «База данных» .
- Выберите базу данных, которую хотите изменить, затем измените правила.
Чтобы изменить и развернуть правила из интерфейса командной строки Firebase, выполните следующие действия:
- Измените правила в файлах правил для ваших экземпляров базы данных (например,
foo.rules.json
). - Создайте и примените цели развертывания, чтобы связать базы данных, использующие один и тот же файл правил. Например:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
Обновите файл конфигурации
firebase.json
, указав цели развертывания:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }
Запустите команду развертывания:
firebase deploy
- Измените правила в файлах правил для ваших экземпляров базы данных (например,
Убедитесь, что вы постоянно редактируете и развертываете правила из одного и того же места. Развертывание правил из интерфейса командной строки Firebase переопределяет любые изменения, внесенные вами в консоли Firebase, а редактирование правил непосредственно в консоли Firebase переопределяет все последние изменения, развернутые вами через интерфейс командной строки Firebase.
Подключите свое приложение к нескольким экземплярам базы данных
Используйте ссылку на базу данных для доступа к данным, хранящимся в дополнительных экземплярах базы данных. Вы можете получить ссылку на конкретный экземпляр базы данных по URL-адресу или приложению. Если вы не укажете URL-адрес, вы получите ссылку на экземпляр базы данных приложения по умолчанию.
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);
Быстрый
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()// Получить экземпляр вторичной базы данных по URL-адресу var ref: DatabaseReference! ссылка = База данных.база данных("https://testapp-1234.firebaseio.com").ссылка()
Цель-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];// Получить экземпляр вторичной базы данных по URL-адресу @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[База данных FIRDatabaseWithURL: @"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
Используйте параметр --instance
, чтобы указать, к какой базе данных Firebase Realtime вы хотите применить команду Firebase CLI. Например, используйте следующую команду, чтобы запустить профилировщик для экземпляра базы данных с именем my-example-shard.firebaseio.com
:
firebase database:profile --instance "my-example-shard"
Оптимизируйте соединения в каждой базе данных
Если каждому клиенту необходимо подключаться к нескольким базам данных во время сеанса, вы можете уменьшить количество одновременных подключений к каждому экземпляру базы данных, подключаясь к каждому экземпляру базы данных только до тех пор, пока это необходимо.
Получить больше советов
Если вам нужна дополнительная помощь в разделении данных между несколькими экземплярами базы данных, обратитесь к экспертам Firebase на нашем канале Slack или на Stack Overflow .