Skalowanie z wieloma bazami danych

Najlepszym sposobem na optymalizację wydajności i skalowanie danych w Firebase Realtime Database jest podzielenie danych między wiele instancji Realtime Database, co jest również nazywane fragmentowaniem bazy danych. Oprócz równoważenia obciążenia i optymalizacji wydajności fragmentowanie zapewnia elastyczność skalowania poza limity, które obowiązują w przypadku poszczególnych instancji bazy danych.

Kiedy dzielić dane na fragmenty

Jeśli używasz Realtime Database i dotyczy Cię któryś z tych scenariuszy, możesz podzielić dane na fragmenty i rozmieścić je w wielu bazach danych:

  • Chcesz przekroczyć limit 200 000 jednoczesnych połączeń, 1000 operacji zapisu na sekundę lub inne limity dla pojedynczej instancji bazy danych.
  • Masz wiele oddzielnych zbiorów danych i chcesz zoptymalizować wydajność (np. aplikacja do obsługi czatu, która obsługuje oddzielne, niezależne grupy użytkowników).
  • Chcesz zrównoważyć obciążenie między wieloma bazami danych, aby zwiększyć czas działania i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak podzielić dane na fragmenty

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

  1. Mapuj dane na wiele baz danych zgodnie z potrzebami aplikacji.
  2. utworzyć wiele 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 wiele baz danych postaraj się spełnić te warunki:

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

Podczas mapowania danych warto zastosować te strategie:

Tworzenie „głównego fragmentu”

Przechowuj mapę sposobu przechowywania danych w instancjach bazy danych. Dzięki temu możesz automatycznie sprawdzić, która instancja bazy danych odpowiada łączącemu się klientowi. Pamiętaj, że może to wymagać więcej zasobów niż bezpośrednie połączenie z konkretną instancją bazy danych, gdy jest to potrzebne.

grupować dane 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 tym przypadku organizacja A i organizacja B nie udostępniają 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ę tylko z bazą danych swojej organizacji, gdy korzystają z aplikacji do obsługi czatu.

Możesz wtedy utworzyć kilka instancji bazy danych z wyprzedzeniem i użyć identyfikatora organizacji, aby zmapować zespół na jego instancję bazy danych. Na przykład organizacja A jest mapowana na bazę 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 sprawdzi się w przypadku 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 Bazy danych i pamięć masowa > Baza danych czasu rzeczywistego > karta Dane.

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

  3. Dostosuj odwołanie 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 danych.

Instancje bazy danych możesz tworzyć i zarządzać nimi w konsoli Firebase lub za pomocą interfejsu REST API do zarządzania bazą danych czasu rzeczywistego.

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

Możesz zarządzać konkretnymi instancjami Realtime Database i wchodzić z nimi w interakcje za pomocą interfejsu wiersza poleceń Firebase.

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

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

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

Flaga --instance jest obsługiwana przez te polecenia:

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

Edytuj i wdrażaj Realtime Database Security Rules dla każdej instancji

Upewnij się, że Realtime Database Security Rules zezwalają na 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ć z konsoli Firebase lub za pomocą interfejsu wiersza poleceń Firebase do wdrażania celów.

  • Aby edytować i wdrażać reguły z konsoli Firebase, wykonaj te czynności:

    1. W konsoli Firebase otwórz Bazy danych i pamięć masowa > Baza danych czasu rzeczywistego > karta 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ł instancji bazy danych (np. foo.rules.json).

    2. Utwórz i zastosuj cele wdrażania, 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, dodając cele wdrażania:

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

      firebase deploy

Pamiętaj, aby zawsze edytować i wdrażać reguły z tego samego miejsca. Wdrażanie reguł z interfejsu wiersza poleceń Firebase zastępuje wszelkie zmiany wprowadzone w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase zastępuje wszelkie ostatnie zmiany wdrożone za pomocą interfejsu wiersza poleceń Firebase.

Łączenie aplikacji z wieloma instancjami bazy danych

Użyj odwołania do bazy danych, aby uzyskać dostęp do danych przechowywanych w dodatkowych instancjach bazy danych. Możesz uzyskać odwołanie do konkretnej instancji bazy danych według adresu URL lub aplikacji. Jeśli nie podasz adresu URL, otrzymasz odwołanie 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];
// Pobierz instancję dodatkowej bazy danych według adresu 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 wieloma 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 tak długo, jak jest to konieczne.

Więcej porad

Jeśli potrzebujesz dodatkowej pomocy przy fragmentowaniu danych w wielu instancjach bazy danych, skontaktuj się z ekspertami Firebase na naszym kanale Slack lub na Stack Overflow.