Skalowanie z wieloma bazami danych

Najlepszy sposób na optymalizację skuteczności i skalowanie danych w usłudze Firebase Realtime Database jest podział danych na kilka instancji Realtime Database, nazywanych również fragmentacji bazy danych. Fragmentacja zapewnia elastyczność, która umożliwia skalowanie poza limity mające zastosowanie do poszczególnych baz danych równoważenie obciążenia i optymalizację wydajności.

Kiedy należy dzielić dane na fragmenty

Podzielenie danych na wiele baz danych może być przydatne, jeśli korzystasz Realtime Database i pasują do dowolnego z tych scenariuszy:

  • chcesz przeskalować poza limit 200 000 jednoczesnych połączeń, 1000 operacji zapisu na sekundę lub dowolna inna limity pojedynczej instancji bazy danych.
  • Masz wiele odrębnych zbiorów danych i chcesz zoptymalizować skuteczność (np. komunikatora, który obsługuje osobne, niezależne grupy użytkowników).
  • Chcesz wyrównać obciążenie w wielu bazach danych, aby zwiększyć czas działania i zmniejszyć ryzyko przeciążenia pojedynczej instancji bazy danych.

Jak dzielić dane

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

  1. Mapuj dane na wiele baz danych odpowiednio do potrzeb aplikacji.
  2. tworzyć wiele instancji bazy danych.
  3. Skonfiguruj aplikację tak, aby łączyła się z niezbędną instancją Realtime Database dla każdego zbioru danych.

Mapowanie danych

Gdy mapujesz dane na wiele baz danych, spróbuj spełnić kryteria następujące warunki:

  • Każde zapytanie jest wykonywane tylko w jednym wystąpieniu bazy danych. Realtime Database nie obsługuje zapytań w przypadku instancji bazy danych.
  • Brak udostępniania ani powielania danych w różnych instancjach bazy danych (lub minimalne udostępnianie lub powielanie).
  • Każda instancja aplikacji jest w danym momencie połączona tylko z jedną bazą danych.

Podczas mapowania danych możesz zastosować te strategie:

Utwórz „fragment główny”

przechowywać mapę sposobu przechowywania danych w różnych instancjach bazy danych; Dzięki temu możesz automatycznie wyszukać bazę danych instancji odpowiada łączącemu klientowi. Pamiętaj, że może to wymagać więcej zasobów niż bezpośrednie połączenie z poszczególnymi instancjami bazy danych, których potrzebujesz.

Grupowanie danych według kategorii lub klientów

przechowywać dane w oddzielonych od siebie instancjach baz 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 unikajnych instancjach baz danych.

W tym przypadku organizacja A i organizacja B nie udostępniają danych, więc powielonych danych w bazach danych, a zapytania wykonujesz tylko w odniesieniu do z jedną instancją bazy danych. Dodatkowo użytkownicy każdej organizacji łączą się z bazą danych organizacji tylko wtedy, gdy korzystają z aplikacji do czatu.

Możesz wtedy utworzyć kilka instancji bazy danych z wyprzedzeniem i użyć identyfikatora organizacji, aby przypisać zespół do jego instancji bazy danych. Na przykład organizacja A jest mapowana na bazę danych czatu w czasie rzeczywistym A.

Sposób mapowania danych aplikacji zależy od konkretnego przypadku użycia, opisane powyżej warunki i strategie pomogą Ci określić, i skalowalnych danych.

Utwórz wiele instancji Realtime Database

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

utwórz bazę danych w <span class=Konsola Firebase z menu kontekstowym w sekcji Bazy danych />

  1. W konsoli Firebase kliknij kartę Dane w sekcji Tworzenie > Baza danych.
  2. W menu w sekcji Realtime Database wybierz Utwórz nową bazę danych.
  3. Spersonalizuj odniesienie do bazy danychreguły zabezpieczeń, a potem kliknij Gotowe.

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

Istniejące instancje bazy danych możesz tworzyć i zarządzać nimi w konsoli Firebase lub za pomocą interfejsu API REST do zarządzania bazą danych w czasie rzeczywistym.

Edytuj i wdróż Realtime Database Security Rules dla każdej instancji

Upewnij się, że Twoje uprawnienia Realtime Database Security Rules zapewniają odpowiedni dostęp do każdego wystąpienia bazy danych w projekcie. Każda baza danych ma własny zestaw reguł, którą możesz edytować i wdrożyć za pomocą konsoli Firebase lub Interfejs wiersza poleceń Firebase do wdrażania celów.

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

    1. Przejdź do Karta Reguły w sekcji Programowanie > Baza danych.
    2. Wybierz bazę danych, którą chcesz edytować, a potem zmień reguły.
  • Aby edytować i wdrażać reguły z poziomu interfejsu wiersza poleceń Firebase:

    1. Zmień reguły w plikach reguł w przypadku instancji bazy danych (np. foo.rules.json).
    2. Utwórz i zastosuj cele wdrażania, aby powiązać bazy danych, które korzystają 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. Umieść w pliku konfiguracji firebase.json miejsca docelowe 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 konsekwentnie edytować i wdrażać reguły w tym samym miejscu. Wdrażam z interfejsu wiersza poleceń Firebase zastępuje wszystkie zmiany wprowadzone w Firebase konsola i edytowanie reguł bezpośrednio w konsoli Firebase zastępuje wszystkie 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. Odwołanie do konkretnej instancji bazy danych możesz znaleźć według adresu URL lub aplikacji. Jeśli nie podasz adresu URL, otrzymasz odniesienie do domyślnej instancji bazy danych.

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 wycinka aplikacji.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Pobieranie instancji bazy danych pomocniczej 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 wycinka aplikacji.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// Pobranie dodatkowej instancji bazy danych z adresu URL @property (silna, nieatomowa) 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();

Jeśli używasz interfejsu wiersza poleceń Firebase, oznacz instancję

Użyj opcji --instance, aby określić, do której Firebase Realtime Database ma zostać zastosowane polecenie wiersza poleceń Firebase. Na przykład do uruchomienia możesz użyć tego polecenia program profilujący 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 każdy klient musi połączyć się z wieloma bazami danych podczas sesji, możesz zmniejsz liczbę jednoczesnych połączeń z każdą instancją bazy danych o łączyć się z każdą instancją bazy danych tylko tak długo, jak jest to konieczne.

Więcej wskazówek

Jeśli potrzebujesz pomocy w dzieleniu danych na wiele instancji bazy danych, skontaktuj się z ekspertami Firebase na Kanał na Slacku lub na stronie Stack Overflow.