Skalowanie z wieloma bazami danych

Najlepszym sposobem na optymalizację wydajności i skalowanie danych w Bazie danych czasu rzeczywistego Firebase jest podzielenie danych na wiele instancji Bazy danych czasu rzeczywistego, nazywane też fragmentacją bazy danych. Fragmentacja zapewnia elastyczność, która wykracza poza limity, które mają zastosowanie do poszczególnych instancji baz danych, oprócz równoważenia obciążenia i optymalizacji wydajności.

Kiedy segmentować dane

Podziel dane na kilka baz danych, jeśli korzystasz z Bazy danych czasu rzeczywistego i pasują do tych scenariuszy:

  • Chcesz przekroczyć limit 200 tys. jednoczesnych połączeń, 1000 operacji zapisu na sekundę lub dowolne inne limity dla pojedynczej instancji bazy danych.
  • Masz wiele odrębnych zbiorów danych i chcesz zoptymalizować wydajność (np. aplikację do obsługi czatu, która obsługuje oddzielne, niezależne grupy użytkowników).
  • Chcesz zrównoważyć obciążenie wielu baz danych, aby skrócić czas działania i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Fragmentowanie danych

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

  1. Zmapuj dane na wiele baz danych zgodnie ze specyficznymi potrzebami aplikacji.
  2. Utwórz wiele instancji bazy danych.
  3. Skonfiguruj aplikację tak, aby łączyła się z instancją Bazy danych czasu rzeczywistego, która jest niezbędna dla każdego zbioru danych.

Mapowanie danych

Jeśli mapujesz dane na wiele baz danych, spróbuj spełnić te warunki:

  • Każde zapytanie jest wykonywane tylko w jednej instancji bazy danych. Baza danych czasu rzeczywistego nie obsługuje zapytań dotyczących instancji bazy danych.
  • Brak możliwości udostępniania i powielania danych w instancjach bazy danych (albo minimalizacji możliwości udostępniania lub duplikowania).
  • Każda instancja aplikacji łączy się w danym momencie tylko z 1 bazą danych.

Podczas mapowania danych możesz zastosować następujące strategie:

Utwórz „fragment nadrzędny”

przechowywać mapę sposobu przechowywania danych w instancjach baz danych; Dzięki temu możesz programowo wyszukiwać, która instancja bazy danych odpowiada połączonemu klientowi. Pamiętaj, że może to mieć większe nakłady niż bezpośrednie łączenie się z konkretną instancją bazy danych w odpowiednim momencie.

Grupowanie danych według kategorii lub klienta

Przechowuj dane w odizolowanych instancjach bazy danych, pogrupowane według użytkownika lub typu danych. Jeśli na przykład utworzysz aplikację do obsługi 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 i w bazach danych nie ma żadnych duplikatów danych, a zapytania wysyłane są tylko do jednej instancji bazy danych. Poza tym użytkownicy w każdej organizacji łączą się z bazą danych tylko wtedy, gdy używają aplikacji do obsługi czatu.

Następnie możesz utworzyć z wyprzedzeniem kilka instancji bazy danych i użyć identyfikatora organizacji do zmapowania zespołu na instancję bazy danych. Na przykład organizacja A jest mapowana na Bazę danych czasu rzeczywistego A.

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

Utwórz wiele instancji Bazy danych czasu rzeczywistego

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

Utwórz bazę danych w konsoli Firebase za pomocą menu kontekstowego w sekcji baz danych.

  1. W konsoli Firebase otwórz kartę Dane w sekcji Programowanie > Baza danych.
  2. W menu w sekcji Baza danych czasu rzeczywistego wybierz Utwórz nową bazę danych.
  3. Dostosuj Informacje o bazie danych i Reguły zabezpieczeń, a potem kliknij OK.

Powtórz ten proces, aby utworzyć tyle instancji bazy danych, ile potrzebujesz. Każda instancja bazy danych ma własny zestaw reguł zabezpieczeń bazy danych czasu rzeczywistego Firebase, możesz więc dostosować dostęp do swoich danych.

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

Edytowanie i wdrażanie reguł zabezpieczeń bazy danych czasu rzeczywistego dla każdej instancji

Upewnij się, że reguły zabezpieczeń bazy danych czasu rzeczywistego 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ą interfejsu wiersza poleceń Firebase do wdrażania celów.

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

    1. Otwórz kartę Reguły w sekcji Programowanie > Baza danych.
    2. Wybierz bazę danych, którą chcesz edytować, a następnie zmodyfikuj reguły.
  • Aby edytować i wdrożyć reguły z poziomu wiersza poleceń Firebase, wykonaj te czynności:

    1. Zmodyfikuj reguły w plikach reguł instancji bazy danych (np. foo.rules.json).
    2. Utwórz i zastosuj cele wdrożenia, aby powiązać bazy danych, które korzystają z 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 przy użyciu celów 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 regularnie edytować i wdrażać reguły w tym samym miejscu. Wdrożenie reguł z interfejsu wiersza poleceń Firebase powoduje zastąpienie wszystkich zmian wprowadzonych w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase powoduje zastąpienie wszystkich ostatnich zmian wprowadzonych za pomocą tego interfejsu.

Łą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. Odniesienie do konkretnej instancji bazy danych można uzyskać za pomocą 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 miejscu docelowym klipu aplikacji.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Pobierz dodatkową instancję bazy danych za pomocą adresu 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 miejscu docelowym klipu aplikacji.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Pobierz dodatkową instancję bazy danych przy użyciu adresu URL @property (silne, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];

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

Określ instancję, gdy używasz interfejsu wiersza poleceń Firebase

Użyj opcji --instance, aby określić, do której Bazy danych czasu rzeczywistego Firebase chcesz zastosować polecenie interfejsu wiersza poleceń Firebase. Jeśli na przykład chcesz uruchomić program profilujący dla instancji bazy danych o nazwie my-example-shard.firebaseio.com, użyj tego polecenia:

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

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

Jeśli w trakcie sesji każdy klient musi łączyć się z wieloma bazami danych, możesz zmniejszyć liczbę jednoczesnych połączeń z każdą instancją bazy danych, łącząc się z każdą z nich tylko na tak długo, jak to konieczne.

Więcej porad

Jeśli potrzebujesz pomocy we fragmentacji danych w wielu instancjach bazy danych, skontaktuj się z ekspertami Firebase przez kanał Slack lub Stack Overflow.