Skalowanie z wieloma bazami danych

Najlepszym sposobem optymalizacji wydajności i skalowania danych w bazie danych Firebase Realtime Database jest podzielenie danych pomiędzy wiele instancji bazy danych czasu rzeczywistego, co jest również znane jako fragmentowanie bazy danych. Sharding zapewnia elastyczność skalowania poza limity obowiązujące dla poszczególnych instancji bazy danych, a także równoważenie obciążenia i optymalizację wydajności.

Kiedy należy podzielić dane

Jeśli korzystasz z bazy danych czasu rzeczywistego i pasujesz do dowolnego z następujących scenariuszy, możesz chcieć podzielić dane na wiele baz danych:

  • Chcesz skalować poza limit 200 000 jednoczesnych połączeń, 1000 operacji zapisu na sekundę lub dowolny inny limit dla pojedynczej instancji bazy danych.
  • Masz wiele odrębnych zestawów danych i chcesz zoptymalizować wydajność (na przykład aplikacja do czatowania obsługująca oddzielne, niezależne grupy użytkowników).
  • Chcesz zrównoważyć obciążenie wielu baz danych, aby skrócić czas pracy i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak podzielić swoje dane

Aby podzielić dane, wykonaj następujące kroki (opisane bardziej szczegółowo poniżej):

  1. Mapuj dane do wielu baz danych zgodnie ze specyficznymi potrzebami aplikacji.
  2. Utwórz wiele instancji bazy danych.
  3. Skonfiguruj aplikację tak, aby łączyła się z instancją Realtime Database niezbędną dla każdego zestawu danych.

Mapuj swoje dane

Podczas mapowania danych do wielu baz danych spróbuj spełnić następujące warunki:

  • Każde zapytanie działa tylko względem jednej instancji bazy danych. Baza danych czasu rzeczywistego nie obsługuje zapytań między instancjami bazy danych.
  • Żadnego udostępniania ani duplikowania danych pomiędzy instancjami baz danych (lub minimalnego udostępniania lub duplikowania).
  • Każda instancja aplikacji łączy się w danym momencie tylko z jedną bazą danych.

Podczas mapowania danych rozważ zastosowanie następujących strategii:

Utwórz „odłamek główny”

Przechowuj mapę sposobu przechowywania danych w instancjach bazy danych. W ten sposób możesz programowo sprawdzić, która instancja bazy danych odpowiada łączącemu się klientowi. Należy pamiętać, że może to wiązać się z większym obciążeniem niż bezpośrednie połączenie z konkretną instancją bazy danych, której potrzebujesz, kiedy jej potrzebujesz.

Pogrupuj dane według kategorii lub według klienta

Przechowuj dane w izolowanych instancjach bazy danych, pogrupowanych według użytkownika lub typu danych. Na przykład, jeśli tworzysz aplikację do czatowania, 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 organizacje A i B nie udostępniają danych, w Twoich bazach danych nie ma żadnych zduplikowanych danych, a zapytania wykonujesz tylko względem jednej instancji bazy danych. Ponadto użytkownicy w każdej organizacji łączą się z bazą danych swojej organizacji tylko wtedy, gdy korzystają z aplikacji do czatowania.

Następnie możesz wcześniej utworzyć kilka instancji bazy danych i użyć identyfikatora organizacji do zmapowania zespołu na jej instancję bazy danych. Na przykład organizacja A mapuje do bazy danych czasu rzeczywistego A.

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

Utwórz wiele instancji bazy danych czasu rzeczywistego

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

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

  1. W konsoli Firebase przejdź do zakładki Dane w sekcji Programowanie > Baza danych .
  2. Z menu w sekcji Baza danych czasu rzeczywistego wybierz opcję Utwórz nową bazę danych .
  3. Dostosuj odwołanie do bazy danych i reguły zabezpieczeń , a następnie kliknij OK .

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

Możesz tworzyć instancje baz danych i zarządzać nimi w konsoli Firebase lub za pomocą interfejsu API REST zarządzania bazami danych w czasie rzeczywistym .

Edytuj i wdrażaj reguły bezpieczeństwa bazy danych w czasie rzeczywistym dla każdej instancji

Upewnij się, że reguły bezpieczeństwa bazy danych czasu rzeczywistego umożliwiają odpowiedni dostęp do każdej instancji bazy danych w projekcie. Każda baza danych ma swój własny zestaw reguł, które można edytować i wdrażać z poziomu konsoli Firebase lub przy użyciu interfejsu wiersza polecenia Firebase do wdrażania obiektów docelowych .

  • Aby edytować i wdrożyć reguły z konsoli Firebase, wykonaj następujące kroki:

    1. Przejdź do zakładki 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 interfejsu wiersza polecenia Firebase, wykonaj następujące kroki:

    1. Zmodyfikuj reguły w plikach reguł dla instancji bazy danych (na przykład foo.rules.json ).
    2. Utwórz i zastosuj cele wdrażania, aby skojarzyć bazy danych korzystające z tego samego pliku reguł. Na 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 konfiguracyjny firebase.json , dodając cele wdrożenia:

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

      firebase deploy

Pamiętaj, aby konsekwentnie edytować i wdrażać reguły z tego samego miejsca. Wdrożenie reguł z poziomu interfejsu wiersza polecenia Firebase zastępuje wszelkie zmiany wprowadzone w konsoli Firebase, a edytowanie reguł bezpośrednio w konsoli Firebase zastępuje wszelkie ostatnie zmiany wprowadzone za pomocą interfejsu wiersza polecenia Firebase.

Połącz swoją aplikację 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ć referencje dla konkretnej instancji bazy danych według adresu URL lub aplikacji. Jeśli nie określisz adresu URL, otrzymasz odniesienie do domyślnej instancji bazy danych aplikacji.

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);
Szybki
Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Pobierz instancję dodatkowej bazy danych według adresu URL var ref: DatabaseReference! ref = Baza danych.database("https://testapp-1234.firebaseio.com").reference()
Cel C
Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// 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 (silny, nieatomowy) FIRDatabaseReference *ref; self.ref = [[FIRDatabase DatabaseWithURL:@"https://testapp-1234.firebaseio.com"] odniesienie];

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ę podczas korzystania z interfejsu wiersza polecenia Firebase

Użyj opcji --instance , aby określić, do której bazy danych Firebase Realtime chcesz zastosować polecenie CLI Firebase. Na przykład użyj następującego polecenia, aby uruchomić profiler dla instancji bazy danych o nazwie my-example-shard.firebaseio.com :

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

Zoptymalizuj połączenia w każdej bazie danych

Jeśli podczas sesji każdy klient musi połączyć się z wieloma bazami danych, można 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.

Uzyskaj więcej porad

Jeśli potrzebujesz dodatkowej pomocy w dzieleniu danych między wieloma instancjami baz danych, skontaktuj się z ekspertami Firebase na naszym kanale Slack lub na Stack Overflow .