Skalowanie z wieloma bazami danych

Najlepszym sposobem na optymalizację wydajności i skalowanie danych w Firebase Realtime Database jest podzielenie danych na kilka instancji Realtime Database, czyli tzw. fragmentowanie bazy danych. Fragmentowanie umożliwia skalowanie poza limity obowiązujące w przypadku pojedynczych instancji bazy danych, a także równoważenie obciążenia i optymalizację wydajności.

Kiedy fragmentować dane

Fragmentowanie danych na kilka baz danych może być przydatne, jeśli korzystasz z Realtime Database i spełniasz któryś z tych warunków:

  • Chcesz skalować poza limit 200 tys. jednoczesnych połączeń, 1 tys. operacji zapisu na sekundę lub inne limity dotyczące pojedynczej instancji bazy danych.
  • Masz kilka oddzielnych zbiorów danych i chcesz zoptymalizować wydajność (np. w przypadku aplikacji do czatu, która obsługuje oddzielne, niezależne grupy użytkowników).
  • Chcesz zrównoważyć obciążenie między kilkoma bazami danych, aby zwiększyć czas działania i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak fragmentować dane

Aby fragmentować dane, wykonaj te czynności (opisane bardziej szczegółowo poniżej):

  1. Zmapuj dane na kilka baz danych zgodnie z konkretnymi potrzebami aplikacji.
  2. Utwórz kilka instancji bazy danych.
  3. Skonfiguruj aplikację tak, aby łączyła się z instancją Realtime Database niezbędną dla każdego zbioru danych.

Mapowanie danych

Podczas mapowania danych na kilka baz danych staraj się spełnić te warunki:

  • Każde zapytanie jest wykonywane tylko w jednej instancji bazy danych. Realtime Database nie obsługuje zapytań w wielu instancjach bazy danych.
  • Brak udostępniania lub duplikowania danych w instancjach bazy danych (albo minimalne udostępnianie lub duplikowanie).
  • Każda instancja aplikacji w danym momencie łączy się tylko z jedną bazą danych.

Podczas mapowania danych rozważ zastosowanie tych strategii:

Utwórz „fragment główny”

Przechowuj mapę sposobu przechowywania danych w instancjach bazy danych. Dzięki temu możesz programowo wyszukiwać, która instancja bazy danych odpowiada łączącemu się klientowi. Pamiętaj, że może to wiązać się z większym obciążeniem niż bezpośrednie łączenie się z konkretną instancją bazy danych, gdy jest to potrzebne.

Grupowanie danych według kategorii lub klientów

Przechowuj dane w odizolowanych instancjach bazy danych pogrupowanych według użytkownika lub typu danych. Jeśli na przykład tworzysz aplikację do czatu, która obsługuje wiele organizacji, możesz utworzyć instancję bazy danych dla każdej organizacji i przechowywać wszystkie dane czatu w unikalnych instancjach bazy danych.

W takim przypadku organizacja A i organizacja B nie udostępniają sobie danych, w bazach danych nie ma zduplikowanych danych, a zapytania są wykonywane tylko w jednej instancji bazy danych. Dodatkowo użytkownicy w każdej organizacji łączą się z bazą danych swojej organizacji tylko wtedy, gdy korzystają z aplikacji do czatu.

Możesz z wyprzedzeniem utworzyć kilka instancji bazy danych i użyć identyfikatora organizacji, aby przypisać zespół do jego instancji bazy danych. Na przykład organizacja A jest przypisana do Bazy danych czasu rzeczywistego A.

Sposób mapowania danych w aplikacji zależy od konkretnego przypadku użycia, ale opisane powyżej warunki i strategie mogą pomóc Ci określić, co będzie najlepsze dla Twoich danych.

Tworzenie wielu instancji Realtime Database

Jeśli korzystasz z abonamentu Blaze, możesz utworzyć do 1000 instancji bazy danych w tym samym projekcie w Firebase.

utworzyć bazę danych w konsoli Firebase za pomocą menu kontekstowego w sekcji baz danych;

  1. W konsoli Firebase otwórz kartę Bazy danych i pamięć masowa > Baza danych czasu rzeczywistego > Dane.

  2. W menu wybierz Utwórz nową bazę danych.

  3. Dostosuj odniesienie do bazy danych i Security Rules, a następnie kliknij OK.

Powtórz ten proces, aby utworzyć tyle instancji bazy danych, ile potrzebujesz. Każda instancja bazy danych ma własny zestaw Firebase Realtime Database Security Rules, dzięki czemu możesz precyzyjnie dostosować dostęp do swoich danych.

Instancje bazy danych możesz tworzyć i nimi zarządzać w konsoli Firebase lub za pomocą interfejsu Realtime Database Management REST API.

Zarządzanie konkretnymi instancjami za pomocą interfejsu wiersza poleceń i interakcja z nimi

Za pomocą interfejsu wiersza poleceń Firebase możesz zarządzać konkretnymi instancjami Realtime Database i wchodzić z nimi w interakcję.

Domyślnie polecenia interfejsu wiersza poleceń wchodzą w interakcję z domyślną instancją bazy danych. Możesz jednak wchodzić w interakcję z inną niż domyślna instancją bazy danych, używając flagi --instance DATABASE_NAME.

Aby na przykład uruchomić profiler dla instancji bazy danych o nazwie my-example-shard.firebaseio.com, użyj tego polecenia:

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

Te polecenia obsługują flagę --instance:

  • firebase database:get
  • firebase database:profile
  • firebase database:push
  • firebase database:remove
  • firebase database:set
  • firebase database:update

Edytowanie i wdrażanie Realtime Database Security Rules dla każdej instancji

Upewnij się, że Realtime Database Security Rules umożliwiają odpowiedni dostęp do każdej instancji bazy danych w projekcie. Każda baza danych ma własny zestaw reguł, które możesz edytować i wdrażać w konsoli Firebase lub za pomocą Firebase interfejsu wiersza poleceń, aby wdrożyć elementy docelowe.

  • Aby edytować i wdrażać reguły w konsoli Firebase:

    1. W konsoli Firebase otwórz kartę Bazy danych i pamięć masowa > Baza danych czasu rzeczywistego > Reguły.

    2. Wybierz bazę danych, którą chcesz edytować, a następnie zmodyfikuj reguły.

  • Aby edytować i wdrażać reguły za pomocą interfejsu wiersza poleceń Firebase:

    1. Zmodyfikuj reguły w plikach reguł dla instancji bazy danych (np. foo.rules.json).

    2. Utwórz i zastosuj cele wdrożenia, aby powiązać bazy danych, które używają tego samego pliku reguł. Przykład:

      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3

    3. Zaktualizuj plik konfiguracji firebase.json o cele wdrożenia:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. Uruchom polecenie wdrożenia:

      firebase deploy

Pamiętaj, aby edytować i wdrażać reguły zawsze w tym samym miejscu. Wdrożenie reguł za pomocą interfejsu wiersza poleceń Firebase spowoduje zastąpienie wszelkich zmian wprowadzonych w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase spowoduje zastąpienie wszelkich ostatnich zmian wdrożonych za pomocą interfejsu wiersza poleceń Firebase.

Łączenie aplikacji z wieloma instancjami bazy danych

Aby uzyskać dostęp do danych przechowywanych w dodatkowych instancjach bazy danych, użyj odniesienia do bazy danych. Odniesienie do konkretnej instancji bazy danych możesz uzyskać za pomocą adresu URL lub aplikacji. Jeśli nie podasz adresu URL, otrzymasz odniesienie do domyślnej instancji bazy danych aplikacji.

Web

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

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);
Swift
Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
// 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
Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
// 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];

Kotlin

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

Optymalizacja połączeń w każdej bazie danych

Jeśli każdy klient musi połączyć się z kilkoma bazami danych podczas sesji, możesz zmniejszyć liczbę jednoczesnych połączeń z każdą instancją bazy danych, łącząc się z każdą instancją bazy danych tylko na czas niezbędny do wykonania zadania.

Uzyskiwanie dodatkowych porad

Jeśli potrzebujesz dodatkowej pomocy w zakresie fragmentowania danych na kilka instancji bazy danych, skontaktuj się z ekspertami Firebase na naszym kanale na Slacku lub na Stack Overflow.